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

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

 更新時(shí)間:2022年09月15日 16:47:32   作者:#define微光  
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)單線程聊天室,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Java實(shí)現(xiàn)單線程聊天室的具體代碼,供大家參考,具體內(nèi)容如下

一. Socket API簡(jiǎn)介

1. Socket編程

Java.net.Socket類代表一個(gè)套接字,并且為服務(wù)器程序提供了一種來監(jiān)聽客戶端并與他們建立連接的一種機(jī)制.

套接字使用TCP提供了兩臺(tái)計(jì)算機(jī)之間的通信機(jī)制,客戶端創(chuàng)建一個(gè)套接字并嘗試連接服務(wù)器的套接字,當(dāng)連接建立時(shí),服務(wù)器就會(huì)創(chuàng)建一個(gè)Socket對(duì)象,客戶端和服務(wù)器就可以通過Socket對(duì)象的寫入和讀取來進(jìn)行通信,這就是聊天室的原理.

兩臺(tái)計(jì)算機(jī)使用套接字建立TCP連接時(shí)會(huì)出現(xiàn)以下步驟: 

  • 服務(wù)端實(shí)例化一個(gè)ServerSocket對(duì)象,表示通過服務(wù)器上的端口通信
  • 服務(wù)端調(diào)用ServerSocket的accept()方法,該方法將一直等待,直到客戶端連接上服務(wù)器上給定的端口
  • 服務(wù)端正在等待時(shí),一個(gè)客戶端實(shí)例化一個(gè)Socket對(duì)象,指定服務(wù)器名稱和端口號(hào)來請(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é)議,連接建立后,通過使用I/O流進(jìn)行通信,每一個(gè)socket都有一個(gè)輸出流和輸入流,客戶端的輸出流連接到服務(wù)端的輸入流,服務(wù)端的輸出流連接到客戶端的輸入流.

二. 實(shí)現(xiàn)單線程模式的聊天室

首先我們來理清整個(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 通過Socket連接,發(fā)送和接收數(shù)據(jù)
     2.4 關(guān)閉ServerSocket/Socket

3. 客戶端

     3.1 創(chuàng)建Socket,指定服務(wù)器的地址和端口號(hào)
     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ù)器啟動(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"); ?//寫數(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"); ?//寫數(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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

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

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

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

    SpringBoot如何自定義starter

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

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

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

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

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

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

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

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

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

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

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

    Java?Zip壓縮之簡(jiǎn)化文件和文件夾的壓縮操作

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

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

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

    詳解Java變量與常量

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

最新評(píng)論

安新县| 千阳县| 长子县| 鄂托克旗| 贵溪市| 安新县| 炎陵县| 福贡县| 娱乐| 普格县| 育儿| 城市| 阳新县| 巧家县| 加查县| 大同县| 浏阳市| 于田县| 宁德市| 和硕县| 安远县| 永泰县| 崇阳县| 资溪县| 高青县| 无棣县| 靖宇县| 利津县| 黎川县| 钟祥市| 内黄县| 茶陵县| 寻甸| 玉龙| 镇江市| 大荔县| 兰溪市| 尼勒克县| 长阳| 武山县| 阿坝县|