这个聊天程序是这样的,在广域网(内网)中使用,每个电脑都是动态获取IP,并且要实现电脑之间相应通信或是对全体通信。请问和位高手,我应该怎么做,是用UDP吗?在线==========

解决方案 »

  1.   

    这样啊,看来必须要加服务器了。有了服务器,登陆后,就可以随便了,用TCP还是UDP都一样啊。
      

  2.   

    对你需要一个服务器端程序,然后让所有的客户端登录入服务器端,这样在服务器端就保存有所有客户端的Socket连接信息,所有消息就都可以通过服务器中转了
      

  3.   

    OICQ利用的是Socket5通信方式。它上线时先从服务器取回好友信息和在线状态,发送超时还会将信息先保存在服务器,等对方下次上线后再发送然后把服务器的备份删除。你可以根据前面学的概念来完善这个程序,比如说再添加一个NMUDP控件来管理在线状态,发送的信息先转换成ASCII码进行与或运行并加上一个头信息,接收方接收信息后先判断信息头正确与否,如果正确才把信息解密显示出来,这样就提高了安全保密性。
     另外,UDP协议还有一个很大的好处就是可以广播,就是说处于一个网段的都可以接收到信息而不必指定具体的IP地址。网段一般分A、B、C三类,
    1~126.XXX.XXX.XXX (A类网) :广播地址为XXX.255.255.255
    128~191.XXX.XXX.XXX(B类网):广播地址为XXX.XXX.255.255
    192~254.XXX.XXX.XXX(C类网):广播地址为XXX.XXX.XXX.255
     比如说三台计算机192.168.0.1、192.168.0.10、192.168.0.18,发送信息时只要指定IP地址为192.168.0.255就可以实现广播了。下面给出一个转换IP为广播IP的函数,快拿去完善自己的OICQ吧^-^.Function Trun_ip(S:string):string;
    var s1,s2,s3,ss,sss,Head:string;
    n,m:integer;
    begin
    sss:=S;
    n:=pos('.',s);
    s1:=copy(s,1,n);
    m:=length(s1);
    delete(s,1,m);
    Head:=copy(s1,1,(length(s1)-1));
    n:=pos('.',s);
    s2:=copy(s,1,n);
    m:=length(s2);
    delete(s,1,m);
    n:=pos('.',s);
    s3:=copy(s,1,n);
    m:=length(s3);
    delete(s,1,m);
    ss:=sss;
    if strtoint(Head) in [1..126] then ss:=s1+'255.255.255'; //1~126.255.255.255 (A类网)
    if strtoint(Head) in [128..191] then ss:=s1+s2+'255.255';//128~191.XXX.255.255(B类网)
    if strtoint(Head) in [192..254] then ss:=s1+s2+s3+'255'; //192~254.XXX.XXX.255(C类网)
    Result:=ss; 
    end;
      

  4.   

    首先你要建立服务器端,就用端口通讯的办法就能实现一般的功能,tcp或udp无所谓
    只是udp快的。