使用Java进行TCP编程,私网地址能否访问公网地址

xing_6 2009-11-24 02:28:55
使用Java进行TCP编程,私网地址能否访问公网地址? 详细描述如下:

1 在一公网地址(比如:61.xxx.xx.34)的机器上(简称机器A)运行服务器端程序,服务器端程序由java编写,建立ServerSocket套接字侦听某一端口。

2 在一私网地址(比如:192.168.1.8)的机器上(简称机器B)运行客户端程序,建立TCP连接到公网这台机器的对应端口上, 但是建立连接不成功,抛出Connection timed out 异常。

疑问:为什么连接不成功?

做了一下尝试:
1 在机器A上已经关闭了防火墙。
2 从机器B ping 机器A的IP地址是通的,用端口扫描工具在机器B上扫描机器A, 发现服务器端程序侦听的端口不通。
3 在服务器上运行客户端程序,连接地址127.0.0.1 对应的端口,客户端程序与服务器端程序能够正常连接,但是从机器B上却连接不上。

期盼高手解惑!!!
...全文
231 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
bayougeng 2009-11-27
  • 打赏
  • 举报
回复
啊,我说嘛。过滤的可能不是端口,而是协议。
xing_6 2009-11-27
  • 打赏
  • 举报
回复
问题大概找到了。做了以下尝试:

因为这台公网的机器A可以提供Web服务,通过机器B可以正常访问A机器上的网页,说明A机器web端口是可以正常通讯的,假设web服务用的是 9000端口,把 A机器上提供web服务的程序停掉释放端口9000, 然后用服务器端测试程序侦听 9000端口, 机器B端client程序访问机器A端server程序正常,能够通讯。

因为服务器A上操作系统防火墙是关掉的,猜测可能是在路由器上或加了一层过滤设备把其余数据包过滤掉了,只对特定端口开放。
不过,还是非常感谢 (梦里楚香)的热情帮助!
bayougeng 2009-11-25
  • 打赏
  • 举报
回复
是啊,既然ftp都能通,那证明确实网络是通畅的。
那可能会是什么造成的呢?
在B上
telnet A的IP 61008
这样也不行么?
badcrow 2009-11-25
  • 打赏
  • 举报
回复
和是否私网,公网无关。 如果你的路由、防火墙能过,那么就能访问
xing_6 2009-11-25
  • 打赏
  • 举报
回复
顶起来,上代码。服务器端测试代码:
import java.net.*;
import java.io.*;

public class TCPServer{
public static void main( String args[]){
ServerSocket serverSocket = null;
Socket socket = null;
String inputLine = null ;

try{
serverSocket = new ServerSocket( 61008 );
socket = serverSocket.accept() ;
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader( new InputStreamReader( socket.getInputStream()));

while ((inputLine = in.readLine()) != null) {
System.out.println( inputLine ) ;
}
out.close();
in.close();
socket.close();
}catch( Exception e ){
System.out.println( e ) ;
}
}
}

客户端测试代码:
import java.io.*;
import java.net.*;

public class TCPClient {
public static void main(String[] args) throws IOException {
Socket kkSocket = null;
PrintWriter out = null;
BufferedReader in = null;

try {
kkSocket = new Socket("64.xxx.xxx.218", 61008); //指定要连接的公网IP地址及端口号。
out = new PrintWriter(kkSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(kkSocket.getInputStream()));
out.println("hello");
in.close();
out.close();
kkSocket.close();

}catch (UnknownHostException e) {
System.err.println("Don't know about host: taranis.");
System.exit(1);
}
}
}


以上代码用于测试,在局域网内,客户端可以和服务器端正常通讯,但是服务器程序端放到公网的一台机器上就不可以了。
xing_6 2009-11-24
  • 打赏
  • 举报
回复
我从机器B(私网)上可以ftp登录到机器A(公网)上。
bayougeng 2009-11-24
  • 打赏
  • 举报
回复
你从那台运行client的机器上能用ftp访问到你的主机?
如果是这样,那就太邪门了。
qjcslgnhwayagain 2009-11-24
  • 打赏
  • 举报
回复
不懂,顶一下,等待高手解答
xing_6 2009-11-24
  • 打赏
  • 举报
回复
A是一个公网端点,不是通过路由映射到私网的一台机器上。A机器配置的IP地址就是公网的IP地址,也能够向外提供Web服务和ftp服务。
Busing 2009-11-24
  • 打赏
  • 举报
回复
实际你的ip就是你这个网断路由的地址,另外要作好端口映射
bayougeng 2009-11-24
  • 打赏
  • 举报
回复
你如何确定A一定是一个公网端点呢?
比如,A是局域网的一台机器,通过路由器上网。那你扫描的时候,扫描的实际上就是路由器。

51,410

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