尝试从JTextArea回显文本

时间:2015-07-05 00:15:18

标签: java swing sockets jtextarea keylistener

我无法真正看出错误在哪里。

我为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());
    }
}

非常感谢任何建议。

由于

1 个答案:

答案 0 :(得分:1)

问题在于两个小缺陷:

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

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

  3. 祝你好运。