【发布时间】:2017-09-12 05:29:39
【问题描述】:
我正在尝试创建一个可以通过套接字发送带有文本的日志的小型应用程序。当套接字被接受时,该套接字的输入流将像这样存储在 HashMap 中。
private HashMap<Integer,InputStream> allinputsstreams = new
HashMap<Integer,InputStream>();
之后,我将为当前输入流创建一个新的 JFrame
public LogListener(int socketid, SocketListener socketlistener, Gui gui) {
this.socketid = socketid;
this.gui = gui;
this.inputstream = socketlistener.getClient(socketid);
JFrame frame = new JFrame("Log listener");
frame.setLocationRelativeTo(null);
frame.setPreferredSize(new Dimension(framewidth,frameheight));
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
logarea = new JTextArea();
frame.add(logarea);
frame.pack();
frame.setVisible(true);
frame.addWindowListener(this);
listenthread = new Thread(this);
listenthread.start();
}
然后我使用列表中的输入流来接收数据并将其写入 JFrame
public void run() {
input = new DataInputStream(inputstream);
while(!formclosed) {
try {
String addtext = input.readUTF();
addtext = formatText(addtext);
logarea.setText(logarea.getText() + addtext);
} catch (EOFException e) {
System.out.println("Looks like the client has been closed.");
return;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
这适用于接收 1 个 JFrame 上的数据,但是一旦我打开 2 个 JFrame(意味着打开相同的输入流两次),那么所有输入流都不再工作了。我期待至少 1 个输入流仍然可以工作。
【问题讨论】:
-
“输入流都不起作用”是什么意思?你有例外吗?僵局?还有什么?
-
我没有得到任何异常,但是当我打开 1 时它会发送数据并将其写入 JFrame(这就是我想要的)但是当我打开另一个时(打开输入流两次)然后没有输入流发送我需要的数据
-
输入流不是绑定到单独的套接字上吗?为什么要读取相同的输入流两次?
-
是的,但是输入流被放在一个 HashMap 中,其中一个数字作为键,输入流作为值。当我从该 HashMap 打开例如数字 1 时,它会使用该流。之后我打开数字 2 然后它们都工作,因为它们是不同的输入流。但是当我打开 1 号并再次打开 1 号之后,它们都停止工作了。
-
你不能。输入流是流,流的含义是它流过你,一次。如果你想重新阅读它,你必须重新创建它,重新打开文件,重新连接到源(如果你可以的话)等等。
标签: java sockets inputstream datainputstream