我的客户端与之通信的服务器软件会定期在端口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)。
答案 0 :(得分:25)
您需要使用ServerSocket
。您可以找到解释here。
答案 1 :(得分:13)
你真正想要实现的目标是什么?您的代码所做的是尝试连接到位于192.168.1.104:4000
的服务器。这是发送消息的服务器的地址(因为这看起来像客户端代码)?如果我在本地运行虚假服务器:
$ nc -l 4000
...并将套接字地址更改为localhost:4000
,它将起作用并尝试从nc
创建的服务器中读取内容。
ServerSocket
并听取它:ServerSocket serverSocket = new ServerSocket(4000);
Socket socket = serverSocket.accept();
第二行将阻塞,直到其他一些软件在端口4000上连接到您的计算机。然后您可以从返回的套接字读取。看看this教程,这实际上是一个非常广泛的主题(线程,协议......)
答案 2 :(得分:4)
尝试使用这段代码,而不是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;
}
}