java socket實現多客戶端群聊
服務器端主要是接收客戶端發送過來的信息,并將該信息發給所有的客戶端
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List;/**
*/ class Chat extends Thread { private Socket socket; private List<Socket> socketList; private int count;
public Chat(int count, Socket socket, List<Socket> socketList) {
this.count = count; this.socket = socket; this.socketList = socketList;
}
public void run() {
BufferedReader reader = null; PrintWriter writer = null; try { reader = new BufferedReader(new InputStreamReader( socket.getInputStream())); String message = null; while (true) { message = reader.readLine(); // 接收到客戶端的bye信息,客戶端即將退出,并將bye寫入到該客戶端 if (message.equals("bye")) { writer = new PrintWriter(socket.getOutputStream()); writer.println("bye"); writer.flush(); continue; } // 向所有的客戶端發送接收到信息,實現群聊 for (int i = 0; i < socketList.size(); i++) { writer = new PrintWriter(socketList.get(i) .getOutputStream()); writer.println(count + " say: " + message); writer.flush(); } } } catch (IOException e) { e.printStackTrace(); }
} }
public class ChatServer {
/**
* Description
*
* @param args
*/
public void startWork() throws IOException {
ServerSocket serverSocket = new ServerSocket(2345);
List<Socket> socketList = new ArrayList<Socket>();
Socket socket = null;
int count = 0;
while (true) {
socket = serverSocket.accept();
count++;
System.out.println(count + " clinet connected to the server!");
// 將每一個連接到該服務器的客戶端,加到List中
socketList.add(socket);
// 每一個連接到服務器的客戶端,服務器開啟一個新的線程來處理
new Chat(count, socket, socketList).start();
}
}
/**
* Description
*
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
ChatServer chatServer = new ChatServer();
chatServer.startWork();
}
}</pre>客戶端主要是兩個類,一個是接收服務器端發送過來的信息,一個是向服務器發送客戶端輸入的信息
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException;/**
接受服務器信息 */ class ReadMes extends Thread { private Socket socket;
public ReadMes(Socket socket) {
this.socket = socket;
}
public void run() {
BufferedReader reader = null; try { reader = new BufferedReader(new InputStreamReader( socket.getInputStream())); String message = null; while (true) { message = reader.readLine(); // 當讀服務器信息線程接收到bye,該線程退出 if (message.equals("bye")) { break; } System.out.println(message); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (reader != null) { reader.close(); } } catch (IOException e) { e.printStackTrace(); } }
}
}
/**
發送信息 */ class SendMes extends Thread { private Socket socket;
public SendMes(Socket socket) {
this.socket = socket;
}
public void run() {
BufferedReader input = null; PrintWriter writer = null; try { input = new BufferedReader(new InputStreamReader(System.in)); writer = new PrintWriter(socket.getOutputStream()); String message = null; while (true) { message = input.readLine(); // 當輸入bye客戶端退出 if (message.equals("bye")) { break; } // 向服務器端發送信息 writer.println(message); writer.flush(); } } catch (IOException e) { e.printStackTrace(); } finally { if (input != null) { try { input.close(); } catch (IOException e) { e.printStackTrace(); } } if (writer != null) { writer.close(); } }
} }
public class ChatClient { private String ipAdress;
public ChatClient(String ipAString) {
this.ipAdress = ipAdress;
}
public void startWork() throws UnknownHostException, IOException {
Socket socket = new Socket(ipAdress, 2345);
new ReadMes(socket).start();
new SendMes(socket).start();
}
/**
* Description
*
* @param args
* @throws UnknownHostException
* @throws IOException
*/
public static void main(String[] args) throws UnknownHostException,
IOException {
ChatClient chatClient = new ChatClient(args[0]);
chatClient.startWork();
}
}</pre>
本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!