java實(shí)現(xiàn)多人聊天對(duì)話室
使用ServerSocket和Socket實(shí)現(xiàn)服務(wù)器端和客戶端的Socket通信。
了解完socket通信步驟后可以發(fā)現(xiàn)本實(shí)驗(yàn)需要寫(xiě)兩個(gè)類:Server和Client,并且要先運(yùn)行Server再運(yùn)行Client。
先構(gòu)造服務(wù)器端
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.ScheduledThreadPoolExecutor; /** * @author: Ren * @date: 2020-08-03 15:23 * @description: */ public class TcpserverC2 { public static void main(String[] args) throws IOException { // 定義多線程,讓多個(gè)用戶都可以參與到聊天室 ExecutorService pool = new ScheduledThreadPoolExecutor(10); // 綁定端口 ServerSocket serverSocket = new ServerSocket(8888); // 利用循環(huán)一直來(lái)讀取新的socket while (true) { // 開(kāi)始serversocket偵聽(tīng)請(qǐng)求,這方法會(huì)阻塞等待tcp請(qǐng)求的到來(lái),一旦到來(lái),就返回 Socket accept = serverSocket.accept(); pool.execute(new Runnable() { Socket socket = accept; // 定義字節(jié)數(shù)組來(lái)讀取輸入流 byte[] buf = new byte[1024]; @Override public void run() { // 定義輸入輸出流 InputStream in = null; OutputStream out = null; try { in = socket.getInputStream(); out = socket.getOutputStream(); while (true) { int len = in.read(buf); System.out.println("服務(wù)器收到:" + new String(buf, 0, len, ("utf-8"))); // 聊天室服務(wù)端一般不會(huì)參與對(duì)話,所以一般不加這個(gè)功能 // String xitongshuohua = scanner.nextLine(); // out.write("謝謝".getBytes(Charset.forName("utf-8"))); out.write("謝謝".getBytes(("utf-8"))); } } catch (IOException e) { e.printStackTrace(); } } }); } } }
再構(gòu)建客戶端
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.util.Scanner; /** * @author: Ren * @date: 2020-08-03 15:23 * @description: */ public class TcpClientC2 { public static void main(String[] args) throws IOException { // 目標(biāo)地址,目標(biāo)端口 Socket socket = new Socket("127.0.0.1",8888); InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); Scanner scanner = new Scanner(System.in); byte[] buf = new byte[1024]; while (true) { String word = scanner.nextLine(); out.write(word.getBytes(("utf-8"))); int lrn = in.read(buf); System.out.println("服務(wù)端回復(fù):"+new String(buf,0,lrn,("utf-8"))); } } }
服務(wù)器端構(gòu)建在一個(gè)主機(jī)上,然后在多臺(tái)電腦創(chuàng)建客戶端,并訪問(wèn)服務(wù)器端所在的主機(jī)就可以構(gòu)成聊天室的效果,當(dāng)然前提是在同一個(gè)局域網(wǎng)下。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java實(shí)現(xiàn)多線程聊天室
- Java多線程實(shí)現(xiàn)多人聊天室功能
- Java多線程局域網(wǎng)聊天室的實(shí)現(xiàn)
- 基于Java網(wǎng)絡(luò)編程和多線程的多對(duì)多聊天系統(tǒng)
- java基于C/S結(jié)構(gòu)實(shí)現(xiàn)多線程聊天室
- Java多線程實(shí)現(xiàn)聊天客戶端和服務(wù)器
- Java實(shí)現(xiàn)簡(jiǎn)單聊天機(jī)器人
- Java實(shí)現(xiàn)聊天機(jī)器人
- 使用Java和WebSocket實(shí)現(xiàn)網(wǎng)頁(yè)聊天室實(shí)例代碼
- Java網(wǎng)絡(luò)編程實(shí)現(xiàn)多線程聊天
相關(guān)文章
spring-boot整合ehcache實(shí)現(xiàn)緩存機(jī)制的方法
spring-boot是一個(gè)快速的集成框架,其設(shè)計(jì)目的是用來(lái)簡(jiǎn)化新Spring應(yīng)用的初始搭建以及開(kāi)發(fā)過(guò)程。這篇文章主要介紹了spring-boot整合ehcache實(shí)現(xiàn)緩存機(jī)制,需要的朋友可以參考下2018-01-01Netty開(kāi)發(fā)及粘包實(shí)戰(zhàn)解決分析
這篇文章主要為大家介紹了Netty開(kāi)發(fā)及粘包實(shí)戰(zhàn)解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-02-02使用springboot aop來(lái)實(shí)現(xiàn)讀寫(xiě)分離和事物配置
這篇文章主要介紹了使用springboot aop來(lái)實(shí)現(xiàn)讀寫(xiě)分離和事物配置,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04Java針對(duì)ArrayList自定義排序的2種實(shí)現(xiàn)方法
這篇文章主要介紹了Java針對(duì)ArrayList自定義排序的2種實(shí)現(xiàn)方法,結(jié)合實(shí)例形式總結(jié)分析了Java操作ArrayList自定義排序的原理與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-01-01java基于AES對(duì)稱加密算法實(shí)現(xiàn)的加密與解密功能示例
這篇文章主要介紹了java基于AES對(duì)稱加密算法實(shí)現(xiàn)的加密與解密功能,結(jié)合完整實(shí)例形式分析了AES對(duì)稱加密算法的定義與使用技巧,需要的朋友可以參考下2017-01-01Hadoop源碼分析六啟動(dòng)文件namenode原理詳解
本篇是Hadoop源碼分析系列文章第六篇,主要介紹Hadoop中的啟動(dòng)文件namenode,后續(xù)本系列文章會(huì)持續(xù)更新,有需要的朋友可以借鑒參考下2021-09-09詳談hibernate,jpa與spring?data?jpa三者之間的關(guān)系
這篇文章主要介紹了hibernate,jpa與spring?data?jpa三者之間的關(guān)系,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11