通过Java套接字监听端口

27

我的客户端和服务器软件会通过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();
        }
    }
}

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

我正在使用Java版本1.6.0_24,SE Runtime Environment(版本1.6.0_24-b07),运行在Ubuntu上。


你正在读取一个对象,但是服务器可能发送的是纯文本,你必须确切地知道发送的内容以便按照相同的数据类型进行读取,祝你好运。 - Hernán Eche
是的,我相信要捕获的消息是纯文本。 - Jhourlad Estrella
3个回答

28
你需要使用ServerSocket。你可以在这里找到解释(链接)

17
你实际想要达成什么目标?你的代码尝试连接到位于192.168.1.104:4000的服务器。这是发送消息的服务器地址吗(因为这看起来像客户端代码)?如果我本地运行一个虚拟服务器:
$ nc -l 4000

如果您将套接字地址更改为localhost:4000,它将正常工作,并尝试从nc创建的服务器中读取一些内容。

您可能需要创建一个ServerSocket并在其上进行侦听:

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

第二行代码会阻塞,直到有其他软件连接到你的计算机的4000端口。然后你可以从返回的套接字中读取数据。查看这个教程,它实际上是一个非常广泛的主题(线程,协议...)。

谢谢Tomasz。我不太确定要使用什么术语。我真的很新。但是用通俗易懂的话来说,我需要一段代码,它将侦听另一个预先制作的程序发送消息的端口。它不需要发送任何东西。它只需要监听即可。 - Jhourlad Estrella
监听通常是服务器的角色,因此您需要像我建议的那样使用ServerSocket。客户端需要一个客户端套接字来连接到这个服务器,就像您在示例中所做的那样(但是在您的代码中,您应该发送而不是接收消息;您的接收代码位于ServerSocket端)。因此,基本上您已经拥有了所有的组件(您和我的代码)来完成任务。 - Tomasz Nurkiewicz
+1 啊,我搞错了。这真的很有启发,Tomasz。我会尝试想出一些东西,并回来问更多问题(希望不用)。非常感谢! - Jhourlad Estrella

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;
    }
}

找不到符号。符号:类 BufferedReader。 抱歉,我是Java的新手 :( - Jhourlad Estrella
你需要导入java.io.*; - Pangolin
没问题!这个解决方案可行吗?也许可以将其与其他人关于使用ServerSocket的建议结合起来使用。 - Pangolin
我没有从客户端收到任何响应。我会进一步检查。 - Jhourlad Estrella

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接