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

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

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

什么是tcp

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

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

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

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

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

服務端

服務端用到的類是ServerSocket

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

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

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

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

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

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

接下來我們再講講第二個常用的構造方法吧 !

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

如下面的例子

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

ServerSocket常用的方法

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

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

客戶端

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

接下來我們解析socket

我們就看常用的socket類的構造方法吧

第一個構造方法

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

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

我們來看看他的常用方法

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

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

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

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

服務端代碼

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;
/**
 * 服務端
 * @author Administrator
*
*/
public class Server {
	public static void main(String[] args) {
		ServerSocket server = null;
		Socket socket = null;
		try {
			//準備服務器端用的通訊對象(套接字),指明端口號為8888
			server = new ServerSocket(8888);
			//到指定端口去阻塞監(jiān)聽,一旦有客戶端請求發(fā)送過來,那么立即自動與客戶端建立連接
			socket = server.accept();
			System.out.println("服務器端準備ok");
			//我要發(fā)送到客戶端的內容
			String msg = "你好,我是服務器,這是我的第一次通訊,請問你收到了嗎";
			OutputStream os = socket.getOutputStream();//準備輸出對象
			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("我是服務器,接收到信息:"+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("客戶端準備完成");
			//客戶端開始接受請求
			InputStream is = socket.getInputStream();
			BufferedReader br = new BufferedReader(new InputStreamReader(is));
			String msg = br.readLine();
			System.out.println("我是客戶端,接收到信息:"+msg);
			//客戶端接收到服務器端的信息之后,需要反饋信息給服務器
       	 //客戶端想要反饋給服務器端的信息 
			String reply = "我是客戶端,收到你的信息,這是我的反饋";
			OutputStream os = socket.getOutputStream();//準備客戶端的輸出流
			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();
		}
	}
}

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

相關文章

最新評論