【问题标题】:Can't Post data from php socket client into java socket server无法将数据从 php 套接字客户端发布到 Java 套接字服务器
【发布时间】:2012-08-18 12:25:36
【问题描述】:

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

$fp = fsockopen("127.0.0.1", 1080, $errno, $errstr, 30);
        if (!$fp) {
            echo "$errstr ($errno)<br />\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)

【问题讨论】:

    标签: java php sockets post


    【解决方案1】:

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

    Socket Java Tutorial

    【讨论】:

    • 已解决,我使用了 BufferedReader 并且可以正常工作,谢谢 nashuald
    【解决方案2】:

    事实上,您正在读取一个对象,但这只有在客户端通过out.writeObject() 写入一个对象时才会起作用。在你的情况下最好这样写

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

    并使用BufferedReader.readLine()阅读该行

    【讨论】:

    • 这已经在我的代码中使用了,但我使用了 BufferedReader,感谢 Rffaele,它可以正常工作
    【解决方案3】:

    一些cmets/建议

    1. 为了从套接字读取数据,您使用的是ObjectInputStream,它使用不同的协议来读取数据。换句话说,它假设正在读取的对象是一个 java 对象(object-input-stream),在您的情况下是 php 对象。您正在传递一个字符串(它是一个 php 对象),该字符串最终转换为字节并通过网络发送。

    2. 我建议您只使用connection.getOutputStream() 并读取原始字节数组。然后使用这个字节数组创建一个字符串(使用采用字节数组的标准 String 构造函数)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-05
      • 1970-01-01
      • 2016-07-17
      • 2014-03-10
      • 2017-06-17
      • 2016-07-19
      • 2017-04-30
      • 1970-01-01
      相关资源
      最近更新 更多