Socket程式設計簡單實現區域網多人互聊
阿新 • • 發佈:2019-01-22
首先 我們要確認的是在同一個區域網,客戶端使用的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(); } } } } }