1. 程式人生 > >TCP/IP常見問題總結(四)

TCP/IP常見問題總結(四)

15. C/S模式下使用socket通訊,幾個關鍵函式

客戶端的Java程式碼如下所示:
public class Main {
	public static void main(String[] args) throws Exception {
		String host = "";
		int port = 0;
		Socket socket = new Socket(host, port); // 分別填入目標主機ip和埠
		try {
			// 獲取輸出流
			OutputStream os = socket.getOutputStream();
			// 獲取輸入流
			InputStream is = socket.getInputStream();
		} finally {
			// 關閉socket
			socket.close();
		}
	}
}
建立連線後,獲取輸入輸出流進行對應的輸入輸出即可。 伺服器的Java程式碼如下所示:
public class Main {
	public static void main(String[] args) throws Exception {
		int port = 0;
		ServerSocket serverSocket = new ServerSocket(port); // 填入監聽的埠號
		try {
			// accept是一個阻塞的方法,阻塞直到返回一個socket連線
			Socket socket = serverSocket.accept();
			try {
				// 獲取輸入輸出流進行對應操作
			} finally {
				socket.close();
			}
		} finally {
			serverSocket.close();
		}
	}
}
通過accept獲取一個socket連線後類似客戶端獲取輸入輸出處理即可。

客戶端Java NIO程式碼:
public class Main {
	public static void main(String[] args) throws Exception {
		String hostname = "";
		int port = 0;
		SocketChannel socketChannel = SocketChannel.open();
		// 設定成非阻塞IO
		socketChannel.configureBlocking(false);
		try {
			// 非阻塞模式下可能沒建立連線就返回了
			while (!socketChannel.finishConnect()) { 
				// 傳入目標主機ip和埠號建立連線
				socketChannel.connect(new InetSocketAddress(hostname, port));
			}
			
			int capacity = 48;
			// 傳入緩衝區大小建立緩衝區
			ByteBuffer buffer = ByteBuffer.allocate(capacity);
			
			// 讀取位元組輸入
			int byteRead = socketChannel.read(buffer);
			
		} finally {
			socketChannel.close();
		}
	}
}
注意NIO下的連線、讀取和寫入操作均為非阻塞操作,可能並沒有達到我們預料中的結果就返回了,因此切記在迴圈中使用並進行相應的判斷。

伺服器Java NIO程式碼:
public class Main {
	public static void main(String[] args) throws Exception {
		int port = 0;
		ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
		// 繫結監聽埠
		serverSocketChannel.bind(new InetSocketAddress(port));
		// 設定為非阻塞模式
		serverSocketChannel.configureBlocking(false);
		try {
			while (true) {
				SocketChannel socketChannel = serverSocketChannel.accept();
				// 非阻塞模式下可能沒監聽到任何通道就返回了
				if (socketChannel != null) {
					// 獲取socket通道後進行對應操作
				}
			}
		} finally {
			serverSocketChannel.close();
		}
	}
}
由於非阻塞的原因,accept方法不一定成功獲取socketChannel,因此我們需要進行判斷是否返回了null。


16. IP地址分類

IP地址分為IPv4地址(32位)和IPv6地址(128位),在此我們討論IPv4地址。 IP地址由兩部分(網路部分和主機部分)組成,可以分為有類網和無類網兩類。

有類網

有類網分為以下5種:
  • A類網:第一位為0,後7位為網路號,剩餘24位為主機號
  • B類網:前兩位為10,後14位為網路號,剩餘16位為主機號
  • C類網:前三位為110,後21位為網路號,剩餘8位為主機號
  • D類網(不可用):前四位為1110,後28位為多播地址
  • E類網(不可用):前四位為1111,被保留
除了D類網與E類網不能使用外,A、B和C類網IP均可用來表示一臺主機。我們一般根據自己網路中主機的多少來選擇A、B還是C類網,但一般而言網路中的主機數目都不會剛好等於有類網提供的主機數,於是經常會造成有多餘的IP地址浪費,因此我們有了無類網。

無類網

無類網加入了子網掩碼的概念。子網掩碼是一個32位地址,用於將某個IP地址劃分成網路地址和主機地址兩部分。在子網掩碼中我們以1表示為網路號,例:255.255.255.0表示前24位為網路號。

17. 路由器與交換機區別

路由器工作於網路模型的網路層,其主要的功能是路由選擇與儲存轉發,路由器上還能開啟ACL訪問控制列表、NAT地址轉換等功能,擴充套件網路應用。 交換機工作於網路模型的資料鏈路層,其主要的功能是泛洪、儲存轉發、過濾和自學習,交換機還能夠隔離衝突域,並劃分VLAN。

相關推薦

TCP/IP詳解---ICMP:Internet控制報文協議

基本概念 ICMP(Internet Control Message Protocol,網路控制報文協議),屬於OSI七層模型中的網路層,與IP/UDP同屬一層,可以將其看成IP、UDP協議功能的一個補充,因為以前說過,IP協議是不可靠的,其可靠性需藉

TCP/IP常見問題總結

