网络环境:
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两个控件做的。
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........
.............................. 2
ID:Integer;
Socket:TCustomWinSocket;
begin
if Combox1.Text='' then
exit;
ID:=strtoint(Combox1.text);
//用已有的Socket句柄建立socket对象
Socket:=TCustomWinSocket.Create(ID);
Socket.SendText(EdtSend.text);
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;
我马上按您的方法试试。
TcpServer1.LocalPort := port;
TcpServer1.Active := True;
或者用其他的方法接受?
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;
TcpServer1.LocalPort := port;
TcpServer1.Active := True;
我理解是为client的Tserver.TcpServer1Accept接受数据准备,不知是否正确?
我换TServerSocket试试。
按您的方法调试成功了,我刚用delphi,谢谢您的帮助。
发了一个短信,请接收。