我正在尝试制作一个简单的聊天客户端/服务器对并且已经碰壁了。除了我在一个客户端上发送消息之外,我基本上都可以正常工作,它只会被发送回发送消息的客户端。
以下是我的服务器代码:
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);
}
}
}
}
答案 0 :(得分:1)
您每次接受连接时都会创建新的客户列表。试试这个:
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);
}
}
}