網路程式設計:server伺服器轉發訊息,多個客戶端實現群聊
阿新 • • 發佈:2019-02-04
依然直接上圖:
下面是程式碼實現:
Client.java
Server.java<span style="font-size:18px;">import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; /** * 客戶端 * * @author 周孟軍 時間:2016年7月27日 上午10:00:41 * */ public class Client { public static void main(String[] args) throws UnknownHostException, IOException { Socket s = new Socket("127.0.0.1", 1099); Read r = new Read(s); r.start(); new Write(s).start(); } }</span>
Read.javaimport 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; /** * 伺服器端 * * @author 周孟軍 時間:2016年7月27日 上午9:59:25 * */ public class Server { public static void main(String[] args) throws IOException { List<Task> list = new ArrayList<>(); ServerSocket ss = new ServerSocket(1099); System.out.println("伺服器已啟動---->"); while (true) { Socket s = ss.accept(); System.out.println(s.getInetAddress() + "使用者接入"); Task t = new Task(s, list); list.add(t); t.start(); } } } class Task extends Thread { Socket s; List<Task> clients; public Task(Socket s, List<Task> clients) { super(); this.s = s; this.clients = clients; } @Override public void run() { while (true) { try { InputStreamReader isr = new InputStreamReader(s.getInputStream()); BufferedReader br = new BufferedReader(isr); String str = br.readLine(); // 轉發訊息 for (Task task : clients) { PrintWriter pw = new PrintWriter(task.s.getOutputStream()); pw.println(str); pw.flush(); } } catch (Exception e) { e.printStackTrace(); } } } }
import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.Socket; public class Read extends Thread { Socket s; public Read(Socket s) { super(); this.s = s; } @Override public void run() { while (true) { try { // 不停的接收訊息 BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); System.out.println(br.readLine()); } catch (Exception e) { e.printStackTrace(); } } } }
Write.java
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class Write extends Thread {
Socket s;
public Write(Socket s) {
super();
this.s = s;
}
@Override
public void run() {
while (true) {
try {
PrintWriter pw = new PrintWriter(s.getOutputStream());
Scanner can = new Scanner(System.in);
pw.println("---> " + can.nextLine());
pw.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
完工!