我正在使用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 回答
实际上,您正在读取一个Object,但只有当客户端通过
out.writeObject()
写入一个对象时,才能使用它 . 在你的情况下,最好这样写并用
BufferedReader.readLine()
读取该行您正在使用不正确的InputStream,因为您没有发送Java对象 . 如果要发送文本,请使用BufferedReader或其他内容 .
见Socket Java Tutorial .
一些意见/建议
为了从套接字读取数据,您使用
ObjectInputStream
,它使用 different protocol 来读取数据 . 换句话说,它假定正在读取的对象是一个java对象(对象输入流),在您的情况下是php对象 . 您正在传递一个字符串(一个php对象),该字符串最终转换为字节并通过网络发送 .我建议您只使用
connection.getOutputStream()
并阅读 raw byte array . 然后使用此字节数组创建一个字符串(使用带有字节数组的标准String构造函数) .