关于socket通讯问题????????(100分)

  • 主题发起人 dongliang110
  • 开始时间
D

dongliang110

Unregistered / Unconfirmed
GUEST, unregistred user!
众位大侠,小弟有一个问题,我正在做一个数据传输的程序,用delphi5中带的ClientSocket和
SErvversocket控件,服务器端采用多线程方式,用ONGetThread事件,但是我在传输过程中,当服务器
接受到数据后要求马上给客户端回应一个消息,比如:ok。我知道服务器端应怎样写,客户端应在哪
个事件中接收。最好能给个例子。
 
怎么每人回答我的问题。
 
在onRead里面写
socket.raadbuff or socket.readstream
 
在客户端的onread的事件中。
源代码:
procedure tform1.clientread(sender:tobject;socket:tcustomwinsocket);
var
re:pchar;
sbuf:string;
relong:integer;
begin
re:=nil;
while socket.receivelength>0 do
begin
re:=allocmem(socket.receivelength);
try
relong:=socket.receivelength;
socket.receivebuf(re^,socket.receivelength);
sbuf:=strpas(re);
setlength(sbuf,relong);
finally
freemem(re);
end;
memo1.lines.add(sbuf);
end;
end;
 
还要补充一些:
在上面的过程中,也就是OnRead的事件中可以不用缓冲区接受的方法,还有更简单的方法,
可以用socket.ReceiveText,它得到的就是收到的字符串。
 
我试了,在服务器端用线程写,客户端是不触发onRead事件的。
我的服务器端想这么写:
procedure TFrmServer.ServerSocket1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
SocketThread:=TSvrSocketThread.Create(false,ClientSocket);
end;
在TSvrSocketThread线程中接收处理数据。
 
倒~~~~~~~~~~~~~~~~
你服务器用阻塞式管客户端什么事,难道大部分的WEB服务器是UNIX下的,所有的
IE都应该也是UNIX下用?只要都是用TCP协议,客户端和服务器都是独立部分,
不用考虑什么服务器是组塞,客户端一定用组塞,其他的不行,
我看你完全没有搞清楚什么是TCP,
 
我试了,在服务器端用线程写,客户端是不触发onRead事件的。
我的服务器端想这么写:
procedure TFrmServer.ServerSocket1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
SocketThread:=TSvrSocketThread.Create(false,ClientSocket);
end;
在TSvrSocketThread线程中接收处理数据。
 
奇怪了,只要你的ClientSocket是非组塞的,应该在 OnRead里可以收到数据
 
我认为也是行的但是我怎么也不能收到。下面是我的服务端代码:
procedure TFrmServer.ServerSocket1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
var ServerThread:TSvrSocketThread;
begin

ServerThread:=TSvrSocketThread.Create(false,ClientSocket);
ServerThread.ReturnOk;
SocketThread:=ServerThread;
ServerThread.Resume;
end;


procedure TSvrSocketThread.ClientExecute;
Var
s : String;
LSend : array [0..8019] of char;
begin
ClientSocket.ReceiveBuf(LSend,sizeof(LSend));
AddLog('收到文件:'+LSend);
LSend:='ok';
ClientSocket.SendBuf(LSend,sizeof(LSend));
AddLog(LSend);
end;

客户端代码: 我测试不触发onread事件。
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var dd:array [0..8196] of char;
begin
Socket.ReceiveBuf(dd,sizeof(dd));
Psetlog(dd);
end;
 
Write an OnRead event handler to read from the socket connection.
If the socket is a blocking socket,
use a TWinSocketStream object to read from the connection.
Otherwise, use the methods of the Socket parameter to perform the actual reading.
 
TO:macor
他的服务器是组塞的,但是客户端是非住塞的
 
是不是ip地址和端口号不对,先试试两边能不能连上?
连上就没问题了
 
什么是阻塞和非阻塞方式呢?有什么不同?都是什么用法??谢谢指教!!
 
如果真是这样,根本就不可能发生的事情。
我觉得还是你的程序有问题。
 
顶部