Delphi TServerSocket/ClientSocket 发送接收消息问题请教

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Delphi TServerSocket/ClientSocket 发送接收消息问题请教相关的知识,希望对你有一定的参考价值。

服务器端通过WriteLn方法发送字符串,客户端通过ReadLn接收消息的时候弹出了异常信息:class
EIdReadLnMaxLineLengthExceeded WITH message 'max line length exceeded'
好像是接收的信息超过了大小

请问大家有什么好办法处理吗?谢谢

Procedure TForm1.BitBtn1Click(Sender: TObject);
var
I: Integer;
Begin
for I := 0 to ServerSocket1.Socket.ActiveConnections -1 Do
Begin
//if ServerSocket1.Socket.Connections[I].SocketHandle = XXX then
ServerSocket1.Socket.Connections[I].SendText('amsg'); //服务端发送
End;
End;

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin
Socket.ReceiveText; //客户端接收
end;
参考技术A 一次传送的东西太多了~

定义一个缓冲区<多次传送>
var
Buf: Array[1..2048] of char;

Delphi 通信报Asynchronous socket error 10053错误的一个解决方法

在使用Delphi中的TClientSocket和TServerSocket进行通信编程时,当使用TClientSocket这方的客户端使用TClientSocket.close断开连接并退出程序时,使用TServerSocket这方的服务端有时会报‘’Asynchronous socket error 10053‘这个错误,查阅了这个错误说明:Software caused connection abort.(因软件原因导致连接终止)。这个原因说明很鸡肋,因为你还是无法确定到底是哪个地方出现了问题。

实际上出现这个错误很大的原因是没有客户端和服务端的连接没有断开就直接将TClientSocket给free掉造成的,在这里有两种解决方法(其实就是一种,只不过解决的地方不同而已,都是将连接断开)

一:在调用TClientSocket的Close函数之前调用TClientSocket.Socket.Close将连接断开,但这也存在另一个问题,就是还存在未接收完全的数据,此时服务端仍然会报Asynchronous socket error 10053错误,因此在调用TClientSocket.Socket.Close之前可再调用一次TClientSocket.Socket.ReceiveText将服务端发送的数据接收完全

二:在服务端的OnClientError事件中添加如下代码:

case ErrorCode of
        10053: Socket.Close;
                end;

ErrorCode := 0;

将连接断开,并设置ErrorCode为0,如果不设置,虽然连接断开,但错误码仍然是10053,仍然会弹窗报Asynchronous socket error 10053。

以上是关于Delphi TServerSocket/ClientSocket 发送接收消息问题请教的主要内容,如果未能解决你的问题,请参考以下文章

Delphi 通信报Asynchronous socket error 10053错误的一个解决方法

delphi之socket通讯

delphi中如何实现多线程socket通信时

【DELPHI】如何在两台电脑间传送文件?

本地主机上的 TServerSocket 生成异常

delphi XE8 TDSServer服务端怎样接收客户端消息