我在Java中使用输入/输出流时遇到了问题。我的想法是有DataInputStream
来处理接收文本和PrintStream
来从服务器和对象(输出/输入)流向服务器传递消息来处理传递的棋子移动和当前的棋盘图像。 / p>
我的问题是代码在尝试在下面的代码中创建ObjectInputStream
时会挂起。这是因为我试图拥有多个输入和输出流吗?如果可以,我可以使用任何可能的修复方法吗?
Socket sock = new Socket("127.0.0.1", 1716);
input = new DataInputStream(sock.getInputStream());
printer = new PrintStream(sock.getOutputStream());
System.out.println("Test 1");
zelda = new ObjectInputStream(sock.getInputStream());
System.out.println("Test 2");
link = new ObjectOutputStream(sock.getOutputStream());
System.out.println("Test 3");
我的服务器源代码中有很多塞尔达传说,代码相当大。之前的源代码是针对客户端的,虽然服务器连接在这里我称之为ObjectOutputStream。
ObjectOutputStream ganandorf;
for(int i = 0; i < clients.size(); i++)
{
try
{
ganandorf = new ObjectOutputStream(clients.get(i).getOutputStream());
ganandorf.write(1);
ganandorf.flush();
ganandorf.writeObject(something);
ganandorf.flush();
}
答案 0 :(得分:2)
不要尝试在同一个底层连接上使用两种不同的流/读取器/写入器。你会在两端遇到缓冲问题,这基本上是不可能的。
我会使用ObjectInputStream
和ObjectOutputStream
来编写对象。
ObjectInputStream
的构造函数会阻塞,直到它收到由ObjectOutputStream
的构造函数写入的标头,因此如果要构建两者,则必须首先构造ObjectOutputStream
。你不需要写任何东西,也不需要冲洗它,它本身就是这样做的。
答案 1 :(得分:0)
我认为你只能要求输入1个inputStream:
InputStream baseInputStream = sock.getInputStream();
input = new DataInputStream(baseInputStream);
zelda = new ObjectInputStream(baseInputStream);
对于outputStreams
也是如此答案 2 :(得分:-1)
我从未发现 ObjectInputStream 发生了什么,但我切换到DataInputStream并且我正在修改我的代码,因此它将片段名称,x位置和y位置发送到一个字符串中在客户端分手,董事会将相应修改
答案 3 :(得分:-1)
在另一个端口上打开一个套接字并使用它来创建新的流。