关于Socket服务器关闭再运行后,客户端重新连接的问题。
服务器端,可动态的创建多个线程,每个线程对应着一个客户端,每个线程又可以创建一个线程,用来接收和发送数据。
客户端,有一个线程,来接收数据。
接收数据的时候没有问题。但是服务器关闭后,再打开,客户端重新连接的时候,服务器接收函数,总是超时。而且服务器端线程数目一直在上涨。这是什么情况?
客户端重连代码:
RecvCount := recv(FServerSocket, FCilentThread.FRecvInfo.ClientRecvData, FRecvLen, 0);
if RecvCount <= 0
begin//如果收到的数据包的长度不大于0,则重新与服务器连接
FCilentThread.FMemeryStream.Position := 0;
FReadPosition := 0;
LastSize := 0;
FCutSend.SendData[0] := $0F;
send(FServerSocket, FCutSend, 1, 0);//如果不是服务器关闭则向服务器发送此信息,使对应此客户端的线程结束。
StartSocket;
CreatSocket;
SocketConnect(StrToInt(Form1.edt1.Text), Form1.edt2.Text);
send(FServerSocket, FSendInfo, FActLen, 0);
end;
服务器接收代码:
nTimeOut := 1000;
while not Terminated do
begin
InActLen := SizeOf(FRecInfo);
If setsockopt(FHostSocket, SOL_SOCKET, SO_RCVTIMEO, Pchar(@nTimeOut), sizeof(Integer))<> SOCKET_ERROR then
begin
recv(FHostSocket, FRecInfo, InActLen, 0);
if FRecInfo.RecvData[0] = 0 then
begin
Continue;
end;
if FRecInfo.RecvData[0] = $0F then //客户端关闭时发送来的数据。
begin
closesocket(FHostSocket);
Break;
end;
OpenPackage(FRecInfo);
BiggerPackSend;
end;
Sleep(1000);
end;
客户端,有一个线程,来接收数据。
接收数据的时候没有问题。但是服务器关闭后,再打开,客户端重新连接的时候,服务器接收函数,总是超时。而且服务器端线程数目一直在上涨。这是什么情况?
客户端重连代码:
RecvCount := recv(FServerSocket, FCilentThread.FRecvInfo.ClientRecvData, FRecvLen, 0);
if RecvCount <= 0
begin//如果收到的数据包的长度不大于0,则重新与服务器连接
FCilentThread.FMemeryStream.Position := 0;
FReadPosition := 0;
LastSize := 0;
FCutSend.SendData[0] := $0F;
send(FServerSocket, FCutSend, 1, 0);//如果不是服务器关闭则向服务器发送此信息,使对应此客户端的线程结束。
StartSocket;
CreatSocket;
SocketConnect(StrToInt(Form1.edt1.Text), Form1.edt2.Text);
send(FServerSocket, FSendInfo, FActLen, 0);
end;
服务器接收代码:
nTimeOut := 1000;
while not Terminated do
begin
InActLen := SizeOf(FRecInfo);
If setsockopt(FHostSocket, SOL_SOCKET, SO_RCVTIMEO, Pchar(@nTimeOut), sizeof(Integer))<> SOCKET_ERROR then
begin
recv(FHostSocket, FRecInfo, InActLen, 0);
if FRecInfo.RecvData[0] = 0 then
begin
Continue;
end;
if FRecInfo.RecvData[0] = $0F then //客户端关闭时发送来的数据。
begin
closesocket(FHostSocket);
Break;
end;
OpenPackage(FRecInfo);
BiggerPackSend;
end;
Sleep(1000);
end;
...全文
相关推荐
Socket服务器端断开后重新打开,客户端将自动完成链接
Socket通信技术。利用到了Thread技术,完成了,服务器开启,一直监听客户端功能,两点是,当服务器端断开后重新打开后,客户端能自动链接到服务器端,由于网络原因最多延迟2分钟
c# socket检测连接服务器连接
socket客户端判断是否连接到服务器,主要检测服务器端断开情况 public bool IsSocketConnected(Socket newclient) { try { byte[] tmp = new byte
python socket 实现服务器与客户端多线程连接
主要实现服务器端与多个客户端的连接,代码语言:python,模块:socketsever,客户端与服务器端实现相互的交接。
c语言socket编程 与服务器长连接的客户端程序
c语言socket编程 与服务器长连接的客户端程序
基于TCP的Socket编程服务器和客户端代码
基于TCP的Socket编程服务器和客户端代码


网络通信/分布式开发
