我有这段代码:
package com.company;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.ServerSocket;
import java.net.Socket;
class MyClass implements Serializable
{
private int i,j;
public MyClass(int i, int j)
{
this.i = i;
this.j = j;
}
public int getJ()
{
return j;
}
public void setJ(int j)
{
this.j = j;
}
public int getI()
{
return i;
}
public void setI(int i)
{
this.i = i;
}
}
class ServerThread extends Thread
{
ServerSocket server;
public ServerThread() throws IOException
{
server=new ServerSocket(14200);
}
@Override
public void run()
{
try
{
Socket client=server.accept();
ObjectInputStream in=new ObjectInputStream(client.getInputStream());
ObjectOutputStream out=new ObjectOutputStream(client.getOutputStream());
int i=in.readInt();
MyClass m=(MyClass)in.readObject();
if(i==m.getI())
{
m.setJ(i);
out.writeObject(m);
}
else
{
m.setI(i);
out.writeObject(m);
}
out.writeUTF("see ya");
}
catch (IOException | ClassNotFoundException e)
{
e.printStackTrace();
}
}
}
public class Main
{
public static void main(String... args) throws IOException, ClassNotFoundException
{
ServerThread serverThread=new ServerThread();
serverThread.setDaemon(true);
serverThread.start();
Socket client=new Socket("localhost",14200);
ObjectInputStream in=new ObjectInputStream(client.getInputStream());
ObjectOutputStream out=new ObjectOutputStream(client.getOutputStream());
out.writeInt(2);
out.writeObject(new MyClass(4,2));
MyClass m=(MyClass)in.readObject();
String s=in.readUTF();
System.out.println(s);
}
}
我的问题是客户端和服务器都挂在这一行:
ObjectInputStream in=new ObjectInputStream(client.getInputStream);
如果我为套接字设置超时,我会得到SocketTimeoutException。
上面的程序只是一个虚拟程序,但显示我的问题,真正的程序是一个服务器 - 客户端应用程序,用于共享文件,其中我实现了我自己的简单协议,它实际上是一个功课。
我们被要求实现数字签名,我创建了自己的帮助类,最后我得到了SignatureWithPublicKey类(由我定义),它保存了签名字节和公钥,我需要在套接字上发送这个对象。
一个简单的解决方案是发送PublicKey.getEncoded以及签名字节但是我想使用ObjectStreams,我需要知道它们为什么不工作。
那么这里的问题是什么?
答案 0 :(得分:3)
Object流有一个小标题。这意味着您甚至无法启动对象输入流,直到已发送和读取标头。但是,在调用ObjectOutputStream之前,您的代码不会发送标头,在这种情况下,您在输入流之后进行操作。即你有死锁。
简而言之,在两种情况下都要交换new ObjectInputStream
和new ObjectOutputStream
的顺序。