java - 尝试从 JTextArea 回显文本

标签 java swing sockets jtextarea keylistener

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

我已经为 textAreaTop 组件设置了一个 KeyListener,因此每次按下某个键时,都会将一个字符串发送到服务器,服务器将其回显给 teaxtAreaBottom 组件。我知道 stdIn 尚未被使用。

当按下第一个键时,会建立连接,但是当按下第二个键时,我收到以下错误:无法获取连接到本地主机的 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());
    }
}

如有任何建议,我们将不胜感激。

谢谢

最佳答案

这个问题是由于两个小缺陷造成的:

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

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

祝你好运。

关于java - 尝试从 JTextArea 回显文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31226171/

相关文章:

java - 按钮 ClickListener 在 LibGDX 游戏中不起作用

java - 文件存储服务器

java - 为什么我的待定更改没有显示在 RTC 中?

android sleep 模式,套接字重置异常

sockets - 使用 golang 从连接到网络接口(interface)的原始套接字读取

python - 如何避免 python 中的僵尸进程?

java - 通过 TCP/IP 接收对象

带有 Eclipse 的 Java - 丢失的设计页面

java - 如何通过java中的mouselisteners获取2D数组(jlabel)的索引?

java - JLabel 之上的 JButton