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

Java TCP編程之Scoket

 更新時間:2022年11月05日 17:22:30   作者:OlaiolaiO  
TCP/IP是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,它會保證數(shù)據(jù)不丟包、不亂序。TCP全名是Transmission Control Protocol,它是位于網(wǎng)絡(luò)OSI模型中的第四層

一、什么是Scoket

Socket 是一個抽象概念,一個應(yīng)用程序通過一個 Socket 來建立一個遠程連接,而 Socket 內(nèi)部通 過 TCP/IP 協(xié)議把數(shù)據(jù)傳輸?shù)骄W(wǎng)絡(luò)。

┌───────────┐                                   ┌───────────┐
│Application│                                   │Application│
├───────────┤                                   ├───────────┤
│  Socket   │                                   │  Socket   │
├───────────┤                                   ├───────────┤
│    TCP    │                                   │    TCP    │
├───────────┤      ┌──────┐       ┌──────┐      ├───────────┤
│    IP     │<────>│Router│<─────>│Router│<────>│    IP     │
└───────────┘      └──────┘       └──────┘      └───────────┘

Socket 、 TCP 和部分 IP 的功能都是由操作系統(tǒng)提供的,不同的編程語言只是提供了對操作系統(tǒng)調(diào) 用的簡單的封裝。例如, Java 提供的幾個 Socket 相關(guān)的類就封裝了操作系統(tǒng)提供的接口: Server Socket 類、 Socket 類。

為什么需要 Socket 進行網(wǎng)絡(luò)通信?因為僅僅通過 IP 地址進行通信是不夠的,同 一臺計算機同一時間會運行多個網(wǎng)絡(luò)應(yīng)用程序,例如瀏覽器、QQ、郵件客戶端等。當(dāng) 操作系統(tǒng)接收到一個數(shù)據(jù)包的時候,如果只有 IP 地址,它沒法判斷應(yīng)該發(fā)給哪個應(yīng)用 程序,所以,操作系統(tǒng)抽象出 Socket 接口,每個應(yīng)用程序需要各自對應(yīng)到不同的 S ocket ,數(shù)據(jù)包才能根據(jù) Socket 正確地發(fā)到對應(yīng)的應(yīng)用程序。

一個 Socket 就是由IP地址和端口號(范圍是0~65535)組成,可以把 Socket 簡單理解為 IP 地址加端口號。端口號總是由操作系統(tǒng)分配,它是一個 0 ~ 65535 之間的數(shù)字,其中,小于 1024 的端口屬于特權(quán)端口,需要管理員權(quán)限,大于 1024 的端口可以由任意用戶的應(yīng)用程序打開。

使用 Socket 進行網(wǎng)絡(luò)編程時,本質(zhì)上就是兩個進程之間的網(wǎng)絡(luò)通信。其中一個進 程必須充當(dāng)服務(wù)器端,它會主動監(jiān)聽某個指定的端口,另一個進程必須充當(dāng)客戶端,它 必須主動連接服務(wù)器的 IP 地址和指定端口,如果連接成功,服務(wù)器端和客戶端就成功 地建立了一個 TCP 連接,雙方后續(xù)就可以隨時發(fā)送和接收數(shù)據(jù)。

當(dāng) Socket 連接成功地在服務(wù)器端和客戶端之間建立后:

  • 對服務(wù)器端來說,它的 Socket 是指定的 IP 地址和指定的端口號;
  • 對客戶端來說,它的 Socket 是它所在計算機的 IP 地址和一個由操作系統(tǒng)分配的隨機端口號。

二、服務(wù)器端

