话题2450990的标题是: serversocket如何知道是哪个clientsocket发来的信息(只有这点分了,高手帮帮我吧。谢谢!!) (34分)
分类:数据库-C/S型 wjhluohuixia (2004-02-13 10:04:00)
我有个工程,它有3和窗体form1(应用于服务器端),form2(应用于客户端A),form3(应用于客户端B)。其中,在form1中有个serversocket1,form2有个clientsocket1,form3有个clientsocket1,他们的端口一样。
运行后,客户端A、B向服务器端发信息,服务器端都收到A、B的信息后。我要服务器端根据A、B的信息分别向他们回信息。但怎样知道哪个clientsocket发来的呢????
AIE (2004-02-13 10:35:39)
不是有remoteport这个属性嘛,B,C取不同端口,你判断哪个port来得不就行了?
andy263 (2004-02-13 10:40:38)
ServerSocket1.Socket.Connects[n].RemoteIP;
wjhluohuixia (2004-02-13 10:44:21)
to AIE
A、B取不同的端口,不行吧。如果他们的端口不同,则分别连接serversocket时,serversocket的端口也要变了。如果serversocket还没收完A的数据,又要收B的数据,它端口变了,就收不到A剩余的数据了。
我说的对吗???请回答。
andy263 (2004-02-13 10:45:25)
〉〉A、B取不同的端口,不行吧。如果他们的端口不同,则分别连接serversocket时,serversocket的端口也要变了。如果serversocket还没收完A的数据,又要收B的数据,它端口变了,就收不到A剩余的数据了。
不对 嗯
wjhluohuixia (2004-02-13 10:47:00)
to andy263
ServerSocket1.Socket.Connects[n].RemoteIP
n=0,n=1。则当n=0是指A还是B,n=1是指A还是B
???
fei_l (2004-02-13 10:48:53)
1、如上所述,判断IP
2、可能通过发不同的套接字,不管客户端的IP如何变,都可知道是谁发的。可能这种更有通用性。
wjhluohuixia (2004-02-13 11:03:30)
我查了以前的贴,发现可以用handle或data属性的,但我不会,
有人知道吗,请说说!!!
jackchin (2004-02-13 11:48:18)
Remote的IP相同, Port也相同, 不可能通过IP和Port区别是哪个Client,
需要在连接时通过特定的数据(标识)区别, 将Server的ClientSocket的Handle与
该标识绑定, 以后通信是通过Handle就可以知道哪个Client
0755 (2004-02-13 12:14:31)
to jackchin
给个代码看看好吗,谢谢了!!!
jackchin (2004-02-13 12:21:29)
Client端连接成功后, 首先发送"我是谁"的数据(ID)
服务端收到后, 登记ID和Socket.SocketHandle
以后,连接没有断开的情况下,通过Socket.SocketHandle,就可以
找到ID
ZRWeng (2004-02-13 12:23:05)
根据SOCKET.Handle! 接收的时候保存这个handle 如hwd:=socket.handle
发送给目标ClientSocket的时候用 send(Hwd,buf[0],length(buf),0);//buf为发送的字符数组
wjhluohuixia (2004-02-13 12:29:01)
to ZRWeng
给个代码好吗?
ZRWeng (2004-02-13 12:47:24)
给出我的部分代码,你看一下就知道了
//定义常量,表示协议的固定包头长度
Const Contrallen=4;
procedure TFrm_Main.SendOnSquad(flag:string;Hwd:integer);
var
i,flagLen:integer;
buf:array of char;
curDate:string;
curTime:String;
dateLen,TimeLen:Integer;
begin
curdate:=formatDateTime('yyyymmdd',now);
curTime:=formatDateTime('hhmmss',time);
dateLen:=Length(curdate);
TimeLen:=Length(curTime);
//数据包请求信息AFAF
flagLen:=1;
setLength(buf,contrallen+flagLen+dateLen+TimeLen+1);
for i:=0 to contrallen-1 do
if ((i mod 2)=0) then buf:='A'
else buf:='F';
//发送内容
CopyMemory(@buf[Contrallen],@flag[1],flagLen);
CopyMemory(@buf[contrallen+flagLen],@curdate[1],dateLen);
CopyMemory(@buf[contrallen+flagLen+dateLen],@curTime[1],timeLen);
buf[Length(buf)-1]:=#0;//结束符
send(Hwd,buf[0],length(buf),0);//hwd是接收时保存客户端的Socket句柄
end;