最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java控制臺(tái)輸出版多人聊天室

 更新時(shí)間:2022年09月02日 11:52:10   作者:菜鳥小星啦  
這篇文章主要為大家詳細(xì)介紹了java控制臺(tái)輸出版多人聊天室,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了java控制臺(tái)輸出版多人聊天室的具體代碼,供大家參考,具體內(nèi)容如下

多人聊天室就要用到網(wǎng)絡(luò)以及多線程以及輸入輸出流的知識(shí)

多人聊天室就是多個(gè)人同時(shí)聊天,一個(gè)發(fā)一條信息所有人都是可以接收得到.

接下來我們捋清楚一下思路

在這里面服務(wù)器充當(dāng)了一個(gè)轉(zhuǎn)發(fā)的作用,服務(wù)器要做的事情是,得到客戶寫進(jìn)緩沖流里面的信息,再把得到的信息再寫進(jìn)其他客戶端的緩沖流里面,得到其他用戶的緩沖流我們可以通過集合把用戶的全部Socket對(duì)象寫進(jìn)集合里面,客戶端把客戶想要發(fā)送的信息寫進(jìn)緩沖流里,等待客戶端發(fā)來的消息,一邊等由一邊發(fā)送消息,這個(gè)是屬于并發(fā)的一個(gè)操作,所以讀與寫可以單獨(dú)開個(gè)線程來進(jìn)行發(fā)送消息.

下面是客戶端的代碼

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<>(); ?//用來存儲(chǔ)客戶端的socket對(duì)象

? ? public static void main(String[] args) throws IOException { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ServerSocket serverSocket = new ServerSocket(6666);
? ? ? ? while(true){
? ? ? ? ? ? Socket accept = serverSocket.accept();
? ? ? ? ? ? links.add(accept); ? ? ? ? ? ? //只要有人連接就可以把他添加進(jìn)socket對(duì)象集合里
? ? ? ? ? ? ServerThread serverThread = new ServerThread(accept); ? ?//開啟多線程,實(shí)現(xiàn)多人聊天的功能
? ? ? ? ? ? serverThread.start();
? ? ? ? }
}

//因?yàn)轭l繁的對(duì)輸入輸出流進(jìn)行資源的關(guān)閉,所以寫了個(gè)關(guān)閉資源的工具類
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()); ? ? //轉(zhuǎn)發(fā)功能
? ? ? ? }
? ? }

? ? private void sendother(String str) ?{
? ? ? ? List<Socket> links = Server.links; ? ? //因?yàn)樵趯懣蛻舳说臅r(shí)候是socket的集合是 靜態(tài)的屬性,所以可以直接通過類型.屬性直接獲得
? ? ? ? for (Socket link : links) {
? ? ? ? ? ? if (link!=socket)
? ? ? ? ? ? ? ? ?send(str,link); ? ? ? ?//遍歷整個(gè)對(duì)象轉(zhuǎn)發(fā)給除當(dāng)前對(duì)象的其他socket對(duì)象
? ? ? ? }

? ? }

? ? 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("請(qǐng)輸入您的名字:");
? ? ? ? String name = input.next();
? ? ? ? Socket socket = new Socket("127.0.0.1", 6666); ?//127.0.0.1是指的是本機(jī)
? ? ? ? Send send = new Send(socket,name); ? ? ? ? ?//收發(fā)分別開兩個(gè)線程,可以收發(fā)并發(fā)執(zhí)行
? ? ? ? Receive receive = new Receive("",socket);
? ? ? ? send.start();
? ? ? ? receive.start();
? ? }

}

//發(fā)線程
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(); ? //一直循環(huán)保證客戶可以一直發(fā)
? ? ? ? }
? ? }

