Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有套接字的ObjectStreams挂起在服务器端和客户端java上_Java_Sockets_Objectinputstream - Fatal编程技术网

带有套接字的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套接字还将具有发送和接收缓冲。