socket多线程 烦烦烦!(50分)

  • 主题发起人 主题发起人 hly
  • 开始时间 开始时间
H

hly

Unregistered / Unconfirmed
GUEST, unregistred user!
clientsocket是非阻塞方式,serversocket.servertype=stthreadblocking
当clientsocket.socket.sendtext("ok")
因为服务器端是租塞方式,所以serversocket不会响应异步事件onclientread
和onclientwrite事件。我照书上说的创建了一个线程类。
问题1:我什么时候创建这个线程的实列
问题2:当客户端发送一个“ok”,我的服务器端的程序在那个地方接收。
 
阻塞式服务器的工作机制和非阻塞是不一样的,所以用一下方式
procedure TForm1.ServerSocketGetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
SocketThread := TSockThread.Create(false,ClientSocket);
end;
 
能给我一个简单的列子吗?
honglueyihzg@sina.com
 
为什么我的程序执行到这句就抱错呢

TWinSocketStream *pStream=new TWinSocketStream(ClientSocket->Socket,6000);
 
我的问题正好和你的相反:
clientsocket阻塞方式(在线程中创建)
因为客户端在线程中只能用阻塞方式,所以clientsocket不会响应异步事件onclientread
和onclientwrite事件。
问题:当服务端返回一个“ok”,我的客户端的程序在那个地方接收。
真是繁死我了!!!1
 
阻塞方式的话,你想什么时候收就什么时候收。
换句话说,没有事件,你要主动接收数据。
直接调用Socket.ReadBuf()就行了,如果没有数据,就会等待,读到数据后才返回。
可以使用TWinSocketStream.WaitForData(),等待一定时间,读不到的话认为是超时。
 
//@@@TServerThread.ClientExecute;
//@@@当SendThread执行Execute时,这里相应的执行ClientExecute
procedure TServerThread.ClientExecute;
var
Buffer : array[0..299] of Char;
Number : Integer;
begin
while (not Terminated) and (Socket.Connected)do
begin
try
if SocketStream.WaitForData(2000) then
begin
FillChar(Buffer, SizeOf(Buffer), 0);
Number := SocketStream.Read(Buffer, SizeOf(Buffer));
if Number < SizeOf(Buffer) then
begin
Stream.Write(Buffer, Number);
Synchronize(CallOnCommandReceive);
end
else
begin
Stream.Write(Buffer, Number);
end;
end;
except //当连接断开时可能有except
Socket.Close;
Terminate;
//HandleException;
end;
end;
end;

//ServerSocket的OnGetThread事件代码
procedure TMainForm.JavaApplet_ServerSocketGetThread(Sender : TObject;
ClientSocket : TServerClientWinSocket;
var SocketThread : TServerClientThread);
var
ServerThread : TServerThread;
begin
ServerThread := TServerThread.Create(true, ClientSocket);
ServerThread.OnCommandReceive := JavaApplet_OnCommandReceive;
SocketThread := ServerThread;
ServerThread.Resume;
end;
摘自我的程序,调试通过
 
后退
顶部