亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java TCP協(xié)議通信超詳細(xì)講解

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

什么是tcp

Tcp通信有兩個特點分別是面向連接,具有可靠性.

面向連接:指的是客戶端與服務(wù)端之間的連接,在通信之前會有三次握手的機制來確保連接的可靠性.

可靠性:tcp在確保他的可靠性上做了許多的功夫,這個可靠性體現(xiàn)在下面兩方面:

  • tcp有狀態(tài):tcp會精確的紀(jì)錄哪些數(shù)據(jù)是發(fā)送了的,哪些是沒有被發(fā)送的,他保證數(shù)據(jù)包是按序到達的,不允許存在半點差錯
  • tcp是可以控制的:如果存在丟包或者網(wǎng)絡(luò)不好的時候,會根據(jù)具體情況對數(shù)據(jù)包進行發(fā)送速度的控制或者對數(shù)據(jù)包進行重新發(fā)送.

如下圖是實現(xiàn)服務(wù)器端與客戶端通信的思路:

服務(wù)端

服務(wù)端用到的類是ServerSocket

ServerSocker類在他的api文檔里面也說了他是實現(xiàn)服務(wù)器的一個類

了解一個類我們還是老樣子先了解他的構(gòu)造方法,我們看一下api文檔

我們常用的構(gòu)造方法是第一個ServerSocket()和第二個serverSocket(int port).接下來我們只講這兩個方法.

我們先來講講serverSocket()這個構(gòu)造方法吧!

serverSocket()這個構(gòu)造方法是創(chuàng)建一個沒有綁定端口的對象,一般他和如下方法配套使用

用以上的方法可以綁定一個你指定的ip地址和端口號.

接下來我們再講講第二個常用的構(gòu)造方法吧 !

ServerSocket(int port)這個構(gòu)造函數(shù)創(chuàng)建的是一個綁定本機的一個自定義端口的一個ServerSocket對象.

如下面的例子

ServerSocket serverSocket = new ServerSocket(6666); //綁定端口號為6666的端口

ServerSocket常用的方法

accept()方法是一個監(jiān)聽器,是一個阻塞式,它要等有服務(wù)端來連接了才能進行下一步,如果沒有客戶端來連接就會一直等待下去,直到接收到連接才往下運行.這個方法返回的是一個Socket對象,有客戶端來連接,就會產(chǎn)生一個Socket對象.這個Socket對象就負(fù)責(zé)與服務(wù)端進行通信

close方法是釋放服務(wù)器所占用的資源,并且斷開全部客戶端的連接.

客戶端

Socket類是實現(xiàn)客戶端通信

接下來我們解析socket

我們就看常用的socket類的構(gòu)造方法吧

第一個構(gòu)造方法

是創(chuàng)建一個連接到的一個指定的ip地址以及指定的端口號的服務(wù)器的socket對象.如果你得到的一個Ip地址是一個字符串類型我們還可以使用另一個構(gòu)造方法

這個構(gòu)造方法同樣的也是創(chuàng)建一個連接到的一個指定的ip地址以及指定的端口號的服務(wù)器的socket對象

我們來看看他的常用方法

我們這里著重講的是getOutputStream()方法與getInputStream()

getOutputStream()返回的是一個OutputStream字節(jié)輸出流對象,我們從這里可以知道我們可以發(fā)送數(shù)據(jù)給服務(wù)器/客戶端。

getInputStream() 返回有的是InputStream字節(jié)輸入流對象,我們可以通過這個對象接受服務(wù)器/客戶端發(fā)來的消息。

服務(wù)端與客戶端代碼實現(xiàn)實例

服務(wù)端代碼

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * 服務(wù)端
 * @author Administrator
