我想用套接字编写聊天服务器。我想,至少有两个但理论上甚至更多可以连接并在一个大的“房间”聊天。 我有2个类,一个服务器和一个客户端类。但不知何故,他们只能与自己聊天。
服务器:
package Threads.tcp;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class ChatServer {
private static int PORT = 10023;
public static List<Socket> verbindungen = new ArrayList<>();
public static List<Thread> threads = new ArrayList<>();
public static void main(String[] args) {
// Server auf Port 10023 horchen lassen
try (ServerSocket server = new ServerSocket(PORT)) {
System.out.println("Echo-Server bereit am Port " + PORT);
while (true) {
// Auf ankommende Verbindung warten, accept() blockiert so
lange
Socket verbindung = server.accept();
verbindungen.add(verbindung);
Thread t = new Thread(new Client(verbindung));
threads.add(t);
t.start();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
客户:
package Threads.tcp;
import java.io.*;
import java.net.Socket;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
public class Client implements Runnable {
protected List<String> clientList = new ArrayList();
protected int ID;
protected Socket verbindung;
public Client( Socket verbindung) throws IOException {
this.verbindung = verbindung;
}
@Override
public void run() {
// Client-Thread (z.B. EchoHandler.java) ausgelagert werden.
Writer w = null;
try {
w = new OutputStreamWriter(verbindung.getOutputStream(),
Charset.forName("utf-8"));
} catch (IOException e) {
e.printStackTrace();
}
BufferedWriter bw = new BufferedWriter(w);
Reader r = null;
try {
r = new InputStreamReader(verbindung.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
BufferedReader br = new BufferedReader(r);
try {
System.out.println("Verbindung angenommen von " +
verbindung.getRemoteSocketAddress());
w.write("Hallo dies ist der Chat Server der 3ci" + "\r\n");
w.flush();
w.write("Bitte /quit zum beenden):\r\n");
w.flush();
w.write("Welchen Spitznamen moechtest du haben: ");
w.flush();
BufferedReader name = new BufferedReader(new
InputStreamReader(verbindung.getInputStream()));
String clientName;
do {
clientName = name.readLine();
if (clientList.contains(clientName)) {
w.write("Der Spitzname ist schon vergeben waehle einen
anderen: ");
w.flush();
}
} while (clientList.contains(clientName));
// Add name to list
clientList.add(clientName);
ID = clientList.size() - 1;
w.write(clientList.get(ID) + " hat den Raum betreten." + "\r\n");
w.flush();
while (true) {
// Eingabeaufforderung senden und Zeile einlesen
bw.write(clientList.get(ID) + ">");
bw.flush();
String zeile = br.readLine();
if (zeile.equals("/quit")) {
clientList.remove(ID);
break;
}
if (zeile.trim().isEmpty()) {
bw.write("\r\n");
bw.flush();
} else {
zeile += "\r\n";
bw.write(zeile);
}
}
System.out.println("Verbindung beendet mit " +
verbindung.getRemoteSocketAddress());
verbindung.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
我用PUTTY连接了我的客户端并使用了RAW,因为我在windows上编程。
我希望你们能提供帮助。 关心卢卡斯。