急急急!!!(60分)

  • 主题发起人 主题发起人 happy_boy
  • 开始时间 开始时间
H

happy_boy

Unregistered / Unconfirmed
GUEST, unregistred user!
serversocket如何处理不同的连接呢?
比如我要做的是一个聊天的小程序,是看delphi中的chat
才产生的这个念头,
但是那个程序用的是一个连接,我要处理不同的连接
该怎么办呢?怎样把字符发到每个人那里呢?
是巨型弱的问题,但是我想搞明白它。
我的分没多少了。都给大家。
 
serversocket好像不行,换个控件吧。
 
单个连接用Tcp,多个连接用udp,建议用ics控件,巨好.
 
建议自己用Winsock写,采用多线程模式,每Accept一个客户端就创建一个
线程
 
所谓创建线程建立多个连接,似乎被高手指为不必要。
因为ICS等控件本身内含线程处理机制。
不知此处高手意下如何?
 
用DirectX 的DirectPlay吧,简单、方便、能满足要求。
 
用一个最笨的办法:
使用一个端口来监听客户端的请求,有请求上来时,就分配一个空闲的端口给他用,用完把那个端口关了,这样来多少个请求都不会怕了。
 
用NMUDP较好,我用该控件结合DCOM开发了一个网络会议系统,感觉还不错!因为涉及到
ORACLE数据库,所以代码就不贴出来了,实现的原理就是查出信息来源的客户机的IP,然后
动态的赋给UDP的RemoteHost,端口用6969。
 
关于UDP的发送和接收给你一段代码:
发送:
var
MyStream: TMemoryStream;
TmpStr,MyWords:string;
begin
if FChatDCom<>nil then
begin
TransUDP.ReportLevel := Status_Basic;
TransUDP.RemoteHost := FChatDCOM.GetUserIP(PChar(Trim(TV_Status.Selected.Text)));
//将用户IP地址赋给UDP
TransUDP.RemotePort := FPort;
MyWords:=InputBox('输入你想说的话','你想对'+TV_Status.Selected.Text+'说:','');
TmpStr :=TV_Status.Selected.Text+'对你说:'+MyWords;
MyStream := TMemoryStream.Create;
try
MyStream.Write(TmpStr[1], Length(TmpStr));
TransUDP.SendStream(MyStream);
finally
MyStream.Free;
end;
end
else
ShowMessage('请先登录到服务器上!');
end;

接收:
var
MyStream: TMemoryStream;
TmpStr: array of char;
begin
MyStream := TMemoryStream.Create;
try
TransUDP.ReadStream(MyStream);
MyStream.Seek(0,0);
SetLength(tmpStr,MyStream.size);
MyStream.Read(TmpStr[0],MyStream.Size);
finally
MyStream.Free;
end;
//判断信息的级别
case TmpStr[0] of
'1':begin
MemoSaying.Lines.Add(copy(string(TmpStr),2,length(string(TmpStr))));
GetUserList;
end;
'0':begin
MemoSaying.Lines.Add(copy(string(TmpStr),2,length(string(TmpStr))));
GetUserList;
end;
else
begin
ShowMessage(string(tmpStr));
end;
end;
 
接受答案了.
 
后退
顶部