带有套接字的ObjectStreams挂起在服务器端和客户端java上
我有以下代码:带有套接字的ObjectStreams挂起在服务器端和客户端java上,java,sockets,objectinputstream,Java,Sockets,Objectinputstream,我有以下代码: 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 {
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,我需要知道它们为什么不工作
那么这里的问题是什么呢?对象流有一个小标题。这意味着您甚至无法启动对象输入流,直到发送并读取了头。但是,在调用ObjectOutputStream之前,您的代码不会发送头,在本例中,您是在输入流之后执行此操作的。i、 你有一把死锁
简而言之,在这两种情况下,交换
新对象输入流
和新对象输出流
的顺序。就是这么简单,伙计,编程有多奇怪,顺便说一下,在我的代码中还有其他错误,我忘记了out.flush()
,但无论如何,如果我想要缓冲流,也就是说ObjectStreams包装BufferedStreams包装套接字的流?它挂在墙上them@niceman无论哪种方式你都需要冲水。注意:ObjectOutputStream已经有了缓冲,所以它可能没有您想象的那么有用。您的TCP套接字还将具有发送和接收缓冲。