package com.ljl.tcp.demo2;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
public class ChatServer {
	public static void main(String[] args) {
		Map<String, String> chatMap = new HashMap<String, String>(){
			{
				put("你好", "你好呀");
				put("hi", "hi~");
				put("hello", "哈嘍");
				put("吃了嗎", "沒呢,你呢");
				put("孤勇者", "愛你孤身走暗巷");
				put("有請潘周聃", "潘周聃,今年29歲,蘇黎世理工大學(xué).....");
				put("很高興認識你", "我也是哦");
			}
		};
		try (ServerSocket server = new ServerSocket(9966)) {
			while(true) {
			//客戶端連接
			Socket client = server.accept();
			//獲取客戶端IP地址
			String clientIP = client.getInetAddress().getHostAddress();
			try(
			BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
			BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));){	
			//獲取客戶端提問
			String question = reader.readLine();
			System.out.println("服務(wù)器來自客戶端"+clientIP+"的提問:"+question);
			//獲取問題答案
			String answer = chatMap.get(question);
			answer = answer == null?"我不知道你在說啥":answer;
			//發(fā)送答案至客戶端
			writer.write(answer);
			}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

三、客戶端

package com.ljl.tcp.demo2;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;
public class ChatClient {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		while(true) {
		try (//創(chuàng)建Socket
		 Socket client = new Socket("192.168.254.163",9966);
			BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));	
			BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
			){
			//獲取控制臺的輸入問題
			String question = input.nextLine();
			if(question.equals("退下")) {
				break;
			}
			//發(fā)送問題至服務(wù)器
			writer.write(question);
			writer.flush();
			//暫時結(jié)束本次輸入
			client.shutdownOutput();
			//獲取來自服務(wù)器的答案
			String answer = reader.readLine();
			System.out.println("服務(wù)器回答:"+answer);
		} catch (IOException e) {
			e.printStackTrace();
		}
		}
		System.out.println("over");
	}
}

四、Socket流

當(dāng) Socket 連接創(chuàng)建成功后,無論是服務(wù)器端,還是客戶端,我們都使用 Socket 實例進行網(wǎng)絡(luò)通信。因為 T CP 是一種基于流的協(xié)議,因此, Java 標(biāo)準(zhǔn)庫使用 InputStream 和 OutputStream 來封裝 Socket 的數(shù)據(jù)流,這 樣我們使用 Socket 的流,和普通 IO 流類似:

// 用于讀取網(wǎng)絡(luò)數(shù)據(jù):
InputStream in = sock.getInputStream();
// 用于寫入網(wǎng)絡(luò)數(shù)據(jù):
OutputStream out = sock.getOutputStream();

寫入網(wǎng)絡(luò)數(shù)據(jù)時,必須要調(diào)用 flush() 方法。如果不調(diào)用 flush() ,我們很可能會發(fā)現(xiàn),客戶端和服務(wù)器都 收不到數(shù)據(jù),這并不是 Java 標(biāo)準(zhǔn)庫的設(shè)計問題,而是我們以流的形式寫入數(shù)據(jù)的時候,并不是一寫入就立刻發(fā)送 到網(wǎng)絡(luò),而是先寫入內(nèi)存緩沖區(qū),直到緩沖區(qū)滿了以后,才會一次性真正發(fā)送到網(wǎng)絡(luò),這樣設(shè)計的目的是為了提高 傳輸效率。如果緩沖區(qū)的數(shù)據(jù)很少,而我們又想強制把這些數(shù)據(jù)發(fā)送到網(wǎng)絡(luò),就必須調(diào)用 flush() 強制把緩沖區(qū)數(shù) 據(jù)發(fā)送出去。

五、總結(jié)

使用Java進行TCP編程時,需要使用 Socket 模型:

  • 服務(wù)器端用 ServerSocket 監(jiān)聽指定端口;
  • 客戶端使用 Socket(InetAddress, port) 連接服務(wù)器;
  • 服務(wù)器端用 accept() 接收連接并返回 Socket 實例;
  • 雙方通過 Socket 打開 InputStream / OutputStream 讀寫數(shù)據(jù);
  • 服務(wù)器端通常使用多線程同時處理多個客戶端連接,利用線程池可大幅提升效率;
  • flush() 方法用于強制輸出緩沖區(qū)到網(wǎng)絡(luò)。

