2012-03-06 321 views
0

我正在编写服务器客户端应用程序。客户端通过不同的流向服务器发送某种数据。一旦我在主要方法中放置这样的流,程序什么都不做;也不例外只是空控制台:通过套接字流式传输

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"); 
      } 

有一次,我从main方法的部分删除此流oin = new ObjectInputStream(socket.getInputStream());程序抛出EOFException类或连接复位异常。 上述代码中的特殊之处在于,程序什么都不做,并且不会引发异常?

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

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 (din.readBoolean()) { 

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

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

    } 

我不能在这里放置我所有的代码,这是我的任务。

ooops,抱歉的人,发现了错误。一些逻辑错误,服务器期待一些输入,但客户拒绝发送它。

+0

究竟你在哪里得到'EOFException'?看起来好像你没有显示整个代码 – yegor256 2012-03-06 23:17:18

+0

那么,在代码中没有错误......所以这就解释了为什么没有发生这种情况。 – Jon 2012-03-06 23:17:20

回答

7

你在这里犯了几个错误。

  1. 您正在同一套接字上使用多个流。不要这样做,他们只会互相混淆。由于您需要对象I/O,因此只需使用ObjectInputStreamObjectOutputStream即可。

  2. 错误的施工顺序。您必须在ObjectInputStream之前构建两端的ObjectOutputStream

  3. 您正在使用具有不同生命周期的流。你还没有遇到问题,但最终这将导致StreamCorruptedException。在两端使用与Socket相同的ObjectInputStreamObjectOutputStream

  4. 你可能还需要阅读的Javadoc ObjectOutputStream.reset().writeUnshared()了解他们在做什么,以及为什么你可能需要调用一个或另一个人。