【问题标题】:Trying to echo text from JTextArea试图从 JTextArea 回显文本
【发布时间】:2015-09-22 10:31:20
【问题描述】:

我真的看不出这个错误在哪里。

我已经为 textAreaTop 组件设置了一个 KeyListener,所以每次按下一个键时,都会向服务器发送一个字符串,服务器会将其回显到 teaxtAreaBottom 组件。我知道 stdIn 还没有被使用。

按下第一个键时,会建立连接,但按下第二个键时出现以下错误:无法获取与 localhost 的连接的 I/O。此外,textAreaBottom 组件没有附加任何内容。

//客户端

    @Override
    public void keyPressed(KeyEvent e) {
    String hostName = "localhost";
     int portNumber = 4000;

    try (Socket echoSocket = new Socket(hostName, portNumber);
         PrintWriter out = new PrintWriter(echoSocket.getOutputStream(),
                    true);
         BufferedReader in = new BufferedReader(new InputStreamReader(
                    echoSocket.getInputStream()));
         BufferedReader stdIn = new BufferedReader(
                    new InputStreamReader(System.in))) {

        String userInput = textAreaTop.getText();
        out.println(userInput);
        textAreaBottom.setText(null);
        textAreaBottom.setText(in.readLine());

    } catch (UnknownHostException ex) {
         System.err.println("Don't know about host " + hostName);
        System.exit(1);
    } catch (IOException ex) {
        System.err.println("Couldn't get I/O for the connection to "
                + hostName);
        System.exit(1);
    }
    }

// 服务器

public static void main(String[] args) throws IOException {

    int portNumber = 4000;

    try {
        ServerSocket serverSocket = new ServerSocket(portNumber);
        Socket clientSocket = serverSocket.accept();
        System.out.println("connection accepted");
        PrintWriter out = new PrintWriter(clientSocket.getOutputStream(),
                true);
        BufferedReader in = new BufferedReader(new InputStreamReader(
                clientSocket.getInputStream()));
        {
            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                out.println(inputLine);
            }
        }
    } catch (IOException e) {
        System.out
                .println("Exception caught when trying to listen on port "
                        + portNumber + " or listening for a connection");
        System.out.println(e.getMessage());
    }
}

任何建议将不胜感激。

谢谢

【问题讨论】:

  • 您是否在每个 keyPressed 事件结束时关闭连接?由于您每次都通过相同的主机名和端口号使用 Socket 打开一个新连接,因此您应该确保关闭连接。
  • 嗨马尔辛。我想我不是……与套接字/网络连接有关的一切都在上面的代码块中。不过,我现在可以正常工作了。我设置程序的方式,每次按下键时都会连接(我认为),所以我应该在按下每个键后关闭 I/O 流和套接字吗?我在想我可以在一个“finally”块中关闭所有三个。
  • 尝试将echoSocket.close()放在try块的末尾。
  • 在这里搜索 Java + Socket + EventDispatchThread (e.i. EDT),从 Swing 中的 Concurency 开始

标签: java swing sockets jtextarea keylistener


【解决方案1】:

问题在于两个小缺陷:

  1. 您应该实现keyReleased() 而不是keyPressed(),因为textAreaTop 中的文本会在keyPressed() 被调用后更新。因此,当调用 keyReleased() 方法时,您的 textAreaTop 包含您输入的最新文本。

  2. 您不应该在每次按键时都创建 Socket 对象。您应该定义 Socket 以及对 keyReleased(前 keyPressed) 匿名类和方法的输入/输出 Streams outside 的引用。因此,每次您按下一个键时,唯一要做的就是将文本从textAreaTopout.println(text) 获取到服务器。在这种情况下,我已经测试了代码并且它工作正常。

祝你好运。

【讨论】:

  • 谢谢 STaefi,我会试试这个。
猜你喜欢
  • 2013-07-04
  • 1970-01-01
  • 2019-02-05
  • 2012-05-27
  • 1970-01-01
  • 2017-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多