我用delphi写了1个TTcpServer;
在有请求的时候将ClientSocket保存起来。稍后再处理;代码如下:procedure TSocketService.TcpServerAccept(Sender: TObject;
ClientSocket: TCustomIpClient);
begin
showmessage( ClientSocket.RemoteHost + '' + ClientSocket.RemotePort); //打印出来IP跟端口。
pondThread.addThread(ClientSocket); //将ClientSocket对象添加到1个线程中。
end;
线程代码:type
TSocketThread = class(TThread)
procedure Execute; override;
ClientSocket : TCustomIpClient;procedure TSocketThread.Execute;
begin
showMessage(ClientSocket.RemoteHost + '' + ClientSocket.RemotePort); //这里会报错.
end;在TcpServerAccept方法跟客户端通信是没有问题的。 但是将ClientSocket对象传递到其它对象后再进行通信就不行了。
想不通,请高手指教呀。
在有请求的时候将ClientSocket保存起来。稍后再处理;代码如下:procedure TSocketService.TcpServerAccept(Sender: TObject;
ClientSocket: TCustomIpClient);
begin
showmessage( ClientSocket.RemoteHost + '' + ClientSocket.RemotePort); //打印出来IP跟端口。
pondThread.addThread(ClientSocket); //将ClientSocket对象添加到1个线程中。
end;
线程代码:type
TSocketThread = class(TThread)
procedure Execute; override;
ClientSocket : TCustomIpClient;procedure TSocketThread.Execute;
begin
showMessage(ClientSocket.RemoteHost + '' + ClientSocket.RemotePort); //这里会报错.
end;在TcpServerAccept方法跟客户端通信是没有问题的。 但是将ClientSocket对象传递到其它对象后再进行通信就不行了。
想不通,请高手指教呀。
解决方案 »
- webbrowser1的执行顺序问题
- 接到个私活,大家看看应该价值多少?
- Pagecontrol中做好了四个页,如何让他们的位置调换一下?
- 对您来说可能很简单,取DateTime部分内容的问题!在线等待,即答即得分!
- 如何提高编程能力?
- 一个并不复杂的问题,请大家给点意见啊!!
- 父窗体与子窗体问题
- 在DELPHI 6中使用CORBA DATA MODULE为何总是不能编译通过?
- 我试着写了个文本编辑器.可是编译成exe后,文本文件不能拖放到编辑区打开.打开方式也不能成功,是否须添加相应事件!!
- 如何实现月为30天,年为360天的转换?
- 关闭某一窗口就结束整个程序,如何做?
- 实测SPCOMM与MSCOMM通讯速度
然后
thread.create(true)//先挂起
thread.aClientSocket =ClientSocket;
thread.Suspended := false;
pondThread.addThread(ClientSocket); 这句就是讲ClientSocket 赋值给线程对象当属性。
问题是这么做它不能进行通信。 通信会报错哦。
delphi Access violation at address 00000000. Read of address 00000000;
function TPondThread.addThread(cs :TCustomIpClient):Boolean;
var
socketThread : TSocketThread;
begin
socketThread := TSocketThread.Create(true);
socketThread.setSocket(cs);
showMessage(cs.RemoteHost + '' + cs.RemotePort); //这句正常
showMessage(socketThread.ClientSocket.RemoteHost + '' + socketThread.ClientSocket.RemotePort); //异常了
socketThread.Resume;
Result := true;
end;
你用=的方式对对象进行赋值其实只是引用了一个地址而已
你用assign试试看thread.create(true)//先挂起
thread.aClientSocket.assign(ClientSocket);
thread.Suspended := false;
Var
Data: Array[0..1023] Of char;
RecText: String;
SocketStream: TWinSocketStream;
Begin
While Not Terminated And ClientSocket.Connected Do
Try
SocketStream := TWinSocketStream.Create(ClientSocket, 10000);
Try
FillChar(Data, SizeOf(Data), 0);
If SocketStream.Read(Data, SizeOf(Data)) = 0 Then
Begin
// If we didn't get any data after xx seconds then close the connection
ClientSocket.SendText('Timeout on Server'+#13#10);
//Wait a little time to allow sending of text before disconnect
sleep(1);
ClientSocket.Close;
Terminate;
End;
RecText := Data;
If Length(RecText) > 2 Then
Delete(RecText, Pos(#13#10, RecText), 2); // Delete #13#10
If ClientSocket.Connected Then
Begin
ClientSocket.SendText(RecText);
SendMessage(Form1.Listbox1.Handle, LB_ADDSTRING, 0, Integer(PChar(RecText)));
PostMessage(Form1.Handle, CM_INCCOUNT, 0, 0);
End;
Finally
SocketStream.Free;
End;
Except
HandleException;
End;
End;