网络环境:
  server--adsl----------intenet---------adsl----client  server端的ADSL设立NAT.要求:
  1、client发出请求-》server接受、回复-》client接受
    2、client是一内部网,内部网的所有微机要访问server,和server做上面简单的通信。用tcp 和UDP各写了一个程序,局域网内可以,拿到上面的环境不行,应该用TCP还是UDP来做?能给个例子吗?
我已经做到这一步了:
server端能收到client端的请求,也知道client端ADSL的公网地址,向client端ADSL的公网地址回复时,client端收不到。我用的是TCPCLIENT 和TCPSERVER两个控件做的。

解决方案 »

  1.   

    server向client发消息,要确定是第几个clientserverSocket.socket.connection[0].sendtext('');
    ...............................1........
    .............................. 2
      

  2.   

    我看过你的另一个帖子,我的建议还是让你看看Delphi里面带的Demo,你写的程序有问题。
      

  3.   

    var
      ID:Integer;
      Socket:TCustomWinSocket;
    begin
      if Combox1.Text='' then
        exit;
      ID:=strtoint(Combox1.text);
      //用已有的Socket句柄建立socket对象
      Socket:=TCustomWinSocket.Create(ID);
      Socket.SendText(EdtSend.text);
      

  4.   

    列出的只是写程序的思路,在内网已经使用了一段时间,现在的问题是:在client端的ADSL上设了代理后,server 和client的通信失去联系,如果client端的adsl不设代理,通信正常。本人对DELPHI没什么了解,请给个解决例子,谢了!
      

  5.   

    你用\Delphi6\Demos\Internet\Chat.exe 试试吧
      

  6.   

    谢谢bomdy ,我是参照chat.exe写的,在内网用了有一段时间了,放到外网不行,是TcpClient1.Sendln('test')语句有问题,这时TcpClient1.RemoteHost := ADSL公网的IP,不是Client的地址,原因在这里,就是不知怎么解决,是否用其它语句呢?
      

  7.   

    我看了你另一贴中的代码,有些问题,你的程序好像在server和client间建立了双重连接,我不知道则是否是你们有特殊需要,不过要完成相同的功能,只要
    server:
    procedure TServer.TcpServer1Accept(Sender: TObject;
      ClientSocket: TCustomIpClient);
    var
      s:string;
      begin
       s := ClientSocket.Receiveln;
       
       //直接回送字符串?不知是否你要的效果?
       //TcpClient1.RemoteHost := ClientSocket.RemoteHost;
       //TcpClient1.RemotePort := Port;
       //TcpClient1.Sendln(s);
       ClientSocket.Sendln(s);  //直接这样
      end;client:procedure Tclient.FormShow(Sender: TObject);
    var
     str: String;
    begin
     TcpClient1.RemoteHost := ServerIP;
     TcpClient1.RemotePort := port;
     TcpClient1.Open;             //用TCP要加上这句,如果接着就调用send需要保证是阻塞模式 
     TcpClient1.Sendln(str); //这是要等待server向client建立反向连接?如果确实是这样,client的代理需要开端口映射以便让server来的连接通过,否则server无法用原来的方法回送消息
     //TcpServer1.LocalPort := port;
     //TcpServer1.Active := True;
    end;
      

  8.   

    bomdy,谢谢!
    我马上按您的方法试试。
      

  9.   

    在client端我是用Tserver.TcpServer1Accept接受server返回的字符串的,这样就要设
    TcpServer1.LocalPort := port;
    TcpServer1.Active := True;
    或者用其他的方法接受?
      

  10.   

    其实使用TServerSocket和TClientSocket,简单的响应事件即可procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      DebugOut(Socket.RemoteHost + ' connected');
    end;procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      DebugOut('disconnected');
    end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var s: string;
    begin
      s := Socket.ReceiveText;
      DebugOut('client: '+Socket.ReceiveText);
      Socket.SendText(s);
    end;procedure TForm1.ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      DebugOut('connected to server');
    end;procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      DebugOut('disconnected from server');
    end;procedure TForm1.ClientSocket1Read(Sender: TObject;
      Socket: TCustomWinSocket);
    var s: string;
    begin
      s := Socket.ReceiveText;
      DebugOut('server: '+Socket.ReceiveText);
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      if ClientSocket1.Active then
         ClientSocket1.Socket.SendText(Edit1.Text);
    end;
      

  11.   

    在client端设置:
    TcpServer1.LocalPort := port;
    TcpServer1.Active := True;
    我理解是为client的Tserver.TcpServer1Accept接受数据准备,不知是否正确?
      

  12.   

    谢谢!!!
    我换TServerSocket试试。
      

  13.   

    bomdy,谢谢您啦!
    按您的方法调试成功了,我刚用delphi,谢谢您的帮助。
    发了一个短信,请接收。