*
*/
public class Server {
	public static void main(String[] args) {
		ServerSocket server = null;
		Socket socket = null;
		try {
			//準(zhǔn)備服務(wù)器端用的通訊對象(套接字),指明端口號為8888
			server = new ServerSocket(8888);
			//到指定端口去阻塞監(jiān)聽,一旦有客戶端請求發(fā)送過來,那么立即自動與客戶端建立連接
			socket = server.accept();
			System.out.println("服務(wù)器端準(zhǔn)備ok");
			//我要發(fā)送到客戶端的內(nèi)容
			String msg = "你好,我是服務(wù)器,這是我的第一次通訊,請問你收到了嗎";
			OutputStream os = socket.getOutputStream();//準(zhǔn)備輸出對象
			BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
			bw.write(msg);
			bw.newLine();
			bw.flush();
			//接收客戶端發(fā)送的信息
			InputStream is = socket.getInputStream();
			BufferedReader br = new BufferedReader(new InputStreamReader(is));
			String reply = br.readLine();
			System.out.println("我是服務(wù)器,接收到信息:"+reply);
			br.close();
			is.close();
			bw.close();
			os.close();
			socket.close();
			server.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

客戶端代碼

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
/**
 * 客戶端
 * @author Administrator
*
*/
public class Client {
	public static void main(String[] args) {
		Socket socket = null;
		try {
			socket = new Socket("localhost", 8888);
			System.out.println("客戶端準(zhǔn)備完成");
			//客戶端開始接受請求
			InputStream is = socket.getInputStream();
			BufferedReader br = new BufferedReader(new InputStreamReader(is));
			String msg = br.readLine();
			System.out.println("我是客戶端,接收到信息:"+msg);
			//客戶端接收到服務(wù)器端的信息之后,需要反饋信息給服務(wù)器
       	 //客戶端想要反饋給服務(wù)器端的信息 
			String reply = "我是客戶端,收到你的信息,這是我的反饋";
			OutputStream os = socket.getOutputStream();//準(zhǔn)備客戶端的輸出流
			BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
			bw.write(reply);
			bw.newLine();
			bw.flush();
			bw.close();
			os.close();
			br.close();
			is.close();
			socket.close();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

到此這篇關(guān)于Java TCP協(xié)議通信超詳細(xì)講解的文章就介紹到這了,更多相關(guān)Java TCP協(xié)議通信內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 簡述JAVA同步、異步、阻塞和非阻塞之間的區(qū)別

    簡述JAVA同步、異步、阻塞和非阻塞之間的區(qū)別

    這篇文章主要介紹了JAVA同步、異步、阻塞和非阻塞之間的區(qū)別,文中講解非常細(xì)致,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-08-08
  • 一文詳解如何在Java中自定義異常類

    一文詳解如何在Java中自定義異常類

    這篇文章主要介紹了如何在Java中自定義異常類的相關(guān)資料,在Java編程中開發(fā)者可以通過繼承Exception類或其子類創(chuàng)建自定義異常,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-10-10
  • 如何在Netty中注解使用Service或者Mapper

    如何在Netty中注解使用Service或者Mapper

    這篇文章主要介紹了如何在Netty中注解使用Service或者Mapper,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java集合之Map接口與實現(xiàn)類詳解

    Java集合之Map接口與實現(xiàn)類詳解

    這篇文章主要為大家詳細(xì)介紹了Java集合中的Map接口與實現(xiàn)類,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Java有一定的幫助,感興趣的可以了解一下
    2022-12-12
  • java調(diào)用ffmpeg實現(xiàn)轉(zhuǎn)換視頻

    java調(diào)用ffmpeg實現(xiàn)轉(zhuǎn)換視頻

    這篇文章主要為大家詳細(xì)介紹了java調(diào)用ffmpeg實現(xiàn)轉(zhuǎn)換視頻功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • java實現(xiàn)清理DNS Cache的方法

    java實現(xiàn)清理DNS Cache的方法

    這篇文章主要介紹了java實現(xiàn)清理DNS Cache的方法,分析了幾種常用的清理方法,并給出了反射清理的完整實例,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-01-01
  • Spring Boot常見外部配置文件方式詳析

    Spring Boot常見外部配置文件方式詳析

    這篇文章主要給大家介紹了關(guān)于Spring Boot常見外部配置文件方式的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • java對接??禂z像頭的完整步驟記錄

    java對接??禂z像頭的完整步驟記錄

    在Java中調(diào)用海康威視攝像頭通常需要使用??低曁峁┑腟DK,下面這篇文章主要給大家介紹了關(guān)于java對接海康攝像頭的完整步驟,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-06-06
  • Java查看線程運行狀態(tài)的方法詳解

    Java查看線程運行狀態(tài)的方法詳解

    這篇文章主要為大家詳細(xì)介紹了Java語言如何查看線程運行狀態(tài)的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-08-08
  • 深入理解Java中的SPI機制

    深入理解Java中的SPI機制

    這篇文章主要介紹了深入理解Java中的SPI機制,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-02-02

最新評論