2012-12-21 103 views
-3

我试图建立两个套接字之间的通信,而不使用任何服务器套接字。我知道服务器Socket有ServerSocket.accept()方法,它等待传入的连接。但是,当我尝试打开一个套接字不具有服务器套接字的IP,我不断收到一个例外:2客户端套接字无serverSocket

java.net.ConnectException: Connection refused: connect 
    at java.net.DualStackPlainSocketImpl.connect0(Native Method) 
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:69) 
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) 
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) 
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) 
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:157) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:391) 
    at java.net.Socket.connect(Socket.java:579) 
    at java.net.Socket.connect(Socket.java:528) 
    at java.net.Socket.<init>(Socket.java:425) 
    at java.net.Socket.<init>(Socket.java:208) 
    at client1.<init>(client1.java:13) 
    at client1Main.main(client1Main.java:9) 

这是即时通讯的先执行代码:

public class client1 { 
    public client1() { 
     try { 
      Socket socket = new Socket("127.0.0.1",15123); 
      BufferedReader in 
       = new BufferedReader(
         new InputStreamReader(
          socket.getInputStream())); 
       PrintWriter out 
       = new PrintWriter(
         new OutputStreamWriter(
          socket.getOutputStream())); 
       while(true) { 
        System.out.println(in.readLine()); 
       } 
     } catch (UnknownHostException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

} 

public class client1Main { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    new client1(); 
} 

}

有没有我想念的东西?

+1

为什么没有服务器套接字?这根本不符合逻辑。 –

回答

0

你根本无法做到这一点。

您需要在您尝试连接的端口上进行侦听,并使用服务器套接字来完成。

TCP没有解决方法。

+0

但是这里的问题至少在我的应用程序中(这段代码只是用于测试),如果我为该端口创建一个侦听器,那么来自应用程序外部的任何连接都可能通过该端口发送数据。这是一种没有任何保护的泄漏。 –

+0

@BarışcanKayaoğlu对于任何其他套接字API都是如此,你会发现。 –

+1

@BarışcanKayaoğlu:没有服务器套接字不能解决这个问题。任何人都可以在您的方案中连接到您的客户。 – Mat

2

您使用的工具是错误的工具。不使用ServerSocket建议不使用TCP。这留下了UDP,这意味着你应该切换到使用DatagramSocket

+0

我明白了。不幸的是,在我的情况下,我受限于TCP。但我明白你的意思,感谢你的快速回复。 –