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

