【问题标题】:Why am I unable to send text through this Socket?为什么我无法通过此 Socket 发送文本?
【发布时间】:2014-07-05 16:58:20
【问题描述】:

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

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)

【问题讨论】:

  • 因为从服务器上的套接字读取时有缓冲?
  • @jcaron 我认为这不是原因。无论我发送多长时间的文字,它仍然没有看到。
  • 您的服务器套接字由于while (true)而进入无限循环
  • @faizal 以便它可以继续从客户端套接字读取。当我终止客户端进程时,我会看到所有发送的数据。
  • 您发送的行是否以换行符结尾?我不确定 printwriter 是否添加了它们。

标签: java multithreading sockets


【解决方案1】:

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

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

【讨论】:

  • 谢谢,工作.. 很好的答案。为什么我杀死进程后它会起作用?
  • @Koray 因为流关闭,阅读器检测到并返回。
  • 谢谢,为什么我得到这个异常:线程“Thread-0”中的异常 java.util.NoSuchElementException:找不到行?
  • @KorayTugay - 我仍然认为如果你运行你的服务器足够长的时间你会得到StackOverflow error
  • @Koray 因为你有一个无限循环。关闭扫描仪后,它就没有更多元素了。
猜你喜欢
  • 1970-01-01
  • 2020-03-15
  • 1970-01-01
  • 1970-01-01
  • 2016-02-11
  • 2018-10-10
  • 2021-07-09
  • 2015-10-04
  • 1970-01-01
相关资源
最近更新 更多