套接字编程 - 从开放端口读取消息

时间:2018-02-01 04:40:42

标签: java sockets tcp

我正在尝试从我系统上的所有开放端口读取消息。但我没有得到任何输出。以下是代码:

public class ReadPort {
    public static void main(String[] args) {
        for(int port = 0; port <= 65535; ++port) {
            try {
                Socket socket = new Socket();
                socket.connect(new InetSocketAddress("127.0.0.1", port), 1);
                BufferedReader reader = new BufferedReader(new 
InputStreamReader(socket.getInputStream()));
                String text = reader.readLine();
                System.out.println("Message from Port #" + port + " : " + text);
                socket.close();
            } catch(IOException ioe) {
        }
    }
}

例外:

java.net.SocketTimeoutException
at java.net.SocksSocketImpl.remainingMillis(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at ReadPort.main(ReadPort.java:6)

2 个答案:

答案 0 :(得分:0)

您尝试连接0 to 65535的所有端口,这并不意味着您可以连接所有端口。并非所有端口都是侦听连接,用于连接侦听必须需要TCP或UDP服务器。

您可以在一般情况https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers中找到有关端口和使用哪个端口的服务器的信息。所以基本上在你的机器上可用端口可能是10 to 100(可能与否)。

现在您可以连接那些10 to 100套接字服务器。但在连接后,它不确定服务器或其他方是否会发送内容。在大多数情况下,通信基于request(client) and response(server)进行。在这里,你是一个客户,这就是为什么你没有得到任何东西。

答案 1 :(得分:0)

你对套接字如何工作有一些严重的误解。

  1. 系统上的大多数端口都会拒绝连接请求。只有绑定到正在运行的服务器进程的端口才会接受连接。
  2. 成功建立连接后,您通常会发送数据以从服务器发出请求,即HTTP GET请求。许多服务器等到您在响应之前发送内容。正如您已经看到的那样,尝试从连接的套接字读取而不先发送任何内容只会超时,尽管某些服务器(如SMTP)会发送您可以读取的横幅消息。
  3. 如果您想做一些有意义的事情,您必须知道您连接的服务器进程以及它理解的协议,以便知道要发送什么。这就是"standard" ports的原因,例如HTTP为80,SSH为22。
  4. 我强烈建议您浏览Java Tutorial on Networking