日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Java Socket模擬實(shí)現(xiàn)聊天室

瀏覽:24日期:2022-08-09 11:11:18

使用Java Socket模擬實(shí)現(xiàn)了一個(gè)聊天室,實(shí)現(xiàn)了基本的私聊以及群聊。分為服務(wù)器端和客戶端,下面我來介紹一下實(shí)現(xiàn)的步驟。

服務(wù)器端

服務(wù)器端是聊天室的核心所在,主要用來處理客戶端的請(qǐng)求,先來看一下服務(wù)器端的主方法:

public static void main(String[] args) {try { ExecutorService executorService = Executors.newFixedThreadPool(100);//最多容納100個(gè)客戶端聊天 ServerSocket serverSocket = new ServerSocket(6655);//監(jiān)聽6655號(hào)端口 for (int i = 0; i < 100; i++) {Socket client = serverSocket.accept();System.out.println('有新的用戶連接 ' + client.getInetAddress() +client.getPort());executorService.execute(new ExecuteClientThread(client)); } executorService.shutdown(); serverSocket.close();} catch (Exception e) { e.printStackTrace();} }

首先我創(chuàng)建了一個(gè)固定大小為100的線程池,這個(gè)聊天室的實(shí)現(xiàn)是一個(gè)服務(wù)器線程對(duì)應(yīng)一個(gè)客戶端線程的,就是說線程池的大小就是最大的同時(shí)聊天的人數(shù)。服務(wù)器的執(zhí)行順序是這樣的:

1.監(jiān)聽端口,等待客戶端連接

2.如果有客戶端連接到監(jiān)聽的端口,那么通過accept()方法返回該客戶端的Socket,并且在線程池中啟動(dòng)一個(gè)新的服務(wù)器線程用來與剛剛連接的客戶端'溝通'。

3.把接收到的客戶端的Socket構(gòu)造注入新啟動(dòng)的服務(wù)器線程中,這樣服務(wù)器線程就可以獲取到客戶端對(duì)應(yīng)的流。

到這里,服務(wù)器已經(jīng)和客戶端連接成功了,我們現(xiàn)在來看一下服務(wù)器線程是如何處理客戶端的請(qǐng)求的,先上一段服務(wù)器代碼

private static Map<String, Socket> clientMap = new ConcurrentHashMap<>();//存儲(chǔ)所有的用戶信息 static class ExecuteClientThread implements Runnable {private Socket client;//每一個(gè)服務(wù)器線程對(duì)應(yīng)一個(gè)客戶端線程ExecuteClientThread(Socket client) { this.client = client;}......

代碼的第一行,創(chuàng)建了一個(gè)ConcurrentHashmap,這個(gè)map不是某個(gè)線程中的,而是服務(wù)器的static屬性,用來存儲(chǔ)所有客戶端的信息。因?yàn)榭蛻舳耸怯行彰蠸ocket的,所以采用K-value的模式來存儲(chǔ),用戶名作為Key??紤]到線程安全的原因,采用了ConcurrentHashmap,保證了線程安全。

接下來就是剛剛構(gòu)造注入的、連接的客戶端的Socket了,我們可以通過這個(gè)Socket獲取到輸入和輸出流。

然后就是服務(wù)器的線程執(zhí)行的run方法了,具體的就直接看代碼把。都有注釋,就不一一解釋了,以下是所有服務(wù)器端的代碼

