【问题标题】:unable to connect to linux machine through socket无法通过socket连接到linux机器
【发布时间】:2016-09-27 09:35:16
【问题描述】:

我有一台运行在装有 centos 7 的 linux 机器上的服务器。 在机器上,我运行一个代码来管理客户端与服务器的连接。 这是我的代码:

public class ServerMain_mng {
final static int nPort = 3333;

public static void main(String[] args) throws IOException {
    new ServerMain_mng();
}

public ServerMain_mng(){
    try {
        ServerSocket sSocket = new ServerSocket(3333);
        System.out.println("Server started at: " + new Date());
        System.out.println("===============================================\n");

        while(true) {
            System.out.println("waiting for connection");
            //Wait for a client to connect
            Socket socket = sSocket.accept();
            socket.setSoTimeout(30000);
            //Create a new custom thread to handle the connection
            ClientThread cT = new ClientThread(socket, nPort);
            //Start the thread!
            new Thread(cT).start();  
        }
    } 
    catch(IOException ex) {ex.printStackTrace();}
}}

问题是当客户端尝试连接到服务器时,代码没有通过Socket socket = sSocket.accept(); 行。

我应该注意,我在笔记本电脑上运行相同的代码,作为客户端从本地主机连接,它工作正常。 我检查了路由器中的端口转发,并且指定的端口是打开的。

可能是什么问题?任何想法如何解决它? 任何帮助将不胜感激。

【问题讨论】:

  • 你需要检查你的linux机器上是否运行了防火墙。尝试以 root 身份运行 service iptables stop 以在测试服务器时禁用它。如果这不起作用,您应该使用在您的服务器机器上运行的 wireshark/tcpdump 来调试您的网络,这样您就可以 100% 验证客户端连接到达您的 linux 服务器(即端口转发工作正常)
  • 我已经使用firewall-cmd --zone=public --add-port=3333/tcp --permanent将端口添加到防火墙。
  • 然后你需要开始用 tcpdump 调试你的网络。如果您从 localhost 测试它,您的服务器是否工作?如果您从同一本地网络上的另一台主机测试它是否有效? (您可以使用 telnet 测试这两个)如果您完全禁用防火墙,它是否有效(测试需要很短的时间,所以即使 firewall-cmd 理论上应该修复它也是值得的) .关键是您需要将问题缩小到您的服务器代码(工作正常,因为您提到它可以在另一台机器上工作)、您的服务器机器、您的路由器、您的客户端

标签: java linux sockets network-programming


【解决方案1】:

sSocket.accept() 是一个阻塞调用,它应该保持阻塞,直到某个客户端使用它正在侦听的同一端口连接到它。

 public class Client {
         final static int nPort = 3333;
         public static void main(String[] args) throws IOException {
         Socket sock=new Socket(IP of Server, nPort)
         System.out.println("connected to: +sock.getRemoteSocketAddress())
      //send additional data needed for the server using the socket's outputputStream
            }
            }

在服务器上,

 ClientThread cT = new ClientThread(socket);
  //Start the thread!
  new Thread(cT).start();

【讨论】:

  • 我知道。我试图在指定的端口上连接它,但没有任何反应。正如我所说,在我的笔记本电脑上运行良好。
  • 是的。客户端线程?如果它永远达不到这一点,它将如何帮助你?
  • 您应该在连接到服务器端口的单独进程中创建客户端,然后在此代码中创建另一个线程来处理您想要执行的任务。
  • 好的。为什么会有不同的表现?你建议我怎么做?能举个例子吗?
猜你喜欢
  • 2019-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多