关于Delphi中TCP服务器和客户端的问题

qidaiyou7690 2017-11-28 11:38:41
下面是我用Delphi写的TCP客户端程序,我把绝大多数代码粘贴到下面,大神们帮我看看,进行TCP通信的时候,我的客户端能发出数据,但是接收不到TCP服务器发送的程序,是缺少什么吗??求解

//建立连接
procedure TForm1.Button2Click(Sender: TObject);
//Var
begin
TCPClient1.RemoteHost:=Edit2.Text;
TCPClient1.RemotePort:=Edit3.Text;
try
TCPClient1.Connect();
MessageBox(Form1.Handle,'连接成功!','',MB_OK);
//动态创建一个线程对象
myThread:=Thread1.Create(False);
//设置线程优先级
myThread.Priority:=tpNormal;
//设置线程结束自动释放
myThread.FreeOnTerminate:=True;
except
MessageBox(Form1.Handle,'连接失败!','警告',MB_OK);
end;
end;

//断开
procedure TForm1.Button4Click(Sender: TObject);
begin
TCPClient1.Disconnect;
MessageBox(Form1.Handle,'连接已断开!','警告',MB_OK);
end;

//发送按钮
procedure TForm1.Button1Click(Sender: TObject);
begin
if TCPClient1.Connected then
TCPClient1.Sendln(Edit1.Text)
else
MessageBox(Form1.Handle,'连接已断开,请重新连接!','警告',MB_OK);
end;

//接收多线程函数
procedure Thread1.Execute;
begin
{ Place thread code here }
while Form1.TCPClient1.Receiveln<>'' do
begin
Form1.ListBox1.Items.Add(Form1.TCPClient1.Receiveln());
Application.ProcessMessages;
end;
end;
...全文
837 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
qidaiyou7690 2017-12-12
  • 打赏
  • 举报
回复
引用 9 楼 DelphiGuy 的回复:
while Form1.TCPClient1.Receiveln<>'' do // 这都读过了 begin Form1.ListBox1.Items.Add(Form1.TCPClient1.Receiveln()); // 阻塞在这里,直到下一次有数据可读 Application.ProcessMessages; end; 而且Receiveln以换行回车为行结束标记,没有读到换行回车它不会返回数据。
9楼是正解,明白了,非常感谢
boylafong 2017-12-08
  • 打赏
  • 举报
回复
直接用Receive函数啊
  • 打赏
  • 举报
回复
while Form1.TCPClient1.Receiveln<>'' do // 这都读过了 begin Form1.ListBox1.Items.Add(Form1.TCPClient1.Receiveln()); // 阻塞在这里,直到下一次有数据可读 Application.ProcessMessages; end; 而且Receiveln以换行回车为行结束标记,没有读到换行回车它不会返回数据。
qidaiyou7690 2017-12-07
  • 打赏
  • 举报
回复
没有人顶一下吗
qidaiyou7690 2017-12-01
  • 打赏
  • 举报
回复
引用 5 楼 SupermanTm 的回复:
首先,不应该在线程的 Execute 里访问 VCL!如果必须,则应该建立临界区或采用消息进行通讯 其次,Delphi 自带的 TTCPClient 本身就是消息驱动的,不明白为什么需要建立一个线程?你完全可以响应其 OnConnect / OnDisconnect / OnReceive 等方法进行处理,而OnReceive 事件中已经帮你把数据读出来了: procedure TForm1.TcpClient1Receive(Sender: TObject; Buf: PAnsiChar; var DataLen: Integer); begin end;
5楼有可以使用的最简单的例子吗?如果可以,感激不尽,在网上下载了好多都不能运行,能运行的也都不能接收消息,而且我看网上好多接收消息的都是使用的线程,但我使用就完全接收不到
qidaiyou7690 2017-12-01
  • 打赏
  • 举报
回复
引用 4 楼 qq_38204686 的回复:
设置断点试试 确认接受线程是否开启 接受有误还是服务器发送问题(O_O)?
断点设置过了,只要while Form1.TCPClient1.Receiveln<>'' do到这里就卡住不动了,不知道原因
SupermanTm 2017-11-30
  • 打赏
  • 举报
回复
首先,不应该在线程的 Execute 里访问 VCL!如果必须,则应该建立临界区或采用消息进行通讯 其次,Delphi 自带的 TTCPClient 本身就是消息驱动的,不明白为什么需要建立一个线程?你完全可以响应其 OnConnect / OnDisconnect / OnReceive 等方法进行处理,而OnReceive 事件中已经帮你把数据读出来了: procedure TForm1.TcpClient1Receive(Sender: TObject; Buf: PAnsiChar; var DataLen: Integer); begin end;
大米粥哥哥 2017-11-29
  • 打赏
  • 举报
回复
设置断点试试 确认接受线程是否开启 接受有误还是服务器发送问题(O_O)?
qidaiyou7690 2017-11-28
  • 打赏
  • 举报
回复
大神们帮小弟看一下,刚学Delphi不久,但是非常紧急,万分感谢
qidaiyou7690 2017-11-28
  • 打赏
  • 举报
回复
大神们来帮帮忙啊
qidaiyou7690 2017-11-28
  • 打赏
  • 举报
回复
没有人回复吗??在线等

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