1. 程式人生 > >網路程式設計:server伺服器轉發訊息,多個客戶端實現群聊

網路程式設計:server伺服器轉發訊息,多個客戶端實現群聊

依然直接上圖:


下面是程式碼實現:

Client.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>
Server.java
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;

/**
 * 伺服器端
 * 
 * @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();
			}
		}
	}
}
Read.java
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();
			}
		}
	}
}

完工!