欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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ù)器程序提供了一種來(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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • spring boot使用RabbitMQ實(shí)現(xiàn)topic 主題

    spring boot使用RabbitMQ實(shí)現(xiàn)topic 主題

    本篇文章主要介紹了spring boot使用RabbitMQ實(shí)現(xiàn)topic 主題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • MyBatis中example.createCriteria()方法的具體使用

    MyBatis中example.createCriteria()方法的具體使用

    本文詳細(xì)介紹了MyBatis的Example工具的使用方法,包括鏈?zhǔn)秸{(diào)用指定字段、設(shè)置查詢條件、支持多種查詢方式等,還介紹了mapper的crud方法、and/or方法的使用,以及如何進(jìn)行多條件和多重條件查詢,感興趣的可以了解一下
    2024-10-10
  • Java責(zé)任鏈設(shè)計(jì)模式實(shí)例分析

    Java責(zé)任鏈設(shè)計(jì)模式實(shí)例分析

    這篇文章主要介紹了Java責(zé)任鏈設(shè)計(jì)模式,結(jié)合實(shí)例形式詳細(xì)分析了Java責(zé)任鏈設(shè)計(jì)模式的原理與相關(guān)操作技巧,需要的朋友可以參考下
    2019-07-07
  • Java中的異常處理(try,catch,finally,throw,throws)

    Java中的異常處理(try,catch,finally,throw,throws)

    本文主要介紹了Java中的異常處理,文章主要介紹的異常處理包括5個(gè)關(guān)鍵字try,catch,finally,throw,throws,更多詳細(xì)內(nèi)容需要的朋友可以參考一下
    2022-06-06
  • Intellij IDEA下Spring Boot熱切換配置

    Intellij 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)題

    這篇文章主要介紹了解決Spring Cloud Feign 請(qǐng)求時(shí)附帶請(qǐng)求頭的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Java基礎(chǔ)學(xué)習(xí)之Swing事件監(jiān)聽(tīng)

    Java基礎(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
  • 詳解JAVA設(shè)計(jì)模式之代理模式

    詳解JAVA設(shè)計(jì)模式之代理模式

    這篇文章主要介紹了JAVA設(shè)計(jì)模式之代理模式的的相關(guān)資料,文中代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • 基于Feign使用okhttp的填坑之旅

    基于Feign使用okhttp的填坑之旅

    這篇文章主要介紹了基于Feign使用okhttp的填坑之旅,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • 基于mybatis like %%的問(wèn)題

    基于mybatis like %%的問(wèn)題

    這篇文章主要介紹了mybatis like %%的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10

最新評(píng)論