<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文範例為大家分享了java控制檯輸出版多人聊天室的具體程式碼,供大家參考,具體內容如下
多人聊天室就要用到網路以及多執行緒以及輸入輸出流的知識
多人聊天室就是多個人同時聊天,一個發一條資訊所有人都是可以接收得到.
接下來我們捋清楚一下思路
在這裡面伺服器充當了一個轉發的作用,伺服器要做的事情是,得到客戶寫進緩衝流裡面的資訊,再把得到的資訊再寫進其他使用者端的緩衝流裡面,得到其他使用者的緩衝流我們可以通過集合把使用者的全部Socket物件寫進集合裡面,使用者端把客戶想要傳送的資訊寫進緩衝流裡,等待使用者端發來的訊息,一邊等由一邊傳送訊息,這個是屬於並行的一個操作,所以讀與寫可以單獨開個執行緒來進行傳送訊息.
下面是使用者端的程式碼
import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; public class Server { public static List<Socket> links = new ArrayList<>(); //用來儲存使用者端的socket物件 public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(6666); while(true){ Socket accept = serverSocket.accept(); links.add(accept); //只要有人連線就可以把他新增進socket物件集合裡 ServerThread serverThread = new ServerThread(accept); //開啟多執行緒,實現多人聊天的功能 serverThread.start(); } } //因為頻繁的對輸入輸出流進行資源的關閉,所以寫了個關閉資源的工具類 import java.io.Closeable; import java.io.IOException; public class CloseUtil { public static void close(Closeable... closeables){ for (Closeable closeable : closeables) { if (closeable!=null) { try { closeable.close(); } catch (IOException e) { e.printStackTrace(); } } } } } //多執行緒的程式碼如下 import java.io.*; import java.net.Socket; import java.util.List; public class ServerThread extends Thread { private Socket socket; private boolean flag = true; public ServerThread(String name, Socket socket) { super(name); this.socket = socket; } @Override public void run() { while(flag){ sendother(received()); //轉發功能 } } private void sendother(String str) { List<Socket> links = Server.links; //因為在寫使用者端的時候是socket的集合是 靜態的屬性,所以可以直接通過型別.屬性直接獲得 for (Socket link : links) { if (link!=socket) send(str,link); //遍歷整個物件轉發給除當前物件的其他socket物件 } } private void send(String str,Socket socket) { BufferedWriter bw = null; try { OutputStream outputStream = socket.getOutputStream(); bw = new BufferedWriter(new OutputStreamWriter(outputStream)); bw.write(str); bw.newLine(); bw.flush(); } catch (IOException e) { flag = false; CloseUtil.close(bw,socket); } } private String received(){ BufferedReader br = null; try { InputStream inputStream = socket.getInputStream(); br = new BufferedReader(new InputStreamReader(inputStream)); return br.readLine(); } catch (IOException e) { flag = false; CloseUtil.close(br,socket); } return null; } }
下面是使用者端的程式碼
import java.io.IOException; import java.net.Socket; import java.util.Scanner; public class Client { public static void main(String[] args) throws IOException { Scanner input = new Scanner(System.in); System.out.print("請輸入您的名字:"); String name = input.next(); Socket socket = new Socket("127.0.0.1", 6666); //127.0.0.1是指的是本機 Send send = new Send(socket,name); //收發分別開兩個執行緒,可以收發並行執行 Receive receive = new Receive("",socket); send.start(); receive.start(); } } //發執行緒 import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.Socket; import java.util.Scanner; public class Send extends Thread { private Socket socket; private boolean flag = true; public Send(Socket socket,String name) { super(name); this.socket = socket; } @Override public void run() { while(flag){ send(); //一直迴圈保證客戶可以一直髮 } } private void send() { Scanner input = new Scanner(System.in); BufferedWriter bw= null; try { OutputStream outputStream = socket.getOutputStream(); bw = new BufferedWriter(new OutputStreamWriter(outputStream)); bw.write(this.getName()+"說:"+input.next()); // 當前執行緒名+在使用者端在控制檯輸出的一併行給伺服器端 bw.newLine(); bw.flush(); } catch (IOException e) { flag = false; //出現異常的時候關閉迴圈,防止陷入死迴圈 CloseUtil.close(bw,socket); } } } //收執行緒 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.Socket; public class Receive extends Thread { private Socket socket; private boolean flag = true; public Receive(String name, Socket socket) { super(name); this.socket = socket; } @Override public void run() { while (flag){ System.out.println(received()); //迴圈保證能一直接收伺服器發來的訊息 } } public String received(){ BufferedReader br =null; try { InputStream inputStream = socket.getInputStream(); br = new BufferedReader(new InputStreamReader(inputStream)); String line = br.readLine(); return this.getName()+line; } catch (IOException e) { flag = false; CloseUtil.close(br,socket); } return ""; } }
以上就是簡易版聊天室,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45