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()
测试?这段代码没有意义。@user207421TestServer
被多次创建,这样每个客户机都将在自己的线程上,允许同时读写。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");
}
}
}