Delphi中TServerSocket和TClientSocket通信,流或二进制的发送与接收问题

changpingcao 2013-01-29 07:51:36
我目前的做法不知道对不对,大家看看:

客户端发送消息:
procedure Tfrm_SocketClient.btn_SendDataClick(Sender: TObject);
var
buff: array of byte;
str: string;
ph: PChar;
begin
str:= mem_SendData.Text;//文本框的信息
SetLength(buff, Length(str)+1);
ph:= PChar(str);
CopyMemory(buff,ph,Length(str)+1);

clntsckt1.Socket.SendBuf(buff, length(buff));
mem_SendData.Clear;
end;


服务器接收:
var

iLength: Integer;
iReceived: Integer;
buff: array of byte;
showstr:string;
begin
iLength:= Socket.ReceiveLength;
while iLength>0 do
begin
SetLength(buff, iLength);
iReceived := Socket.ReceiveBuf(buff[0], iLength);
iLength := iLength - iReceived;
msgList.Lines.Add(IntToStr(iReceived));
end;


我不知道这样做对不对,我服务器接收后不知道怎么再转化为string,请指导!

如果我的做法不对,那么麻烦给个新的方式!
希望能贴出实际代码,刚接触这个,说理论我怕无法理解,非常感谢!

总之我需要做的就是客户端发送流或者二进制到服务器 ,然后服务器接收这样子的一个功能!!!
...全文
613 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
qinkm 2013-06-12
  • 打赏
  • 举报
回复
很奇怪, 我用数组或结构体就能过去了. 但这是为什么呢?
qinkm 2013-06-12
  • 打赏
  • 举报
回复
非常奇怪,我也是用这种方式发送的, 但是到了客户端,收到的数据就变了. 比如,我发的是'A5 A5',到客户端就变成'D4 A3',再重发一次,又变成'60 A5'了! 我的代码: var pStr: string; s : String; i : Integer; buff: array of byte; str: string; ph: PChar; begin str := Trim(edtSendCommand.Text); str := HexStrToStr(str); //把十六进制字符串转成字符串 'A5 A5'--> ASC值为165的两个字符 SetLength(buff, Length(str)+1); ph:= PChar(str); CopyMemory(buff,ph,Length(str)+1); if b_Client and edtListSelected.Checked[i] then ClientSocket.Socket.SendBuf(buff,length(buff)) else ServerSocket.Socket.Connections[i].SendBuf(buff,Length(buff)); end; 然后在客户端方法: var iLength: Integer; len : word; buf : array of byte; msg, newmsg : string; begin try iLength:= Socket.ReceiveLength; fillchar(buf, sizeof(buf),' '); len := socket.ReceiveBuf(buf,iLength); msg := strpas(@buf); newmsg := COPY(trim(msg),1,len); msg := strToHexStr(newmsg); if len>0 then memResult.Lines.Add(socket.RemoteAddress+' Received:'+msg); except showmessage('transfer error!'); end; end; 有没有人碰到过同样情况或知道是什么原因的?
zhengjiujie 2013-05-24
  • 打赏
  • 举报
回复
求助啊,为什么我用什么方式接收,TServerSocket显示出来的都是一个字母h啊
zhengjiujie 2013-05-23
  • 打赏
  • 举报
回复
请问一下,为什么我的服务器接收到的都是 h 呢?明明确认是有一连串数据帧发过来的,但是每次接收都只显示一个h。比如说楼上的接收程序
manjel 2013-02-01
  • 打赏
  • 举报
回复
客户端发送: procedure Tfrm_SocketClient.btn_SendDataClick(Sender: TObject); var str: string; begin str:= mem_SendData.Text; clntsckt1.Socket.SendBuf(str[1],Length(str)); mem_SendData.Clear; end; 服务器接收: var iLength: Integer; readstr:string; begin iLength:= Socket.ReceiveLength; SetLength(readstr,iLength); Socket.ReceiveBuf(readstr[1],iLength); msgList.Lines.Add(readstr); end;
koren 2013-01-31
  • 打赏
  • 举报
回复
这玩意要看Delphi的版本的,分界线是D2009。估计你是在D2009及以上的版本中编辑的吧
changpingcao 2013-01-30
  • 打赏
  • 举报
回复
客户端发送: procedure Tfrm_SocketClient.btn_SendDataClick(Sender: TObject); var buff: array of byte; str: string; ph: PChar; begin str:= mem_SendData.Text; SetLength(buff, Length(str)+1); ph:= PChar(str); CopyMemory(buff,ph,Length(str)+1); clntsckt1.Socket.SendBuf(buff, length(buff)); mem_SendData.Clear; end; 服务器接收: var iLength: Integer; iReceived: Integer; buff: array of byte; ph:PChar; readstr:string; begin iLength:= Socket.ReceiveLength; while iLength>0 do begin SetLength(buff, iLength); iReceived := Socket.ReceiveBuf(buff[0], iLength); iLength := iLength - iReceived; end; ph:= StrAlloc(length(buff)); CopyMemory(ph,buff,length(buff)); readstr:=strPas(ph); msgList.Lines.Add(readstr); StrDispose(ph); buff:= nil; end; 服务器接收到的都乱码了,字母、数字也乱了 ,大师们指导下吧 感谢
changpingcao 2013-01-30
  • 打赏
  • 举报
回复
引用 2 楼 bdmh 的回复:
用Move或CopyMemory将buf中的内容放到string中
能说下具体用法吗?我 CopyMemory(pchar,buff,length(buff)); str:=strPas(pchar); 这样不行
UnkownState 2013-01-30
  • 打赏
  • 举报
回复
SetLength(str, Size); copymemory(@str[1], @src, size)
bdmh 2013-01-30
  • 打赏
  • 举报
回复
用Move或CopyMemory将buf中的内容放到string中
xjq2003 2013-01-29
  • 打赏
  • 举报
回复
引用 楼主 changpingcao 的回复:
本帖最后由 changpingcao 于 2013-01-29 20:05:40 编辑我目前的做法不知道对不对,大家看看: 客户端发送消息: procedure Tfrm_SocketClient.btn_SendDataClick(Sender: TObject); var buff: array of byte; str: string; ph: PChar; b……
可行, 试一下就知道了

1,593

社区成员

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

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