到此這篇關(guān)于Java TCP編程之Scoket的文章就介紹到這了,更多相關(guān)Java Scoket內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot配置開發(fā)和測試環(huán)境并添加啟動路徑方式

    springboot配置開發(fā)和測試環(huán)境并添加啟動路徑方式

    這篇文章主要介紹了springboot配置開發(fā)和測試環(huán)境并添加啟動路徑方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java基于MySQL實現(xiàn)學(xué)生管理系統(tǒng)

    Java基于MySQL實現(xiàn)學(xué)生管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Java基于MySQL實現(xiàn)學(xué)生管理系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • SpringBoot使用異步線程池實現(xiàn)生產(chǎn)環(huán)境批量數(shù)據(jù)推送

    SpringBoot使用異步線程池實現(xiàn)生產(chǎn)環(huán)境批量數(shù)據(jù)推送

    本文主要介紹了SpringBoot使用異步線程池實現(xiàn)生產(chǎn)環(huán)境批量數(shù)據(jù)推送,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • Java實現(xiàn)滑塊拼圖驗證碼

    Java實現(xiàn)滑塊拼圖驗證碼

    這篇文章主要為大家詳細介紹了Java實現(xiàn)滑塊拼圖驗證碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 深入理解 CAS 算法原理已經(jīng)在jdk中的運用

    深入理解 CAS 算法原理已經(jīng)在jdk中的運用

    這篇文章主要介紹了深入理解 CAS 算法原理已經(jīng)在jdk中的運用,幫助大家更好的使用Java,感興趣的朋友可以了解下
    2020-12-12
  • Java中的private、protected、public和default的區(qū)別(詳解)

    Java中的private、protected、public和default的區(qū)別(詳解)

    下面小編就為大家?guī)硪黄狫ava中的private、protected、public和default的區(qū)別(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • SpringBoot工程Docker多環(huán)境中使用同一個Jar包解決方案

    SpringBoot工程Docker多環(huán)境中使用同一個Jar包解決方案

    在Docker多環(huán)境部署中,SpringBoot工程可以通過環(huán)境變量來動態(tài)改變配置,無需重新打包,利用volume掛載或docker?cp命令,可以將配置文件直接傳入容器,提高部署效率,并保證安全性
    2024-09-09
  • 詳解Java類庫的概念以及import的使用方法

    詳解Java類庫的概念以及import的使用方法

    這篇文章主要介紹了詳解Java類庫的概念以及import的使用方法,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • Java 常見的限流算法詳細分析并實現(xiàn)

    Java 常見的限流算法詳細分析并實現(xiàn)

    大數(shù)據(jù)量高并發(fā)訪問時,經(jīng)常出現(xiàn)服務(wù)或接口面對暴漲的請求而不可用的情況,甚至引發(fā)連鎖反映導(dǎo)致整個系統(tǒng)崩潰。此時你需要使用的技術(shù)手段之一就是限流,當(dāng)請求達到一定的并發(fā)數(shù)或速率,就進行等待、排隊、降級、拒絕服務(wù)等。限流時,常見算法是計數(shù)器、漏斗、令牌桶算法
    2022-04-04
  • 詳解安裝Eclipse Maven插件的幾種方法

    詳解安裝Eclipse Maven插件的幾種方法

    本篇文章主要介紹了詳解安裝Eclipse Maven插件的幾種方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01

最新評論

开封县| 六枝特区| 贞丰县| 兴文县| 新巴尔虎右旗| 新安县| 南召县| 渑池县| 平江县| 汪清县| 日喀则市| 衡山县| 无为县| 剑阁县| 都昌县| 甘孜县| 马龙县| 呈贡县| 新绛县| 白山市| 灵璧县| 铁岭县| 娱乐| 康平县| 马山县| 凭祥市| 凭祥市| 高州市| 攀枝花市| 静宁县| 安仁县| 富裕县| 健康| 郸城县| 朝阳区| 瑞丽市| 常熟市| 竹北市| 民权县| 怀化市| 蒲江县|