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

Java實現(xiàn)單線程聊天室

 更新時間:2022年09月15日 16:47:32   作者:#define微光  
這篇文章主要為大家詳細介紹了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)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解Java中跳躍表的原理和實現(xiàn)

    詳解Java中跳躍表的原理和實現(xiàn)

    跳躍表(Skip list)是有序鏈表的擴展,簡稱跳表,它在原有的有序鏈表上增加了多級索引,通過索引來實現(xiàn)快速查找,實質(zhì)上是一種可以進行二分查找的有序鏈表。本文主要為大家介紹了跳躍表的原理和實現(xiàn),需要的可以參考一下
    2022-12-12
  • SpringBoot如何自定義starter

    SpringBoot如何自定義starter

    這篇文章主要介紹了SpringBoot如何自定義starter,Springboot的出現(xiàn)極大的簡化了開發(fā)人員的配置,而這之中的一大利器便是springboot的starter,starter是springboot的核心組成部分,下面來看看集體引用過程吧
    2022-01-01
  • 關(guān)于java連接池/線程池/內(nèi)存池/進程池等匯總分析

    關(guān)于java連接池/線程池/內(nèi)存池/進程池等匯總分析

    這篇文章主要介紹了關(guān)于java連接池/線程池/內(nèi)存池/進程池等匯總分析,本文將介紹池技術(shù)的由來、原理、優(yōu)缺點以及常見的池技術(shù)類型,需要的朋友可以參考下
    2023-04-04
  • Spring Cloud Admin健康檢查 郵件、釘釘群通知的實現(xiàn)

    Spring Cloud Admin健康檢查 郵件、釘釘群通知的實現(xiàn)

    這篇文章主要介紹了Spring Cloud Admin健康檢查 郵件、釘釘群通知的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • SpringBoot項目鑒權(quán)的4種方式小結(jié)

    SpringBoot項目鑒權(quán)的4種方式小結(jié)

    本文主要介紹了SpringBoot項目鑒權(quán)的4種方式小結(jié),包括傳統(tǒng)AOP、攔截器、參數(shù)解析器和過濾器,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • jvm雙親委派 vs 破壞雙親委派理解加載器的權(quán)責分配

    jvm雙親委派 vs 破壞雙親委派理解加載器的權(quán)責分配

    這篇文章主要為大家介紹了jvm雙親委派 vs 破壞雙親委派對比來理解加載器的權(quán)責分配,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • Java編程子類能否重寫父類的靜態(tài)方法探索

    Java編程子類能否重寫父類的靜態(tài)方法探索

    關(guān)于子類能否重寫父類的靜態(tài)方法,對像我這種初級的編程愛好者來說仍是值得討論的一件事,下面我們通過具體實例,對此問題進行簡單的探索。
    2017-10-10
  • Java?Zip壓縮之簡化文件和文件夾的壓縮操作

    Java?Zip壓縮之簡化文件和文件夾的壓縮操作

    這篇文章主要給大家介紹了關(guān)于Java?Zip壓縮之簡化文件和文件夾的壓縮操作,Zip壓縮是一種常見的文件壓縮格式,它將多個文件和文件夾打包成一個以.zip為后綴的壓縮包,需要的朋友可以參考下
    2023-10-10
  • 詳解Spring Boot讀取配置文件與配置文件優(yōu)先級

    詳解Spring Boot讀取配置文件與配置文件優(yōu)先級

    這篇文章主要介紹了詳解Spring Boot讀取配置文件與配置文件優(yōu)先級,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • 詳解Java變量與常量

    詳解Java變量與常量

    這篇文章主要介紹了Java變量與常量,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04

最新評論

温泉县| 伊宁县| 息烽县| 策勒县| 绥德县| 桐乡市| 吉木萨尔县| 东光县| 资溪县| 和平县| 张家界市| 邢台县| 镇原县| 龙江县| 桂阳县| 安顺市| 金川县| 嘉祥县| 玛曲县| 山东| 临泽县| 收藏| 环江| 留坝县| 噶尔县| 新干县| 鹤壁市| 罗平县| 玛沁县| 紫金县| 沭阳县| 彰化市| 德昌县| 绥芬河市| 贺兰县| 普定县| 苍南县| 郯城县| 彩票| 永嘉县| 新安县|