首页 文章

无法将数据从php套接字客户端发布到java套接字服务器

提问于
浏览
0

我正在使用php编写套接字客户端,我想将一个字符串消息发布到java实现的套接字服务器,但是我试图从php套接字客户端发布数据,java套接字服务器崩溃了java.io.StreamCorruptedException异常 . 下面是我的PHP套接字客户端,Java套接字服务器的代码以及发布消息时引发的错误 .

$fp = fsockopen("127.0.0.1", 1080, $errno, $errstr, 30);
        if (!$fp) {
            echo "$errstr ($errno)
\n"; } else { $out = "hello"; fwrite($fp, $out); while (!feof($fp)) { echo fgets($fp, 128); } fclose($fp); }

java代码

providerSocket = new ServerSocket(1080,10);

System.out.println("Waiting for connection");
        connection = providerSocket.accept();
        System.out.println("Connection received from " + connection.getInetAddress().getHostName());

        out = new ObjectOutputStream(connection.getOutputStream());
        out.flush();
        in = new ObjectInputStream(connection.getInputStream());
        sendMessage("Connection successful");


            try{
                message = (String)in.readObject();


                System.out.println("client>" + message);





            }
            catch(ClassNotFoundException classnot){
                System.err.println("Data received in unknown format");
            }

    }
    catch(IOException ioException){
        ioException.printStackTrace();
    }
    finally{
        //4: Closing connection
        try{
            in.close();
            out.close();
            providerSocket.close();
        }
        catch(IOException ioException){
            ioException.printStackTrace();
        }
    }

我得到的错误

java.io.StreamCorruptedException: invalid stream header: 48656C6C
    at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
    at java.io.ObjectInputStream.<init>(Unknown Source)
    at Provider.run(Provider.java:37)
    at Provider.main(Provider.java:109)
Exception in thread "main" java.lang.NullPointerException
    at Provider.run(Provider.java:85)
    at Provider.main(Provider.java:109)

3 回答

  • 0

    实际上,您正在读取一个Object,但只有当客户端通过 out.writeObject() 写入一个对象时,才能使用它 . 在你的情况下,最好这样写

    fwrite($fp, "Hello world!\n"); // note the newline at the end
    

    并用 BufferedReader.readLine() 读取该行

  • 0

    您正在使用不正确的InputStream,因为您没有发送Java对象 . 如果要发送文本,请使用BufferedReader或其他内容 .

    Socket Java Tutorial .

  • 0

    一些意见/建议

    • 为了从套接字读取数据,您使用 ObjectInputStream ,它使用 different protocol 来读取数据 . 换句话说,它假定正在读取的对象是一个java对象(对象输入流),在您的情况下是php对象 . 您正在传递一个字符串(一个php对象),该字符串最终转换为字节并通过网络发送 .

    • 我建议您只使用 connection.getOutputStream() 并阅读 raw byte array . 然后使用此字节数组创建一个字符串(使用带有字节数组的标准String构造函数) .

相关问题