Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-使用套接字打印到多个输出_Java_Sockets - Fatal编程技术网

Java-使用套接字打印到多个输出

Java-使用套接字打印到多个输出,java,sockets,Java,Sockets,我正在尝试创建一个多人可以连接的多线程聊天室。这样做的目的是,当一个人发送一条消息时,该消息会打印在其他人的屏幕上。以下是服务器代码: package edu.fcps.ab; import java.io.*; import java.net.*; import java.util.*; public class TestServer implements Runnable{ private int port; public static ServerSocket serve

我正在尝试创建一个多人可以连接的多线程聊天室。这样做的目的是,当一个人发送一条消息时,该消息会打印在其他人的屏幕上。以下是服务器代码:

package edu.fcps.ab;
import java.io.*;
import java.net.*;
import java.util.*;

public class TestServer implements Runnable{
    private int port;
    public static ServerSocket serverSock;
    public static Vector<PrintWriter> outputs = new Vector<PrintWriter>();
    public PrintWriter output;
    public BufferedReader input;
    public TestServer(int p) {
        port = p;
    }
    public static void main (String args[]) {
        Scanner scan = new Scanner(System.in);
        System.out.println("Enter port number");
        int port = scan.nextInt();
        TestServer ts = new TestServer(port);
        Thread t = new Thread(ts);
        t.start();
    }

    @Override
    public void run() {
        try {
            if(serverSock == null)
                 serverSock = new ServerSocket(port);
            Socket sock = serverSock.accept();
            TestServer ts = new TestServer(port);
            Thread t = new Thread(ts);
            t.start();
            output = new PrintWriter(sock.getOutputStream(), false);
            outputs.add(output);
            input = new BufferedReader(new InputStreamReader(sock.getInputStream()));
            while(t.isAlive()) {
                String message = input.readLine();
                if(message != null) {
                    System.out.println(message);
                    for(PrintWriter w : outputs) {
                        w.println(message);
                        w.flush();
                    }
                }
            }
        } catch(Exception e) {
            System.out.println("An error occurred");
            e.printStackTrace();
        }

    }

    public PrintWriter getOutput() {
        return output;
    }
}
目前,多人可以连接到它,它会在服务器端打印出所有消息,但不会在所有客户机上打印这些消息。为什么会这样

…但并不是所有的客户端都会显示这些消息。为什么会这样


这是因为所有客户端都调用stdin.readLine()并在输入行可用之前将其阻塞;此后,他们继续
,而(true)
循环并打印最多一条消息,然后再次阻塞
stdin.readLine()

是否每个消息在随机客户端上只显示一次?@0TTT0否,消息不会在任何客户端上显示为什么要创建
TestServer
两次?为什么要进行
isAlive()
测试?这段代码没有意义。@user207421
TestServer
被多次创建,这样每个客户机都将在自己的线程上,允许同时读写。
isAlive()。请参阅Java教程的“自定义网络”部分。
package edu.fcps.ab;
import java.io.*;
import java.net.*;
import java.util.*;
public class TestClient implements Runnable{
    private String username;
    public PrintWriter out;
    public static void main (String args[]) {
        TestClient tc = new TestClient();
        Thread t = new Thread(tc);
        t.start();
    }

    @Override
    public void run() {
        Scanner s = new Scanner(System.in);
        System.out.println("Enter port");
        int port = s.nextInt();
        String ip = "127.0.0.1";
        try {
            Socket sock = new Socket(ip, port);
            System.out.println("Successfully connected");
            System.out.println("Enter username");
            username = s.next();
            System.out.println("Welcome " + username);
            out = new PrintWriter(sock.getOutputStream(), true);
            out.println(username + " connected");
            InputStream stream = sock.getInputStream();
            Scanner input = new Scanner(stream);
            BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
            String sent;
            while(true) {
                if(stream.available() > 0) {
                    if(input.hasNextLine()) {
                        String message = input.nextLine();
                        String[] split = message.split(" ");
                        if(!(split[0].contains(username)))
                            System.out.println(message);
                    } 
                }
                sent = stdin.readLine();
                if(sent != null) {
                    out.println(username + ": " + sent);
                }
            }
        } catch(Exception e) {
            out.println(username + " disconnected");
        }
    }
}