java - 如何通过套接字将字符串从线程发送到服务器

标签 java multithreading sockets

在我的线程类中,有一个部分用于向服务器发送信息。我正在尝试通过这样的套接字发送它:

PrintStream p = new PrintStream(sock.getOutputStream());

p.println(thread_name + "found : " + item);

在服务器端,我尝试使用 InputStream 获取信息:

    ServerSocket s1 = new ServerSocket(portNumber);
    System.out.println("Listening");*/

    ArrayList<Socket> sockets_list = new ArrayList<Socket>();
    ArrayList<Scanner> scanners_list = new ArrayList<Scanner>();
    for (int i = 0; i < Thread_Count; i++) {
        Socket news = s1.accept();
        sockets_list.add(news);
        Scanner newSc = new Scanner(sockets_list.get(i).getInputStream());
        scanners_list.add(newSc);
        System.out.println("socket added to server");

    }

    ArrayList<String> results = new ArrayList<String>();
    for (Scanner scanner : scan_list) {
        String res2 = "";
        while (scanner.hasNext()) {
            String res = scanner.next();
            res2 += res + " ";
        }
        if (!res2.equals("")) {
            results.add(res2);

        }

    }

    for (String string : results) {
        System.out.println(string);
    }

当我执行这段代码时,它什么也不输出,或者只输出一个线程的信息。我该如何修复它?

请您给点建议

最佳答案

取自 docs from Scanner对于 hasNext():

This method may block while waiting for input to scan.

只要您的客户端仍然连接,您的 hasNext() 调用就会阻塞,因为没有像文件一样的已知结束(调用不会阻塞)。

注意:这一行没有用:

String res2 = "";

字符串是不可变的,所以如果你给它重新分配一些东西,它将创建一个全新的对象。相反,您应该使用 StringBuilder/StringBuffer。

关于java - 如何通过套接字将字符串从线程发送到服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36946898/

相关文章:

本地机器上的 python udp socket.timeout

java - 如何通过 Servlet 在我的项目文件夹中创建一个文件?

java - 空数组自动初始化内容?

c# - 如何在 C# 中使 webdriver 线程安全?

python - 如何在 python 中正确关闭 gobject 主循环?

c# - UDP 监听器响应客户端

java - 获取 Applet 的屏幕截图?

java - IBM WAS 8.5 出错时重新启动

java - 离开 Activity 时 Android 如何处理后台线程?

c# - 如何通过回调等待外部响应?