Java TCP通信


1.Socket原理

1)Socket簡介 

  socket通常稱作“套接字”,用於描述IP地址和端口號,是一個通信鏈的句柄。在Internet上的主機一般運行了多個服務軟件,同時提供幾種服務。每種服務都打開一個Socket,並綁定到一個端口上,不同的端口對應不同的服務。應用程序通常通過“套接字”向網絡發出請求或者應答網絡請求。Socket和ServerSocket類庫位於java.net包中。ServerSocket用於服務端,Socket是簡歷網絡連接時使用的。在連接成功時,應用程序兩端都會產生一個Socket實例,操作這個實例,完成所需的會話。

2)獲取本地地址和端口號

  • 獲取本地使用的端口號  
    int getLocalPort()
    返回類型為int
    

        

  • 獲取套接字綁定的本地地址
    InetAddress getLocalAddress()
    

      

  • 使用InetAddress獲取本地的地址方法
    String getCanonicaHostName()
    返回類型為String
    

      

  • 獲取此IP地址的完全限定域名  
    String getHostAddress()
    返回類型為String
    

      

3)獲取遠端地址和端口號

  • Socket獲取遠端端口號方法
    int getPort()
    返回類型為int
    

      

  • 獲取遠端套接字綁定的遠端地址
    InetAddress.getInetAddress()
    

      

案例1:Socket獲取IP、端口信息

1.設置服務端,以本機作為服務器端演示

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerSocketDemo {
	public static void main(String[] args) {
			ServerSocket server;
			try {
				server = new ServerSocket(8080);  //創建ServerSocket並申請8080服務端口
				Socket socket = server.accept();  //阻塞方法,監聽服務端口,等待客戶端的鏈接並返回一個socket實例
			} catch (IOException e) {
				e.printStackTrace();
			}
	}
}

2.設置客戶端,以本機作為客戶端演示

客戶端設置完成后,先啟動服務端,然后啟動客戶端去連接服務端,連接成功之后可以看到輸出本端與遠端的IP和端口信息

import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;

public class SocketInetAddressDemo {
	public static void main(String[] args) {
		try {
			Socket socket = new Socket("localhost",8080);
			//獲取本地使用的端口號
			int port = socket.getLocalPort();
			System.out.println("本地使用端口號:"+port);
			
			InetAddress add = socket.getLocalAddress();  //獲取本地地址信息
			//使用InetAddress獲取本地地址
			String hostname = add.getCanonicalHostName();
			System.out.println("本地地址:"+hostname);
			//獲取此IP的完全限定域名
			String hostadd = add.getHostAddress();
			System.out.println("限定域名:"+hostadd);
			//獲取遠端的端口號
			int desPort = socket.getPort();
			System.out.println("遠端端口號:"+desPort);
			//獲取遠端IP
			InetAddress inetAdd = socket.getInetAddress();
			System.out.println(inetAdd);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

/*
運行結果:
本地使用端口號:62565
本地地址:127.0.0.1
限定域名:127.0.0.1
遠端端口號:8080
localhost/127.0.0.1
*/

 

4)獲取網絡輸入流和網絡輸出流

  使用Socket獲取輸入流與輸出流,這兩個方法使用Socket通訊的關鍵方法,封裝了TCP協議的Socket是基於流進行通訊的,所以我們在創建了雙方連接后,只需要獲取相應的輸入流與輸出流即可實現通訊。

  • 返回此套接字的輸入流
    InputStream getInputStream()
    

     

  • 返回此套接字的輸出流
    OutputStream.getOutputStream()
    

      

  具體代碼示例:

public void testSocket() throws Exception{
    Socket socket = new Socket("localhost",8080);
    InputStream in = socket.getInputStream();
    OutputStream out = socket.getOutputStream();
}

  

5)close方法

  當使用Socket進行通訊完畢后,要關閉Socket以釋放系統資源。

void close()

  

2.Socket通訊模型

1)Server端ServerSocket監聽

  java.net.ServerSocket是運行於服務端應用程序中,通常創建ServerSocket需要指定服務端口號,之后監聽Sokcet的連接,監聽方法為:

Socket accept()

  該方法是一個阻塞方法,直到一個客戶端通過Socket連接后,accept會封裝一個Socket,該Socket封裝與表示該客戶端的有關的信息,通過這個Socket與該客戶端進行通信。

//創建ServerSocket並申請服務端口8080
ServerSocket server = new ServerSocket(8080);
//accept()方法會產生阻塞,直到某個Socket連接並返回請求連接的Socket
Socket socket = server.accept();

  

2)Client端Socket連接

  當服務端ServerSocket調用accept方法阻塞等待客戶端連接后,我們可以通過在客戶端應用程序中創建Socket來向服務端發起連接。

  需要注意的是:創建Socket的同時就發起連接,若連接異常會拋出異常,我們通常創建Socket時會傳入服務端的地址以及端口號。

//參數1:服務器的IP地址  參數2:服務端的服務端口號
Socket socket = new Socket("localhost",8080);

  

3)C/S端通信模型

  C/S即:Client-Server,客戶端到服務端

  客戶端與服務端通信模型如下:

  1. 服務端創建ServerSocket
  2. 通過調用ServerSocket的accept方法監聽客戶端的連接
  3. 客戶端創建Socket並指定服務端的地址以及端口來建立與服務端的連接
  4. 當服務端accept發現客戶連接后,獲取對應該客戶端的Socket
  5. 雙方通過Socket分別獲取對應的輸入與輸出流進行數據通訊
  6. 通訊結束后關閉連接

 

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM