我正在使用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教程。
事实上,您正在读取一个Object,但只有当客户端通过out.writeObject()
写入对象时,这才有望工作。在你的情况下最好这样写
fwrite($fp, "Hello world!'n"); // note the newline at the end
并用BufferedReader.readLine()
读取该行
一些意见/建议
-
为了从套接字读取数据,您使用
ObjectInputStream
,它使用不同的协议来读取数据。换句话说,它假设正在读取的对象是一个java对象(对象输入流),在您的情况下它是php对象。您正在传递一个字符串(它是php对象),该字符串最终转换为字节并通过有线发送。 -
我建议您只使用
connection.getOutputStream()
并读取原始字节数组。然后使用这个字节数组创建一个字符串(使用采用字节数组的标准string构造函数)。