我正在尝试建立一个简单的聊天客户端/服务器对,但遇到了困难。我基本上一切正常,除了当我在一个客户端上发送消息时,它仅发送回发送消息的客户端。
这是我的服务器代码:
import java.io.*;
import java.net.*;
import java.util.*;
public class ChatServer
{
public static ServerSocket servSock;
public static int port;
protected List<ChatHandler> clients;
public static void main(String[] args) throws IOException
{
System.out.println("Applegate Chat Server is now starting.");
try
{
port = Integer.parseInt(args[0]);
servSock = new ServerSocket(port);
System.out.println("Now listening on port " + port + ".");
}
catch (ArrayIndexOutOfBoundsException e)
{
System.err.println("Usage: java ChatServer <port>");
System.exit(0);
}
ChatServer w = new ChatServer();
w.runServer();
}
public void runServer()
{
try
{
while (true)
{
Socket userSocket = servSock.accept();
InetAddress userIP = userSocket.getInetAddress();
System.out.println("Accepted connection from " + userIP.getHostName());
ChatHandler ch = new ChatHandler(userSocket, userIP);
clients = new ArrayList<>();
synchronized (clients)
{
clients.add(ch);
}
ch.start();
}
}
catch (IOException e)
{
System.out.println("IO Exception in runServer: " + e);
}
}
protected class ChatHandler extends Thread
{
protected Socket clientSock;
protected BufferedReader in;
protected PrintWriter out;
protected InetAddress clientIP;
protected String login;
public ChatHandler(Socket sock, InetAddress clnt) throws IOException
{
clientSock = sock;
clientIP = clnt;
in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
out = new PrintWriter(sock.getOutputStream(), true);
}
public void run()
{
String line;
try
{
while((line = in.readLine()) != null)
{
out.println(line);
}
}
catch (IOException e)
{
System.out.println("IO Exception: " + e);
}
}
}
}
最佳答案
您每次接受连接时都会创建新的客户端列表。试试这个:
try
{
clients = new ArrayList<>(); // <---
while (true)
{
Socket userSocket = servSock.accept();
InetAddress userIP = userSocket.getInetAddress();
System.out.println("Accepted connection from " + userIP.getHostName());
ChatHandler ch = new ChatHandler(userSocket, userIP);
synchronized (clients)
{
clients.add(ch);
}
ch.start();
}
}
此外,您还必须在 ChatServer 中创建函数,将收到的消息从一个客户端发送到所有其他客户端。
public void sendToAll(String msg) {
synchronized (clients) {
for (Socket c : clients){
c.getOutputStream().write((msg + "\n").getBytes(_encoding));
c.getOutputStream().flush();
}
}
}
下一步是修改 ChatHandler 线程以使用该函数:
protected class ChatHandler extends Thread
{
protected Socket clientSock;
protected BufferedReader in;
protected PrintWriter out;
protected InetAddress clientIP;
protected String login;
protected ChatServer server; // <--
public ChatHandler(Socket sock, InetAddress clnt, ChatServer server) throws IOException
{
this.server = server; // <--
clientSock = sock;
clientIP = clnt;
in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
out = new PrintWriter(sock.getOutputStream(), true);
}
public void run()
{
String line;
try
{
while((line = in.readLine()) != null)
{
//out.println(line);
server.sendToAll(line); // <--
}
}
catch (IOException e)
{
System.out.println("IO Exception: " + e);
}
}
}
关于java - 我的 Java 聊天服务器程序不会向每个连接的用户广播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38452601/