带有套接字的ObjectStreams挂在服务器端和客户端java

时间:2015-12-06 08:45:10

标签: 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
{
    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,我需要知道它们为什么不工作。

那么这里的问题是什么?

1 个答案:

答案 0 :(得分:3)

Object流有一个小标题。这意味着您甚至无法启动对象输入流,直到已发送和读取标头。但是,在调用ObjectOutputStream之前,您的代码不会发送标头,在这种情况下,您在输入流之后进行操作。即你有死锁。

简而言之,在两种情况下都要交换new ObjectInputStreamnew ObjectOutputStream的顺序。