为什么我无法通过此Socket发送文本?

时间:2014-07-05 16:58:20

标签: java multithreading sockets

这是我所拥有的服务器的代码:

public class XXServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(4545);
        while (true) {
            Thread newThread = new Thread(new XXServerRunner(serverSocket.accept()));
            newThread.start();
        }
    }
}

我将为每个接受的套接字提供一个单独的线程:

public class XXServerRunner implements Runnable {
    Socket socket;
    public XXServerRunner(Socket socket) {
        this.socket = socket;
    }
    @Override
    public void run() {
        try {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            while (true) {
                String readLine = bufferedReader.readLine();
                if(readLine!=null) {
                    System.out.println(readLine);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这就是我运行客户端的方式:

public class XXClient {

    Socket socket;
    PrintWriter printWriter;

    public static void main(String[] args) throws IOException {
        XXClient xxClient = new XXClient();
        xxClient.setSocket(new Socket("localhost",4545));
        XXClientDataSender xxClientDataSender = new XXClientDataSender(xxClient);
        Thread xxClientDataSenderThread = new Thread(xxClientDataSender);
        xxClientDataSenderThread.start();
    }

    public PrintWriter getPrintWriter() {
        return printWriter;
    }

    public void setSocket(Socket socket) throws IOException {
        this.socket = socket;
        this.printWriter = new PrintWriter(socket.getOutputStream());
    }

    public void sendText(String stringToBeSent) {
        printWriter.write(stringToBeSent);
        printWriter.flush();
    }
}

我想要实现的是另一个发送文本的线程,所以我有这个:

public class XXClientDataSender implements Runnable {
    XXClient xxClient;
    Scanner scanner = new Scanner(System.in);
    public XXClientDataSender(XXClient xxClient) {
        this.xxClient = xxClient;
    }
    @Override
    public void run() {
        while (true) {
            String stringToBeSent = scanner.nextLine();
            xxClient.sendText(stringToBeSent);
        }
    }
}

当我运行我的代码时会发生什么,我在控制台中键入文本并按Enter键几次,我在运行ServerSocket的控制台中看不到任何内容。但是,当我停止执行主要方法时客户端(我的意思是,当我杀死客户端的Java进程时,我称之为Java进程),在服务器的控制台中,我看到现在看到了所有文本。为什么会这样?

如果我说的不清楚,就像这样: 启动服务器 启动客户端 输入一些文字,点击输入..没什么 输入一些文字,点击输入..没什么 杀死客户端的流程 现在所有文本都由服务器读取。

为什么?

我杀死客户端进程后,我也得到了这个例外:

Exception in thread "Thread-0" java.util.NoSuchElementException: No line found
    at java.util.Scanner.nextLine(Scanner.java:1585)
    at XXClientDataSender.run(XXClientDataSender.java:20)
at java.lang.Thread.run(Thread.java:745)

1 个答案:

答案 0 :(得分:4)

每次发送时都在客户端代码中写一个换行符。

您正在使用BufferedReader#readLine(),它需要换行符号或流的结尾。