Java 通过套接字的流

Java 通过套接字的流,java,sockets,exception,stream,Java,Sockets,Exception,Stream,我正在编写服务器客户端应用程序。客户端通过不同的流向服务器发送某种数据。一旦我把这样的流放在main方法中,程序就什么也不做了;没有例外,只有空控制台: try { socket = new Socket("localhost", 4050); din = new DataInputStream(socket.getInputStream()); oin =

我正在编写服务器客户端应用程序。客户端通过不同的流向服务器发送某种数据。一旦我把这样的流放在main方法中,程序就什么也不做了;没有例外,只有空控制台:

try {
                socket = new Socket("localhost", 4050);                     
                din = new DataInputStream(socket.getInputStream());
                oin = new ObjectInputStream(socket.getInputStream());
                dout = new DataOutputStream(socket.getOutputStream());                     


            } catch (UnknownHostException e) {              
                System.out.println("Exception: the host is unknown");
            } catch (IOException e) {
                System.out.println("I/O exception thrown by socket");
            }
一旦我删除这个流
oin=newobjectinputstream(socket.getInputStream())程序从主方法的该部分抛出EOFEException或连接重置异常。
上面的代码有什么特别之处,以至于程序什么也不做,也不抛出异常

一旦您将提到的流放入一个单独的方法中

private static MessageObject readObject(){
        MessageObject mo = null;

        try{
             oin = new ObjectInputStream(socket.getInputStream());
             mo = (MessageObject)oin.readObject();

        } 
        catch(IOException e){
            System.err.println(e.getCause());
        }
        catch(ClassNotFoundException e){
            System.err.println(e.getCause());
        }
        return mo;
    }
它抛出以下异常:

Exception in thread "main" java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.io.DataInputStream.readBoolean(Unknown Source)
    at Server.main(Server.java:77)
在服务器上,它位于if分支上:

if (din.readBoolean()) {

        ObjectInputStream oin = new ObjectInputStream(s.getInputStream());
        MessageObject o = (MessageObject)oin.readObject();

        // server saves the whole thing
        MessageDB.add(o);

    }
我不能把我所有的代码都放在这里,这是我的任务


哦,对不起,大家,错误已经被发现了。一些逻辑错误,服务器需要一些输入,但客户端拒绝发送。

您在这里犯了几个错误

  • 您正在同一套接字上使用多个流。不要那样做,他们只会互相混淆。当您需要对象I/O时,只需对所有内容使用
    ObjectInputStream
    ObjectOutputStream

  • 施工顺序不正确。必须在两端的
    ObjectInputStream
    之前构造
    ObjectOutputStream

  • 您正在使用具有不同生命周期的流。您还没有遇到问题,但最终会导致
    StreamCorruptedException
    。在套接字的两端使用相同的
    ObjectInputStream
    ObjectOutputStream

  • 您可能还需要阅读
    ObjectOutputStream.reset()
    .writeUnshared()
    的Javadoc,以了解它们的功能,以及为什么需要调用其中一个


  • 您在哪里得到的
    EOFEException
    ?看起来你没有显示整个代码,代码中没有错误,所以这就解释了为什么没有发生任何事情。