2015-10-05 50 views
0

我有一个游戏的服务器/客户端模型,但它始终卡在ObjectInputStream初始化。Java Socket停留在新ObjectInputStream()

这里是代码为客户端的启动方法:

public void start(){ 
try { 
     Socket s = new Socket("127.0.0.1", 24680); 
     Thread.sleep(1000); 
     ois = new ObjectInputStream(s.getInputStream()); // stuck here 
     oos = new ObjectOutputStream(s.getOutputStream()); 
     startGame(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
} 

这里是服务器代码:提前

try { 
    InputStream fis = socket.getInputStream(); 
    ObjectInputStream ois = new ObjectInputStream(fis); 
    while (true) { 
     ArrayList <Dot> lists = (ArrayList <Dot>) ois.readObject(); 
     for (Socket s: sockets) { 
      ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream()); 
      oos.writeObject(lists); 
     } 
    } 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

谢谢!

+0

netstat显示连接吗?创建服务器套接字的服务器代码在哪里?这里没有足够的信息来帮助。 –

+0

它可能是网络连接问题吗?先尝试用telnet连接到你的服务器。 – ilj

+0

你有三个在这。其中只有一个是正确的。你在'new ObjectInputStream()',而不是'getInputStream()'或'new ObjectOutputStream()'被阻止。 – EJP

回答

3

您需要在至少一个末端构建 之前构建ObjectOutputStream,优选为避免发生事故。否则new ObjectInputStream()块试图读取尚未被同行的new ObjectOutputStream()尚未写入流头,因为他也被挡在new ObjectInputStream().

其他说明:

  • 您必须使用相同的对象流的不同于你当前的代码,两端的套接字的生命。原因是一样的:流头。如果您不断创建新的ObjectOutputStreams,您将不断编写新的流标头,这是对等方不会期望或不明白的。
  • 删除sleep()。在网络代码中不需要睡觉。这实际上是浪费时间。货物崇拜节目。