1. 程式人生 > >Socket程式設計簡單實現區域網多人互聊

Socket程式設計簡單實現區域網多人互聊

                首先  我們要確認的是在同一個區域網,客戶端使用的IP地址是Server的IP地址和Server的埠。這樣接下來我們就能實現簡單的互聊。

package com.blueZhang;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class Demo6 {

	public static void main(String[] args) {
		
		ArrayList<Socket> list = new ArrayList<Socket>();//用於儲存客戶端的Socket的資訊的
		
		try {
			
			ServerSocket ss = new ServerSocket(9999);//建立伺服器物件
			
			System.out.println("伺服器啟動");
			
			while (true) {//迴圈接收 如果有客戶端那麼久接收並建立客戶端的物件
				
				Socket s = ss.accept();//建立客戶端的物件
				
				System.out.println(s.getInetAddress().getHostAddress() + "已連線");//輸出某某某已經連線
				
				list.add(s);//新增到list中
				
				new Thread(new MyThread12(s, list)).start();//啟動伺服器端的執行緒
			}
		} catch (IOException e) {
			
			e.printStackTrace();
		}
	}

}

class Demo6Thread implements Runnable {
	private ArrayList<Socket> list = new ArrayList<Socket>();//儲存客戶端的Socket物件
	
	private Socket s;

	public Demo6Thread(Socket s, ArrayList<Socket> list) {//使用建構函式初始化
		
		this.s = s;//初始化
		
		this.list = list;
	}

	@Override
	public void run() {

		try {
			
			InputStream is = s.getInputStream();//使用InputStream獲取S中的資訊
			
			BufferedReader br = new BufferedReader(new InputStreamReader(//建立br 用於接收客戶端的資訊
					is));
			
			String a = "";//中間變數
			
			while (true) {
				
				a = br.readLine();//獲取輸入流中的資訊
				
				String line = s.getInetAddress().getHostAddress() + "說:" + a;//組合字串
				
				System.out.println(line);//列印說話的內容
				
				for (int i = 0; i < list.size(); i++) {//遍歷集合 
					
					Socket si = list.get(i);//獲取集合中的Socket
					
					PrintWriter pw = new PrintWriter(si.getOutputStream(), true);//獲取其中的輸出流
					
					pw.println(line);//放入輸入流
					
					pw.flush();//重新整理緩衝區
				}

			}
		} catch (IOException e) {
			
			e.printStackTrace();
		} finally {
			if (s != null) {
				try {
					s.close();//關閉流操作
				} catch (IOException e) {
					
					e.printStackTrace();
				}
			}
		}

	}

}
package com.blueZhang;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class Demo6 {

	public static void main(String[] args) {
		
		ArrayList<Socket> list = new ArrayList<Socket>();//用於儲存客戶端的Socket的資訊的
		
		try {
			
			ServerSocket ss = new ServerSocket(9999);//建立伺服器物件
			
			System.out.println("伺服器啟動");
			
			while (true) {//迴圈接收 如果有客戶端那麼久接收並建立客戶端的物件
				
				Socket s = ss.accept();//建立客戶端的物件
				
				System.out.println(s.getInetAddress().getHostAddress() + "已連線");//輸出某某某已經連線
				
				list.add(s);//新增到list中
				
				new Thread(new MyThread12(s, list)).start();//啟動伺服器端的執行緒
			}
		} catch (IOException e) {
			
			e.printStackTrace();
		}
	}

}

class Demo6Thread implements Runnable {
	private ArrayList<Socket> list = new ArrayList<Socket>();//儲存客戶端的Socket物件
	
	private Socket s;

	public Demo6Thread(Socket s, ArrayList<Socket> list) {//使用建構函式初始化
		
		this.s = s;//初始化
		
		this.list = list;
	}

	@Override
	public void run() {

		try {
			
			InputStream is = s.getInputStream();//使用InputStream獲取S中的資訊
			
			BufferedReader br = new BufferedReader(new InputStreamReader(//建立br 用於接收客戶端的資訊
					is));
			
			String a = "";//中間變數
			
			while (true) {
				
				a = br.readLine();//獲取輸入流中的資訊
				
				String line = s.getInetAddress().getHostAddress() + "說:" + a;//組合字串
				
				System.out.println(line);//列印說話的內容
				
				for (int i = 0; i < list.size(); i++) {//遍歷集合 
					
					Socket si = list.get(i);//獲取集合中的Socket
					
					PrintWriter pw = new PrintWriter(si.getOutputStream(), true);//獲取其中的輸出流
					
					pw.println(line);//放入輸入流
					
					pw.flush();//重新整理緩衝區
				}

			}
		} catch (IOException e) {
			
			e.printStackTrace();
		} finally {
			if (s != null) {
				try {
					s.close();//關閉流操作
				} catch (IOException e) {
					
					e.printStackTrace();
				}
			}
		}

	}

}