import java.io.IOException;import java.io.PrintStream;import java.net.ServerSocket;import java.net.Socket;import java.util.*;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.regex.Matcher;import java.util.regex.Pattern; public class Main { private static Map<String, Socket> clientMap = new ConcurrentHashMap<>();//存儲(chǔ)所有的用戶信息 static class ExecuteClientThread implements Runnable {private Socket client;//每一個(gè)服務(wù)器線程對(duì)應(yīng)一個(gè)客戶端線程ExecuteClientThread(Socket client) { this.client = client;} @Overridepublic void run() { boolean Flag = true;//防止一個(gè)客戶端多次注冊(cè)所做的標(biāo)記位置 try {PrintStream PrintToCilent = new PrintStream(client.getOutputStream());//服務(wù)器向用戶輸出一些提示信息 Scanner scanner = new Scanner(client.getInputStream());String str = null;//用戶外部的輸入信息while (true) { if (scanner.hasNext()) {str = scanner.next();//外部的用戶輸出 Pattern pattern = Pattern.compile('r');//排除特殊符號(hào)Matcher matcher = pattern.matcher(str);str = matcher.replaceAll(''); if (str.startsWith('userName')) { String userName = str.split(':')[1]; userRegist(userName, client, Flag); Flag = false;}// 群聊流程else if (str.startsWith('G:')) { PrintToCilent.println('已進(jìn)入群聊模式!'); groupChat(scanner,client);}// 私聊流程else if (str.startsWith('P')) {//模式 String userName = str.split('-')[1]; PrintToCilent.println('已經(jīng)進(jìn)入與'+userName+'的私聊'); privateChat(scanner,userName);}// 用戶退出else if (str.contains('byebye')) { String userName = null; for (String getKey:clientMap.keySet()) {if (clientMap.get(getKey).equals(client)) { userName = getKey;} } System.out.println('用戶'+userName+'下線了..'); clientMap.remove(userName);//將此實(shí)例從map中移除} }} } catch (IOException e) {e.printStackTrace(); }} private void userRegist(String userName, Socket client, boolean Flag) throws IOException { PrintStream PrintToCilent = new PrintStream(client.getOutputStream());//服務(wù)器向用戶輸出一些提示信息 if(Flag) {System.out.println('用戶' + userName + '上線了!'); clientMap.put(userName, client);//把用戶加入儲(chǔ)存mapSystem.out.println('當(dāng)前群聊人數(shù)為' + (clientMap.size()) + '人');PrintToCilent.println('注冊(cè)成功!'); }else {PrintToCilent.println('警告:一個(gè)客戶端只能注冊(cè)一個(gè)用戶!'); }} private void groupChat(Scanner scanner,Socket client) throws IOException { // 取出clientMap中所有客戶端Socket,然后遍歷一遍 // 分別取得每個(gè)Socket的輸出流向每個(gè)客戶端輸出 PrintStream PrintToClient = new PrintStream(client.getOutputStream());//在群聊的時(shí)候服務(wù)器向客戶端發(fā)送數(shù)據(jù) boolean ExitFlag = false; Set<Map.Entry<String, Socket>> entrySet = clientMap.entrySet(); String userName = null; for (Map.Entry<String, Socket> socketEntry : entrySet) {//獲得:是哪個(gè)用戶說的話if (socketEntry.getValue() == client) { userName = socketEntry.getKey();//發(fā)出信息的用戶} } String msg = null; while (true) {if (scanner.hasNext()) { msg = scanner.next(); if('exit'.equals(msg)){//如果用戶退出了for(Map.Entry<String,Socket> stringSocketEntry : entrySet){ new PrintStream(stringSocketEntry.getValue().getOutputStream(),true).println('用戶'+userName+'剛剛退出了群聊!!');//給所有人發(fā)退出群聊的消息}return; } for (Map.Entry<String, Socket> stringSocketEntry : entrySet) {//遍歷用戶的map,獲取所有用戶的Sockettry { Socket socket = stringSocketEntry.getValue(); PrintStream ps = new PrintStream(socket.getOutputStream(), true); ps.println('群聊:用戶' + userName + '說: ' + msg);//給每個(gè)用戶發(fā)消息} catch (IOException e) { e.printStackTrace();} } } } }private void privateChat(Scanner scanner, String privatepeopleName) throws IOException { Socket privateUser = clientMap.get(privatepeopleName); PrintStream ps = new PrintStream(privateUser.getOutputStream());//拿到私聊對(duì)象的輸出流 PrintStream PrintToClient = new PrintStream(client.getOutputStream());//拿到當(dāng)前客戶端的輸出流 String Message = null; String MyName = null; Set<Map.Entry<String,Socket>> set = clientMap.entrySet(); for(Map.Entry<String,Socket> value : set){if(value.getValue() == client){ MyName = value.getKey(); break;} } while (true) {if(scanner.hasNext()) { Message = scanner.next(); if ('exit'.equals(Message)){//如果用戶輸入了退出PrintToClient.println('已退出和'+privatepeopleName+'的私聊');ps.println('對(duì)方已經(jīng)退出了私聊');break; } ps.println(MyName+'說'+Message);//如果用戶沒有退出,向私聊對(duì)象發(fā)送消息} } } } public static void main(String[] args) {try { ExecutorService executorService = Executors.newFixedThreadPool(100);//最多容納100個(gè)客戶端聊天 ServerSocket serverSocket = new ServerSocket(6655); for (int i = 0; i < 100; i++) {Socket client = serverSocket.accept();System.out.println('有新的用戶連接 ' + client.getInetAddress() +client.getPort());executorService.execute(new ExecuteClientThread(client)); } executorService.shutdown(); serverSocket.close();} catch (Exception e) { e.printStackTrace();} }}

然后是客戶端的代碼,客戶端的代碼比較簡(jiǎn)單:分為兩個(gè)線程,一個(gè)線程用于接收服務(wù)器的數(shù)據(jù),一個(gè)線程用于向服務(wù)器發(fā)送數(shù)據(jù)。我就直接上代碼了,里面有注釋的。

import java.io.IOException;import java.io.PrintStream;import java.net.Socket;import java.util.Scanner; class ExcuteServerInPut implements Runnable{//接收服務(wù)器的數(shù)據(jù) private Socket ToServer; ExcuteServerInPut(Socket ToServer){this.ToServer = ToServer; } @Override public void run() {try { Scanner scanner = new Scanner(ToServer.getInputStream()); while (scanner.hasNext()){System.out.println(scanner.nextLine()); } scanner.close(); ToServer.close();} catch (IOException e) { e.printStackTrace();} }} class ExcuteServerOutPut implements Runnable{//向服務(wù)器發(fā)送數(shù)據(jù) private Socket Socket; ExcuteServerOutPut(Socket Socket){this.Socket = Socket; } @Override public void run() {try { PrintStream printStream = new PrintStream(Socket.getOutputStream()); Scanner scanner = new Scanner(System.in); scanner.useDelimiter('n'); System.out.println('*****************************************'); System.out.println('***用戶注冊(cè):useerName:同戶名(僅限一次)***'); System.out.println('***進(jìn)入群聊:G: 退出群聊:exit***'); System.out.println('***私聊:P-用戶名 退出私聊:exit***'); System.out.println('***********退出聊天室:byebye*************'); while (true){if(scanner.hasNext()) { String string = scanner.next(); printStream.println(string); if ('byebye'.equals(string)) {System.out.println('退出!');printStream.close();scanner.close();break; }} } Socket.close();} catch (IOException e) { e.printStackTrace();} }} public class Main { public static void main(String[] args) throws IOException {Socket socket = new Socket('127.0.0.1', 6655);ExcuteServerInPut excuteServerInPut = new ExcuteServerInPut(socket);ExcuteServerOutPut excuteServerOutPut = new ExcuteServerOutPut(socket);new Thread(excuteServerInPut).start();new Thread(excuteServerOutPut).start();}}

后續(xù)我會(huì)做一些改進(jìn),希望可以對(duì)大家有所幫助

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品一区二区三区www| 综合一区在线| 麻豆视频久久| 深夜日韩欧美| 青青青国产精品| 国产日本亚洲| 国产激情综合| 国产粉嫩在线观看| 中文字幕系列一区| 亚洲经典在线| 亚洲+小说+欧美+激情+另类| 91亚洲无吗| 国产亚洲电影| 97精品国产福利一区二区三区| 欧美三级网址| 亚洲免费一区二区| 欧美偷窥清纯综合图区| 精品国产午夜肉伦伦影院| 精品理论电影在线| 久久高清免费| 在线精品观看| 国产精品超碰| 久久精品亚洲人成影院| 视频一区中文字幕| 欧美自拍一区| 超碰在线99| 99国产一区| 日韩黄色免费网站| 精品国产一区二区三区av片| 99精品在线观看| 亚洲区欧美区| 精品国产鲁一鲁****| 欧美+亚洲+精品+三区| 亚洲在线久久| 国产一区二区三区免费在线| 激情婷婷欧美| 91精品国产一区二区在线观看| 高清av一区| 国产视频一区在线观看一区免费| 欧美一区91| 欧美成人基地| 天海翼精品一区二区三区| 国产成人a视频高清在线观看| 午夜欧美精品| 久久wwww| 国产亚洲精品久久久久婷婷瑜伽| 91福利精品在线观看| 欧美aa在线观看| 亚洲综合色婷婷在线观看| 精品国产亚洲一区二区三区在线 | 免费观看在线综合色| 国产精品成人3p一区二区三区| 日本韩国欧美超级黄在线观看| 午夜久久av| 久久婷婷一区| 国产欧美日韩影院| 亚洲激情欧美| 日韩综合一区| 亚洲人成亚洲精品| 欧美日韩尤物久久| 日韩黄色在线观看| 午夜欧美在线| 国产一区二区三区四区| 亚洲人成高清| 久久精品国产亚洲夜色av网站| 日韩国产在线不卡视频| 婷婷成人综合| 欧美经典一区| 日韩精品午夜| 国产乱子精品一区二区在线观看 | 9色精品在线| 日韩精品视频网站| 国产aa精品| 日本一区福利在线| 在线看片不卡| 少妇精品久久久| 美女精品网站| 日韩在线看片| 国产精品男女| 日韩在线播放一区二区| 日韩中文影院| 久久三级中文| 欧美日韩中出| 免费一级片91| 激情综合网站| 蜜桃av.网站在线观看| 欧美亚洲三级| 久久要要av| 国产日韩欧美中文在线| 亚洲手机视频| zzzwww在线看片免费| 欧美综合精品| 天堂成人免费av电影一区| 国产亚洲高清一区| 蜜桃视频在线观看一区| 久久影视一区| а√在线中文在线新版| 国产精品久久久一区二区| 亚洲青青久久| 蜜臀av在线播放一区二区三区| 激情综合网站| 婷婷亚洲五月| 成人欧美一区二区三区的电影| 久久av网站| 国产精品地址| 欧美激情麻豆| 久久久久九九精品影院| 国产精品久久久久久妇女 | 一区二区亚洲视频| 亚洲一区二区免费看| 国内激情久久| 亚洲高清影视| 亚洲精品极品少妇16p| 91看片一区| 精品国产亚洲一区二区三区大结局| 麻豆精品在线播放| 美腿丝袜亚洲一区| 国产精品一国产精品| 日本视频一区二区| 日本不卡视频在线观看| 亚洲欧美一级| 首页国产欧美久久| 国产精品久久久久毛片大屁完整版| 日韩中文欧美在线| 久久亚洲欧洲| 蜜臀久久99精品久久久久宅男| 久久久久久色| 久久a爱视频| 亚洲精品综合| 不卡一区2区| 欧美 日韩 国产一区二区在线视频 | 美日韩一区二区三区| 久久精品国产99国产| 福利一区和二区| 日本国产精品| 国产精品婷婷| 婷婷精品在线观看| 日本不卡不码高清免费观看| 国产探花一区在线观看| 久久久久观看| 欧美精品日日操| 欧美日韩国产一区精品一区| 免费观看日韩电影| 国产伦精品一区二区三区在线播放 | 99精品小视频| 六月婷婷一区| 日本高清久久| 精品高清久久| 日韩中文字幕高清在线观看| 福利视频一区| 国产一二在线播放| 久久久国产精品网站| 久久久精品久久久久久96 | 亚洲精品少妇| 国产免费av一区二区三区| 亚洲欧美日韩视频二区| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲乱码一区| 麻豆视频在线看| 影音先锋国产精品| 欧美一级二区| 成人三级高清视频在线看| 久久大逼视频| 97国产精品| 国产精品13p| 亚洲精品福利电影| 国产日韩欧美一区二区三区| 国产精品片aa在线观看 | 国产日韩综合| 狠狠色综合网| 国产手机视频一区二区| 欧美日韩在线二区| 日本综合字幕| 国产偷自视频区视频一区二区| 蜜臀av国产精品久久久久| 人人爱人人干婷婷丁香亚洲| 国产精品一区毛片| 久久婷婷久久| 综合激情视频| 久久的色偷偷| 韩日一区二区三区| 亚洲视频二区| 国产suv精品一区二区四区视频 | 久久精品国产成人一区二区三区| 日本不良网站在线观看| 三级小说欧洲区亚洲区| 亚洲免费毛片| 91青青国产在线观看精品| 97久久亚洲| 亚洲欧洲免费| 日韩影院在线观看| 免费欧美一区| 日韩理论片av| 麻豆精品蜜桃视频网站| 欧美一级二级视频| 男人操女人的视频在线观看欧美| 国产欧美日韩一区二区三区四区| 亚洲久久在线| 亚洲深夜福利在线观看| 国产日韩欧美一区|