kingsong,你一定要帮帮我,是先放到缓存中,再一次处理收到的所有信息?我怎么才能一次发送一个记录类型的所有信息?下面是我错误的程序,请问我该怎么改? Tmyrecord=record NO:string; name:string; age:integer; ... end; myrecord:Tmyrecord;if clientsocket1.Active=true then clientsocket1.Active:=false; with clientsocket1 do begin host:='192.168.4.142'; port:=1010; active:=true; socket.sendbuf(myrecord,sizeof(myrecord)); end;
可以信息之间加上自定义的分割符如#,然后一次发送,这需要接收方判断了。
我也没试过,如果发送方不停的执行sendtext,接收方read事件中来不及处理怎么办,是先放到缓存中,再一次处理收到的所有信息呢?还是发送方每个sendtext都会使接收方产生一个read事件。
Tmyrecord=record
NO:string;
name:string;
age:integer;
...
end;
myrecord:Tmyrecord;if clientsocket1.Active=true then
clientsocket1.Active:=false;
with clientsocket1 do
begin
host:='192.168.4.142';
port:=1010;
active:=true;
socket.sendbuf(myrecord,sizeof(myrecord));
end;
1、保证端口一致,并且退出时一定将active:=false;否则不能二次运行。
2、用sendtext,肯定可以,我试过了。
3、将Tmyrecord中的string改为string[10],定个长度。我试了试,服务器端可以收到信息,但不知为何多了很多乱码。
供参考。
你程序没错。
1、这类程序通讯不是重点,关键是C-S之间的通信协议,在写码之前,先好好搞搞。
2、当ServerSocket提供一个端口,而有多个ClientSocket去联时,那ServerSocket端将依次产生若干个Connection,为Connection[0],Connection[1]...,而ServerSocket靠这个来区分与哪个ClientSocket进行通信,这将是非常麻烦的事。因为当有一个ClientSocket断了时,余下的Connectiong将依次前移,即若Connection[m]断了,Connection[n]将变为Connection[n-1](n>m),那Server如何确定与哪个Client通讯。请教某大虾,说是做一些Health Check,Server每隔一段时间向所有Connection发信息,而Client即发个短信息标明身份。然后存放在一数组里。实现起来好像也很麻烦。
3、ServerSocket是用一个Read事件来接收信息,因此必须判断是哪个ClientSocket发来的,因此ClientSocket发信息时要带上自己的标识。(说到底是通信协议问题)。
4、若是ClientSocket.Active:=false,那ServerSocket将会立刻触发ClientDisconnect事件。而若是网线断了,则会需要很长时间。
题外话,曾开发过打字比赛用的软件,比赛前一天一切OK,比赛那天,与ServerSocket怎么也联不通(网络当然没问题),丢了一个大脸,到现在也不知道是什么原因。老天啊,给我个理由吧。