当前位置: 首页 > 面试题库 >

通过TCP / IP接收对象

上官斌
2023-03-14
问题内容

我要通过TCP / IP编写程序,我应该通过客户端或服务器发送对象,当我想发送或接收字符串但尝试读取对象时,它是正确的:

private Socket client;

public ThreadedClient(Socket client) {
    this.client = client;
}

@Override
public void run() {
        try {
            ObjectInputStream objIn = new ObjectInputStream(client.getInputStream());
            while(true){
                try {
                    Object fromClient = objIn.readObject();

                } catch (ClassNotFoundException e) {e.printStackTrace();}
            }
        } catch (IOException e) {e.printStackTrace();}
    }

我收到一个例外:

java.io.StreamCorruptedException: invalid stream header: 306E6165
    at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
    at java.io.ObjectInputStream.<init>(Unknown Source)
    at org.bihe.serverSocket.ThreadedClient.run(Server.java:137)
    at java.lang.Thread.run(Unknown Source)

它指的是这一行:

    ObjectInputStream objIn = new ObjectInputStream(client.getInputStream());

这是我的服务器代码:

            ServerSocket ss = new ServerSocket(8800);
            while(true){
                Socket newClient = ss.accept();

                System.out.println(">>>> Client number " + (++counter) + " connected.");
                OutputStream outputStream = newClient.getOutputStream();
                PrintWriter sender = new PrintWriter(outputStream);
                sender.println(true);
                sender.flush();
                ThreadedClient client = new ThreadedClient(newClient);
                clients.add(client);
                new Thread(client).start();

客户端代码:

sc = new Socket("127.0.0.1", 8800);
            InputStream inputStream = sc.getInputStream();
            Scanner scanner = new Scanner(inputStream);
            boolean s = scanner.nextBoolean();
            if(s){
                System.out.println("Client connected successfully.");
                return true;
            }else{
                System.out.println("Ohhh, Some problem happened, try again later!");
            }

谁能解释我发生了什么,这个例外是什么,为什么我收到这个例外?


问题答案:

只是摆脱发送和接收布尔值的麻烦。这是多余的。如果在创建连接时遇到问题,则不会创建套接字:而是抛出异常。您会将所有内容与同一套接字上的多个流混淆。不要那样做

在您的读取对象循环中,您需要分别捕获EOFException,并在获取它时关闭套接字并退出循环。如果还有其他IOException,请记录它,关闭套接字,然后退出循环。



 类似资料:
  • 我正在尝试用snmp V3实现一个简单的NMS。2 api。目标是通过TCP接收SNMP通知。 问题是我只通过UDP接收通知。。。我用SNMP4J API在java中实现了一个代理,但只有通过UDP发送时才起作用。 我已经搜索了一些示例,但我只找到了代理通过UDP向snmp管理器发送陷阱/通知的示例。。。。 我还发现:http://lists.agentpp.org/pipermail/agent

  • 我在JAVA中通过TCP接收字节数据包时遇到了一些问题。我的TCPServer类发送207字节的数据包。当我发送一个数据包时,控制台中的程序显示“读取207字节的数据包”然后停下来。在下一个数据包继续执行时,显示“多重测量”和“读取1868767867字节数据包”。之后,接收将永远停止。我不知道它为什么接收1868767867字节。我在wireshark中检查它,服务器总是发送207字节。 这是我

  • 我正试图为Android Wear开发一个应用程序。为了在我的Moto 360手表(没有USB端口)上测试我的应用程序: > 我通过USB将手机连接到电脑上。 我打开手机上的Android Wear companion应用程序,启用了“蓝牙调试”。 我打开手表上的开发人员选项,启用了“ADB调试”和“蓝牙调试”。 我打开电脑上的一个终端并发出命令 我点击了Android Studio中的“运行”按

  • 问题内容: 我已经用套接字卡住了4h,我使用的方式是只有一个应用程序作为客户端和服务器,一旦客户端连接, 它将与新客户端一起打开theard,并等待消息。 一旦消息发送到服务器,客户端将收到响应,该部分正在正常工作。 客户专区的一部分: 服务器支持2条消息,第一条是“列表”,发送一条命令是“获取值”。 如果客户端将请求命令“列表”,它将运行以下命令:有一个“服务器/客户端”,它正在发送请求并接收一

  • 这是我的python modbus tcp通信代码,它在这条线路上等待,然后停止连接,这是我的错误: (如果我使用从程序也不工作)在我的客户端,我使用这个代码: 这是主控端:

  • 我在网上搜索了很多,但是没有找到通过套接字发送对象并按原样接收的解决方案。我知道它需要酸洗,我已经做过了。将其转换为字节,然后从另一方面接收。但如何将这些字节转换为该类型的对象。 这是在客户端将对象转换为StringIO并发送到服务器的代码。在服务器端,我得到字节。现在我正在搜索要再次转换为StringIO的字节,以便获得对象值。 在代码中,对象被包装在StringIO中,并通过套接字发送。任何更