用于在tcp端口进行双向通信的线程套接字处理程序

时间:2010-05-08 19:03:17

标签: java multithreading sockets tcp

我想制作一个用java编写的聊天应用程序。

一台计算机将托管服务器,另一台计算机将启动套接字[tcp port]。

从我读到的内容中应该有一个循环,它将不断读取套接字,这意味着它会使代码卡住。

我有一个鼠标释放'actionperformed'的按钮,我想知道它是否会与不断读取套接字的循环一起工作,这样它也会发送我写的信息。

如果我必须通过它,我想知道run()方法是否必须是无效的,因为如果我通过线程它将意味着创建一个新类,整个GUI是一个包含文本区域的大类,它是私人的。

另外,如何将套接字中的信息直接提取到文本区域(假设textarea变量名为“chatOutput”)?

2 个答案:

答案 0 :(得分:1)

我认为这是你的情况:

您有一个带有用于输入聊天消息的文本区域的GUI,以及一个用于向聊天室提交新消息的按钮。您想通过循环Socket的InputStream来保持一些面板更新聊天消息流,但也希望能够在循环使用InputStream时写入Socket的OutputStream。

这是我对客户端代码的建议:

Socket con = new Socket(host, port);
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
PrintWriter out = new PrintWriter(con.getOutputStream(), true);
...
Thread t = new Thread(new Runnable() {
    public void run() {
        while(con.isConnected()) {
            String line = in.readLine();
            // update your chat panel with line
        }
    }
});
t.start();
...

在你的行动中:

...
out.println(/*contents of the text box*/);
// clear contents of text box
// ?update panel?
...

答案 1 :(得分:0)

您的问题可能有点模糊,但我认为您的第一个问题的答案是否定的,它不会,您的无限会干扰正常操作并阻止事件调度线程为您的侦听器提供服务。 (我对此并不是100%肯定,但我正在努力寻找更长的时间)。

第二个答案是肯定的,你需要按照Finbarr的建议来修改你的应用程序。 run方法是void,是的,因为它由Runnable interface

指定

不太清楚你的意思:

  

...我说它会创建一个新类,整个GUI是一个包含文本区域的大类,它是私有的。 ...

你想保持一个班级,或者什么? 如果要保留一个.java文件,可以在类中定义私有类?出于某种原因。

对于与GUI的通信,您可以在线程中使用诸如此类调用之类的内容来读取套接字:

java.awt.EventQueue.invokeLater(new Runnable() {
  public void run() {
     chatoutput.setText("output text text");
  }
});

您需要创建一个实现Runnable接口的类,并在构造函数中将“chatoutput”变量传递给它,这样它就可以用来调用上面的一小段代码。

如果您需要更复杂的GUI交互,请在此处查看此提示。 GUI/application communication