繁体   English   中英

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

[英]Can't Post data from php socket client into java socket server

我正在使用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 =新的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)

您使用的是不正确的InputStream,因为您没有发送Java对象。 如果你想发短信,使用的BufferedReader或别的东西。

请参阅Socket Java教程

实际上,您正在读取对象,但是只有在客户端通过out.writeObject()写入对象时,这种方法才有效。 在你的情况下最好这样写

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

并使用BufferedReader.readLine()读取行

一些意见/建议

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

  2. 我建议您只使用connection.getOutputStream()并读取原始字节数组 然后,创建使用此字节数组(使用标准String构造这需要字节阵列)的字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM