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

时间:2016-04-29 20:25:45

标签: 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);
    }

当我执行此代码时,它只输出任何内容或只输出一个线程的信息。我该如何解决?

Ty for your advice

1 个答案:

答案 0 :(得分:1)

取自docs from Scanner for hasNext():

  

此方法可能会在等待输入扫描时阻塞。

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

注意:这一行没用:

String res2 = "";

String是一个imutable,所以如果你重新分配它,它将创建一个全新的对象。相反,您应该使用StringBuilder / StringBuffer。