Java實(shí)現(xiàn)單線程聊天室
本文實(shí)例為大家分享了Java實(shí)現(xiàn)單線程聊天室的具體代碼,供大家參考,具體內(nèi)容如下
一. Socket API簡(jiǎn)介
1. Socket編程
Java.net.Socket類代表一個(gè)套接字,并且為服務(wù)器程序提供了一種來(lái)監(jiān)聽(tīng)客戶端并與他們建立連接的一種機(jī)制.
套接字使用TCP提供了兩臺(tái)計(jì)算機(jī)之間的通信機(jī)制,客戶端創(chuàng)建一個(gè)套接字并嘗試連接服務(wù)器的套接字,當(dāng)連接建立時(shí),服務(wù)器就會(huì)創(chuàng)建一個(gè)Socket對(duì)象,客戶端和服務(wù)器就可以通過(guò)Socket對(duì)象的寫(xiě)入和讀取來(lái)進(jìn)行通信,這就是聊天室的原理.
兩臺(tái)計(jì)算機(jī)使用套接字建立TCP連接時(shí)會(huì)出現(xiàn)以下步驟:
- 服務(wù)端實(shí)例化一個(gè)ServerSocket對(duì)象,表示通過(guò)服務(wù)器上的端口通信
- 服務(wù)端調(diào)用ServerSocket的accept()方法,該方法將一直等待,直到客戶端連接上服務(wù)器上給定的端口
- 服務(wù)端正在等待時(shí),一個(gè)客戶端實(shí)例化一個(gè)Socket對(duì)象,指定服務(wù)器名稱和端口號(hào)來(lái)請(qǐng)求連接
- Socket類的構(gòu)造函數(shù)試圖將客戶端連接到指定的服務(wù)器和端口號(hào)上,如果通信被建立,則在客戶端創(chuàng)建一個(gè)Socket對(duì)象能夠與服務(wù)端進(jìn)行通信
- 在服務(wù)端,accept()方法返回服務(wù)器上一個(gè)新的socket引用,該socket連接到客戶端的socket
TCP是一個(gè)雙向通信協(xié)議,連接建立后,通過(guò)使用I/O流進(jìn)行通信,每一個(gè)socket都有一個(gè)輸出流和輸入流,客戶端的輸出流連接到服務(wù)端的輸入流,服務(wù)端的輸出流連接到客戶端的輸入流.
二. 實(shí)現(xiàn)單線程模式的聊天室
首先我們來(lái)理清整個(gè)編程的思路:
socket編程
1.創(chuàng)建項(xiàng)目:
1.1 服務(wù)器模塊ServerSocket
1.2 客戶端模塊Socket
2. 服務(wù)器端
2.1 創(chuàng)建serverScoket,綁定端口
2.2 接收客戶端連接,Socket
2.3 通過(guò)Socket連接,發(fā)送和接收數(shù)據(jù)
2.4 關(guān)閉ServerSocket/Socket
3. 客戶端
3.1 創(chuàng)建Socket,指定服務(wù)器的地址和端口號(hào)
3.2 通過(guò)Socket發(fā)送和接收數(shù)據(jù)
3.3 關(guān)閉Socket
1. 服務(wù)端
package single; ? import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; ? /** ?* Author:weiwei ?* description:單線程聊天室服務(wù)端 ?* Creat:2019/3/8 ?**/ public class singleThreadserver { ? ? public static void main(String[] args) { ? ? ? ? ? try { ? ? ? ? ? ? ? //1. 創(chuàng)建服務(wù)端ServerSocket,監(jiān)聽(tīng)6666端口 ? ? ? ? ? ? ServerSocket serverSocket = new ServerSocket(6666); ? ? ? ? ? ? System.out.println("服務(wù)器啟動(dòng)..."+serverSocket. ? ? ? ? ? ? ? ? ? ? getLocalSocketAddress()); ?//服務(wù)器啟動(dòng),打印當(dāng)前地址 ? ? ? ? ? ? ? //2. 接收客戶端連接 ? ? ? ? ? ? Socket socket = serverSocket.accept(); ?//調(diào)用accept()方法 ? ? ? ? ? ? System.out.println("接收到客戶端連接..."+socket. ? ? ? ? ? ? ? ? ? ? getRemoteSocketAddress()); ?//接收遠(yuǎn)程客戶端 ? ? ? ? ? ? ? //3. 接收和發(fā)送數(shù)據(jù) ? ? ? ? ? ? //3.1 接收數(shù)據(jù) ? ? ? ? ? ? InputStream inputStream = socket.getInputStream(); ?//獲取字節(jié)流 ? ? ? ? ? ? Scanner scanner = new Scanner(inputStream); ? //字節(jié)流轉(zhuǎn)字符流 ? ? ? ? ? ? String message = scanner.nextLine(); ? //讀數(shù)據(jù),按行讀,讀一行 ? ? ? ? ? ? System.out.println("收到客戶端的消息:"+message); //打印接收到的消息 ? ? ? ? ? ? ? //3.2 發(fā)送數(shù)據(jù) ? ? ? ? ? ? OutputStream outputStream = socket.getOutputStream(); ?//獲取字節(jié)流 ? ? ? ? ? ? OutputStreamWriter writer = new OutputStreamWriter(outputStream);//字節(jié)流轉(zhuǎn)字符流 ? ? ? ? ? ? writer.write("你好,客戶端,我很好.\n"); ?//寫(xiě)數(shù)據(jù) ? ? ? ? ? ? writer.flush(); ?//刷新(網(wǎng)通信) ? ? ? ? ? ? ? ? //4. 關(guān)閉 ? ? ? ? ? ? serverSocket.close(); ? ? ? ? ? ? System.out.println("服務(wù)器關(guān)閉"); ? ? ? ? ? } catch (IOException e) { ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? } ? ? } }
2. 客戶端
package single; ? import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.Socket; import java.util.Scanner; ? /** ?* Author:weiwei ?* description:單線程聊天室客戶端 ?* Creat:2019/3/8 ?**/ public class singleThreadclient { ? ? public static void main(String[] args) { ? ? ? ? ? try { ? ? ? ? ? ? ? //1. 創(chuàng)建Socket客戶端,連接指定服務(wù)地址和端口號(hào) ? ? ? ? ? ? Socket socket = new Socket("127.0.0.1",6666); ? ? ? ? ? ? System.out.println("客戶端創(chuàng)建..."+socket. ? ? ? ? ? ? ? ? ? ? getLocalSocketAddress()); ?//客戶端創(chuàng)建,打印當(dāng)前地址 ? ? ? ? ? ? ? //2. Socket發(fā)送和接收數(shù)據(jù) ? ? ? ? ? ? //2.1 發(fā)送數(shù)據(jù) ? ? ? ? ? ? OutputStream outputStream = socket.getOutputStream(); ?//獲取字節(jié)流 ? ? ? ? ? ? OutputStreamWriter writer = new OutputStreamWriter(outputStream); ?//字節(jié)流轉(zhuǎn)字符流 ? ? ? ? ? ? writer.write("你好,服務(wù)器.\n"); ?//寫(xiě)數(shù)據(jù) ? ? ? ? ? ? writer.flush(); ?//刷新 ? ? ? ? ? ? ? //2.2 接收數(shù)據(jù) ? ? ? ? ? ? InputStream inputStream = socket.getInputStream(); ?//獲取字節(jié)流 ? ? ? ? ? ? Scanner scanner = new Scanner(inputStream); ?//字節(jié)流轉(zhuǎn)字符流 ? ? ? ? ? ? String message = scanner.nextLine(); ?//讀數(shù)據(jù),按行讀 ? ? ? ? ? ? System.out.println("接收到服務(wù)器的消息:"+message); //打印接收到的數(shù)據(jù) ? ? ? ? ? ? ? //3. 關(guān)閉 ? ? ? ? ? ? socket.close(); ? ? ? ? ? ? System.out.println("客戶端關(guān)閉"); ? ? ? ? ? } catch (IOException e) { ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? } ? ? } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 使用Java和WebSocket實(shí)現(xiàn)網(wǎng)頁(yè)聊天室實(shí)例代碼
- java socket實(shí)現(xiàn)聊天室 java實(shí)現(xiàn)多人聊天功能
- java聊天室的實(shí)現(xiàn)代碼
- Java基于socket實(shí)現(xiàn)簡(jiǎn)易聊天室實(shí)例
- java實(shí)現(xiàn)一個(gè)簡(jiǎn)單TCPSocket聊天室功能分享
- 基于java編寫(xiě)局域網(wǎng)多人聊天室
- Java Socket聊天室編程(一)之利用socket實(shí)現(xiàn)聊天之消息推送
- Java基于UDP協(xié)議實(shí)現(xiàn)簡(jiǎn)單的聊天室程序
- Java Socket聊天室編程(二)之利用socket實(shí)現(xiàn)單聊聊天室
- 使用java基于pushlet和bootstrap實(shí)現(xiàn)的簡(jiǎn)單聊天室
相關(guān)文章
spring boot使用RabbitMQ實(shí)現(xiàn)topic 主題
本篇文章主要介紹了spring boot使用RabbitMQ實(shí)現(xiàn)topic 主題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03MyBatis中example.createCriteria()方法的具體使用
本文詳細(xì)介紹了MyBatis的Example工具的使用方法,包括鏈?zhǔn)秸{(diào)用指定字段、設(shè)置查詢條件、支持多種查詢方式等,還介紹了mapper的crud方法、and/or方法的使用,以及如何進(jìn)行多條件和多重條件查詢,感興趣的可以了解一下2024-10-10Java責(zé)任鏈設(shè)計(jì)模式實(shí)例分析
這篇文章主要介紹了Java責(zé)任鏈設(shè)計(jì)模式,結(jié)合實(shí)例形式詳細(xì)分析了Java責(zé)任鏈設(shè)計(jì)模式的原理與相關(guān)操作技巧,需要的朋友可以參考下2019-07-07Java中的異常處理(try,catch,finally,throw,throws)
本文主要介紹了Java中的異常處理,文章主要介紹的異常處理包括5個(gè)關(guān)鍵字try,catch,finally,throw,throws,更多詳細(xì)內(nèi)容需要的朋友可以參考一下2022-06-06Intellij IDEA下Spring Boot熱切換配置
這篇文章主要介紹了Intellij IDEA下Spring Boot熱切換配置,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08解決Spring Cloud Feign 請(qǐng)求時(shí)附帶請(qǐng)求頭的問(wèn)題
這篇文章主要介紹了解決Spring Cloud Feign 請(qǐng)求時(shí)附帶請(qǐng)求頭的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10Java基礎(chǔ)學(xué)習(xí)之Swing事件監(jiān)聽(tīng)
今天學(xué)習(xí)java的Swing庫(kù),創(chuàng)建桌面應(yīng)用的時(shí)候,突然發(fā)現(xiàn)有些按鈕需要特定的功能響應(yīng),故來(lái)研究一番Swing的事件監(jiān)聽(tīng),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-05-05