? ? 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()); ? ? ?// 當(dāng)前線程名+在客戶端在控制臺(tái)輸出的一并發(fā)給服務(wù)端
? ? ? ? ? ? bw.newLine();
? ? ? ? ? ? bw.flush();
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? flag = false; ? ? ? ? //出現(xiàn)異常的時(shí)候關(guān)閉循環(huán),防止陷入死循環(huán)
? ? ? ? ? ? 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()); ? ?//循環(huán)保證能一直接收服務(wù)器發(fā)來的消息
? ? ? ? }
? ? }
? ? 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 "";
? ? }
}

以上就是簡易版聊天室,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中Controller、Service、Dao/Mapper層的區(qū)別與用法

    Java中Controller、Service、Dao/Mapper層的區(qū)別與用法

    在Java開發(fā)中,通常會(huì)采用三層架構(gòu)(或稱MVC架構(gòu))來劃分程序的職責(zé)和功能,分別是Controller層、Service層、Dao/Mapper層,本文將詳細(xì)給大家介紹了三層的區(qū)別和用法,需要的朋友可以參考下
    2023-05-05
  • Spring mvc結(jié)果跳轉(zhuǎn)方法詳解

    Spring mvc結(jié)果跳轉(zhuǎn)方法詳解

    這篇文章主要介紹了Spring mvc結(jié)果跳轉(zhuǎn)方法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • lambdaQueryWrapper多條件嵌套查詢方式

    lambdaQueryWrapper多條件嵌套查詢方式

    這篇文章主要介紹了lambdaQueryWrapper多條件嵌套查詢方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • java狀態(tài)機(jī)方案解決訂單狀態(tài)扭轉(zhuǎn)示例詳解

    java狀態(tài)機(jī)方案解決訂單狀態(tài)扭轉(zhuǎn)示例詳解

    這篇文章主要為大家介紹了java狀態(tài)機(jī)方案解決訂單狀態(tài)扭轉(zhuǎn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Spring純Java配置集成kafka代碼實(shí)例

    Spring純Java配置集成kafka代碼實(shí)例

    這篇文章主要介紹了Spring純Java配置集成kafka代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • SpringBoot超詳細(xì)講解事務(wù)管理

    SpringBoot超詳細(xì)講解事務(wù)管理

    事務(wù)的作用就是為了保證用戶的每一個(gè)操作都是可靠的,事務(wù)中的每一步操作都必須成功執(zhí)行,只要有發(fā)生異常就 回退到事務(wù)開始未進(jìn)行操作的狀態(tài)。事務(wù)管理是Spring框架中最為常用的功能之一,我們?cè)谑褂肧pring Boot開發(fā)應(yīng)用時(shí),大部分情況下也都需要使用事務(wù)
    2022-08-08
  • Springboot 如何指定獲取自己寫的配置properties文件的值

    Springboot 如何指定獲取自己寫的配置properties文件的值

    這篇文章主要介紹了Springboot 如何指定獲取自己寫的配置properties文件的值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 初次使用IDEA創(chuàng)建maven項(xiàng)目的教程

    初次使用IDEA創(chuàng)建maven項(xiàng)目的教程

    這篇文章主要介紹了初次使用IDEA創(chuàng)建maven項(xiàng)目的教程講解,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Security 登錄認(rèn)證流程詳細(xì)分析詳解

    Security 登錄認(rèn)證流程詳細(xì)分析詳解

    本文Security登錄認(rèn)證流程詳細(xì)分析詳解,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • java實(shí)現(xiàn)時(shí)鐘效果

    java實(shí)現(xiàn)時(shí)鐘效果

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)時(shí)鐘效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03

最新評(píng)論

丰县| 于都县| 昔阳县| 丹江口市| 肇源县| 黄冈市| 兴化市| 闻喜县| 呼和浩特市| 宜良县| 元谋县| 定远县| 鲜城| 普宁市| 北碚区| 岢岚县| 金乡县| 东城区| 大同县| 海门市| 德江县| 宁强县| 湄潭县| 沾益县| 秦安县| 伊通| 汉阴县| 县级市| 安化县| 宜宾市| 株洲县| 四平市| 乐都县| 厦门市| 射阳县| 华宁县| 濮阳市| 北川| 通许县| 民乐县| 靖宇县|