通过Java套接字侦听端口

我的客户端与之通信的服务器软件定期在端口4000上发送事务消息。我需要逐行将这些消息打印到控制台。 (最终我必须将这些值写入表中,但我将其保存以供日后使用。)

我试过这段代码,但它没有输出任何东西:

package merchanttransaction; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.lang.ClassNotFoundException; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; public class MerchantTransaction { public static void main(String[] args) { try { InetAddress host = InetAddress.getLocalHost(); Socket socket = new Socket("192.168.1.104", 4000); ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); String message = (String) ois.readObject(); System.out.println("Message: " + message); ois.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } 

顺便说一句,我需要能够监视该端口,直到程序终止。 我不确定上面的代码是否能够做到这一点,因为我没有看到代码的任何迭代。

我正在使用在Ubuntu上运行的Java版本1.6.0_24,SE运行时环境(版本1.6.0_24-b07)。

您需要使用ServerSocket 。 你可以在这里找到解释。

你真的想要实现什么? 您的代码所做的是尝试连接到位于192.168.1.104:4000的服务器。 这是发送消息的服务器的地址(因为这看起来像客户端代码)? 如果我在本地运行假服务器:

 $ nc -l 4000 

…并将套接字地址更改为localhost:4000 ,它将工作并尝试从nc创建的服务器读取内容。

你可能想要的是创建一个ServerSocket并监听它:

 ServerSocket serverSocket = new ServerSocket(4000); Socket socket = serverSocket.accept(); 

第二行将阻塞,直到其他一些软件在端口4000上连接到您的机器。然后您可以从返回的套接字读取。 看看这个教程,这实际上是一个非常广泛的主题(线程,协议…)

尝试这段代码,而不是ObjectInputStream

 BufferedReader in = new BufferedReader (new InputStreamReader (socket.getInputStream ())); while (true) { String cominginText = ""; try { cominginText = in.readLine (); System.out.println (cominginText); } catch (IOException e) { //error ("System: " + "Connection to server lost!"); System.exit (1); break; } }