客户断clientsocket,阻塞模式,服务端serversocket 线程阻塞模式
客户端:
procedure TForm1.RzBitBtn5Click(Sender: TObject);
var i,len:integer;
strData,bmstr: string;
buf: Pchar;
begin
bmstr:='4343434343433ewedsfdewewreewew323232ewds3es3de3ds3ds3es3evvvvvvvvvvvvvvxxcfsgdd***';
len:=length(bmstr);
buf :=allocmem(len);
ClientSocket1.Socket.SendBuf(buf^,len);
end;
服务器端:
数据来时生成线程
procedure TForm1.TcpServer1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
SocketThread :=TserverThread.Create(false,ClientSocket);
end;线程的执行
procedure TserverThread.ClientExecute;
var
ReceiveBuffer:Array Of Char;
ReceiveD:TMemoryStream;
InputStream:TWinSocketStream;
OutputStream:TWinSocketStream;
buf:pchar;
bmstr,strData:string;
len,i:integer;
begin
while not Terminated and ClientSocket.Connected do
begin
Try
InputStream:=TWinSocketStream.Create(ClientSocket,10000);
Try
ReceiveD:=TMemoryStream.Create;
len:=clientsocket.ReceiveLength;
setlength(ReceiveBuffer,len);
FillChar(ReceiveBuffer, sizeof(ReceiveBuffer),0);
While InputStream.WaitForData(10000) do
begin
if InputStream.Read(ReceiveBuffer,SizeOf(ReceiveBuffer))=0 then
begin//接受数据完毕,相链接的socket回发数据
//clientsocket.SendBuf(buf^,length(bmstr));
ClientSocket.Close;
end
else
begin --此处应该怎么写啊,我是直接读到内存流中了,感觉不对
inputstream.Read(ReceiveD,len);
end;
end;
Finally
//form1.Memo1.Lines.LoadFromStream(InputStream);
InputStream.Free;
ClientSocket.Close;
End;
Except
End;
end;
end;
问题:不知道怎么接受数据,线程有点晕,半管水哈,
而且把接受的数据显示到memo控件中
客户端:
procedure TForm1.RzBitBtn5Click(Sender: TObject);
var i,len:integer;
strData,bmstr: string;
buf: Pchar;
begin
bmstr:='4343434343433ewedsfdewewreewew323232ewds3es3de3ds3ds3es3evvvvvvvvvvvvvvxxcfsgdd***';
len:=length(bmstr);
buf :=allocmem(len);
ClientSocket1.Socket.SendBuf(buf^,len);
end;
服务器端:
数据来时生成线程
procedure TForm1.TcpServer1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
SocketThread :=TserverThread.Create(false,ClientSocket);
end;线程的执行
procedure TserverThread.ClientExecute;
var
ReceiveBuffer:Array Of Char;
ReceiveD:TMemoryStream;
InputStream:TWinSocketStream;
OutputStream:TWinSocketStream;
buf:pchar;
bmstr,strData:string;
len,i:integer;
begin
while not Terminated and ClientSocket.Connected do
begin
Try
InputStream:=TWinSocketStream.Create(ClientSocket,10000);
Try
ReceiveD:=TMemoryStream.Create;
len:=clientsocket.ReceiveLength;
setlength(ReceiveBuffer,len);
FillChar(ReceiveBuffer, sizeof(ReceiveBuffer),0);
While InputStream.WaitForData(10000) do
begin
if InputStream.Read(ReceiveBuffer,SizeOf(ReceiveBuffer))=0 then
begin//接受数据完毕,相链接的socket回发数据
//clientsocket.SendBuf(buf^,length(bmstr));
ClientSocket.Close;
end
else
begin --此处应该怎么写啊,我是直接读到内存流中了,感觉不对
inputstream.Read(ReceiveD,len);
end;
end;
Finally
//form1.Memo1.Lines.LoadFromStream(InputStream);
InputStream.Free;
ClientSocket.Close;
End;
Except
End;
end;
end;
问题:不知道怎么接受数据,线程有点晕,半管水哈,
而且把接受的数据显示到memo控件中
解决方案 »
- 面试题 使用存储过程与字符串方式哪个更好,为什么?
- █ █ 紧急求教:如何利用SQL汇总,汇总结果显示在DBGRID里█ █
- 100分求QQ游戏记牌器原理
- 请问delphi7如何改变exe文件的图标
- 一个百思不得其解的问题
- 请问用MSSQL还是SQL Server?用MSACCESS还是Driver do Microsoft Access(*.m ??
- 哪位老兄能提供delphi4或delphi3的下载地址,不胜感激!
- 江湖告急---如何实现当系统的媒体设备被占用时弹出警告框,然后中止程序运行?
- 在delphi下如何调用在ms-sql-server下写的需要传入参数的存储过程?谢谢
- 请问高手:如何用clientdataset取存储过程的output参数
- 急!!!fastreport报表高度能否根据内容改变?
- DBGridEh中的单价列如何判断是不是有效的数值型?
但是对这个东西不太熟悉啊
这句话是不是表示已经读取数据完毕,读取的数据是存在ReceiveBuffer中的吗?
如果是的话我要将它显示在form上的memo中应该怎么写啊?
或者说我要将ReceiveBuffer中的数据放在一个字符串中应该怎么写?
procedure TserverThread.ClientExecute;
var ...
begin
while not Terminated and ClientSocket.Connected do
begin
Try
strdata:='';
len:= ClientSocket.ReceiveLength;
if len>0 then
begin
buf :=allocmem(len);
ClientSocket.ReceiveBuf(buf^,len);
for i:=0 to len-1 do
strData:=strData+Format('%X',[Ord(pChar(buf+i)^)])+' ';
if strdata<>'' then
begin
memo1.Lines.Add(strdata);
bmstr:='C00D1121';
len:=length(bmstr);
buf :=allocmem(len);
clientsocket.SendBuf(buf^,len);
end;
end else clientsocket.close;
end;
服务器端不做超时设置,让clientsocket一直跟客户端链接,客户端有超时设置,当客户端断开后,客户服务端的socket也断开,线程结束,问题是这样做有没有什么问题啊?
{
Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example, Synchronize(UpdateCaption); and UpdateCaption could look like, procedure dsddfdsf.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; or Synchronize(
procedure
begin
Form1.Caption := 'Updated in thread via an anonymous method'
end
)
); where an anonymous method is passed. Similarly, the developer can call the Queue method with similar parameters as
above, instead passing another TThread class as the first parameter, putting
the calling thread in a queue with the other thread.}注意线程同步的问题
另: 与vcl交互的地方在Synchronize里写Delphi线程类里有说,如上
procedure TserverThread.ClientExecute;
var
ReceiveBuffer:Array[0..3071] Of byte;//16进制
InputStream:TWinSocketStream;
str,strData:string;
len,i:integer;
begin
while not Terminated and ClientSocket.Connected do
begin
try
InputStream:=TWinSocketStream.Create(ClientSocket,3000);
FillChar(ReceiveBuffer, sizeof(ReceiveBuffer),0);
try
if InputStream.WaitForData(3000) then
begin
strdata:='';
len:=ClientSocket.ReceiveLength;
if InputStream.Read(ReceiveBuffer,SizeOf(ReceiveBuffer))=0 then
begin
ReceiveBuffer[0]:=$C0;
ReceiveBuffer[1]:=$00;
ReceiveBuffer[2]:=$08;
ReceiveBuffer[3]:=$21;
ClientSocket.SendBuf(ReceiveBuffer,8);
clientsocket.Close;
end;
if len>0 then
begin
for i:=0 to len-1 do
begin
str:=inttohex(ReceiveBuffer[i],2);
strdata:=strdata+str+' ';
case i of
0:memo1.lines.Add('包的检测码:'+str);
2:memo1.lines.Add('包的大小:'+str);
3:memo1.Lines.Add('功能码:'+str);
end;
end;
memo1.lines.Add(strdata);
ReceiveBuffer[0]:=$C0;
ReceiveBuffer[1]:=$00;
ReceiveBuffer[2]:=$08;
ReceiveBuffer[3]:=$21;
ClientSocket.SendBuf(ReceiveBuffer,8);
clientsocket.Close;
end;
end
else clientsocket.Close;
finally
InputStream.Free;
clientsocket.Close;
end;
except
end;
end;
end;
procedure TForm1.TcpServer1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
SocketThread :=TserverThread.Create(false,ClientSocket,listbox1);end;
会不停的被触发,生成线程,但是客户端根本就没有发送任何数据