15. C/S模式下使用socket通訊,幾個關鍵函式 客戶端的Java程式碼如下所示: public class Main { public static void main(String[]

TCP/IP五層模型——應用層

應用層 應用層是TCP/IP五層(四層)模型的最頂層,主要負責程式間的溝通,如簡單電子郵件傳輸(SMTP),檔案傳輸協議(FTP),網路遠端訪問協議(Telnet)等,網路程式設計主要就是針對應用層 HTTP協議——超文字傳輸協議 1 HTTP協議

分散式系統常見問題總結- 應用間通訊

分散式系統間通訊的常見方式有兩種,一種是訊息通訊,比如JMS,RocketMQ等,一種是RPC遠端呼叫。我們先來看一下通訊的基礎知識,然後主要來看一下RPC遠端呼叫,訊息通訊大家可以參考我的下一篇文章

TCP/IP層協議模型與ISO七層模型TCP/IP系統學習2

首先我們應該瞭解到,像TCP/IP這樣的協議系統必須負責完成以下任務: 1. 把訊息分解為可管理的資料塊,並且這些資料塊能夠有效的通過傳輸介質。 2. 與網路介面卡硬體連線。 3. 定址,即傳送端計算機必須能夠定位到接收資料的計算機,接收計算機必須能夠識別

xml布局內容總結--Android

odi utf lns data- state 常常 使用 查看 andro (1)對於xml編寫界面較復雜的情況下,使用include會使得編寫和查看更清楚 <LinearLayout android:layout_width=&

權限項目總結 shiro 授權

oge als 註解 沒有 概述 當前 http ade ava 概述 Authorization(授權):不難理解,授權就是用來控制當前訪問用戶在訪問系統資源權限。 這個詞也做證書的解釋,從證書這個角度來講,推斷是否擁有對資源訪問的權限時。當前用戶

Linux常見命令——mkdir

image 訪問 找不到 direct 微軟 頁面 key 學習 -1 今天我們來介紹第四個命令:mkdir。mkdir (Make Directory 創建目錄): 若指定目錄不存在則創建目錄。在創建目錄時,要求創建目錄的用戶具有寫權限,並應保證新建的目錄沒有重名

I/O操做總結

zab 方法 字符 add i/o spa 我們 ppr bsp 前面已經把java io的主要操作講完了 這一節我們來說說關於java io的其他內容 Serializable序列化 實例1:對象的序列化 1 2 3 4 5 6 7 8 9 10 11

JAVA學習總結

服務 共同點 運行 blog 重要 程序員 ride 處理 mob 1.接口 interface 1.1語法:   修飾符 interface 接口名{     常量     都是抽象方法  } 修飾符:默認 | public接口名:自定義,規則與類名相同,一般I字母打頭:

linux基礎知識總結

基礎知識第四周學習總結 目錄 一.知識脈絡圖二.軟件包管理三.磁盤管理 一.知識脈絡圖 二.軟件包管理 1.軟件組成 二進制應用程序的組成部分: 二進制文件,庫文件,配置文件,幫助文件 庫文件: 庫文件是一個很特殊的存在,他對於很多程序起著支持作用,如果不小心

JavaSE學習總結——Java面向對象十分鐘入門

組織 table 運行時 order 3.1 project park 得到 row 目錄 一、理解類與對象及他們間的關系 1.1、對象 1.3、類與對象間的關系 二、了解面向對象編程的意義 三、定義類與實例化對象 3.1、定義類 3.2、實例化對象 四、區別

JVM調優總結-分代垃圾回收詳述

web服務器 mar you 數量 不變 all 時間 lis 完成 為什麽要分代 分代的垃圾回收策略,是基於這樣一個事實:不同的對象的生命周期是不一樣的。因此,不同生命周期的對象可以采取不同的收集方式,以便提高回收效率。 在Java程序運行的過程中,會

運維工作中經常用到的一些知識總結

Lftp SLA yourls Tomcat多實例 接上篇:http://blog.51cto.com/bobo365/2125159 54、rabbitMQ http://blog.csdn.net/lishaojun0115/article/details/53152255 用戶管理 用戶

OO學習總結

string 質量 人員 其他 png ext 內部 支持 分支 一、 測試與正確性論證的比較 測試和正確性論證分別從用戶角度和開發者角度對工程進行評估。前者能夠評測程序在一般情況和可預見的特殊情況下的執行效果,後者能夠較為全面地測試到每一個細節。 測試的優點: 所需時間

AlwaysOn業務IP和高可用IP分開使用

shadow 使用 ext ges src align proc 方案 win 方案三:主備源IP用於AG通信、主備新增IP綁定到源網卡用於業務訪問測試環境描述:AG角色主機名網絡適配器IP地址1IP地址2主庫TEST-GS-ZHXT1Ethernet010.198.197

SpringCloud開發學習總結—— 客戶端負載均衡Ribbon

均衡 spring java www ref discovery 聯合 方式 嘗試   通過上一章《SpringCloud開發學習總結(三)—— 服務治理Eureka》,我們已經搭建起微服務架構中的核心組件——服務註冊中心(包括單點模式和高可用模式)。同時還註冊了一個服務,

TCP協議學習總結

性能 bsp 復雜 完美 設置 通告 數據回顯 實時推送 實時性 很多人都說TCP協議是一個十分復雜的協議,在學習當中,我對協議每一個問題都分解學習後,每一個分解我都能體會和理解它的要點,並不難理解。但我把這些拆分的細節合並後,確認感覺這樣一個協議相對“臃腫”但又好像不得不

TCP協議學習總結

out 窗口 我們 中間 strong 以及 簡單 就是 bsp 在前兩邊TCP學習總結中,也大概地學習了TCP的整個流程,但許多細節中的細節並沒有詳細學習,例如超時重傳問題,每次瓶頸回歸慢啟動效率問題以及最大窗口限制問題等。本學習篇章最要針對這些細節中的細節進行學習。TC

TCP/IP學習筆記2-數據鏈路層

方案 網絡 n) 以及 設備 ima img 控制 不同的 數據鏈路層有三個目的: 為IP模塊發送和接收IP數據報。 為ARP模塊發送ARP請求和接收ARP應答。 為RARP發送RARP請求和接收RARP應答 ip大家都聽說過。至於ARP和RARP,ARP叫