1. 程式人生 > >Java網路程式設計實現

Java網路程式設計實現

前言

計算機網路實現了多個網路終端的互聯,彼此之間能夠進行資料交流。而網路應用程式就是在已連線的不同終端裝置上執行的程式,這些網路程式相互之間可以進行資料互動。網路程式的資料互動則依賴於TCP/IP協議,在實際應用中TCP網路程式提供可靠的資料通訊,而UDP網路程式則不保證資料的可靠性,但是協議簡單、傳輸速度快(比如用在音視訊資料傳輸,它們不需要很高的可靠性,偶爾丟幀是可以忍受的)。

ServerSocket類

Java.net包中的ServerSocket類用於表示伺服器套接字,其主要功能是監聽客戶端的請求,然後將客戶端的請求連線存入佇列中,預設請求佇列大小是50。構造方法主要有以下幾種形式:

ServerSocket():建立非繫結伺服器套接字。

ServerSocket(int port):建立繫結到特定埠的伺服器套接字。

ServerSocket(int port,int backlog):利用指定的backlog建立伺服器套接字並將其繫結到指定的本地埠號。

ServerSocket(int port,int backlog,InetAdress bindAddress):使用指定的埠、監聽backlog和要繫結到本地IP地址建立伺服器,適用於計算機有多個網絡卡、多個IP的情景。

TCP網路程式例項

服務端程式程式碼

//服務端程式
import java.io.*;
import java.net.*;
public class MyTcpServer {
	private BufferedReader reader;
	private PrintWriter writer;
	private ServerSocket server;
	private Socket socket;
	void getserver(){
		try{
			server = new ServerSocket(8866);
			System.out.println("伺服器套接字已經建立成功");
			while(true){
				System.out.println("等待客戶機的連線");
				socket = server.accept();	//阻塞的
				reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
				writer = new PrintWriter(socket.getOutputStream(),true);
				getClientMessage();			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	private void getClientMessage(){
		try{
			while(true){
				System.out.println("客戶端資訊接收:"+ reader.readLine());
				writer.println("歡迎您連線服務端");
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		try{
			if(reader != null){
				reader.close();
			}
			if(writer != null){
				writer.close();
			}
			if(socket != null){
				socket.close();
			}
		}catch(IOException e){
			e.printStackTrace();
		}
	}
}
public class Main {
	public static void main(String[] args) {
		MyTcpServer tcpserv = new MyTcpServer();
		tcpserv.getserver();
	}

}

客戶端程式程式碼

//客戶端程式
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;


public class MyTcpClient {
	private PrintWriter writer;
	private BufferedReader reader;
	Socket socket;
	public void connect(){
		System.out.println("嘗試連線");
		try{
			socket = new Socket("127.0.0.1",8866);
			writer = new PrintWriter(socket.getOutputStream(),true);
			reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			System.out.println("連線成功");
			writer.println("你好,來自客戶端的連線");
			getserverMessage();
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	private void getserverMessage(){
		try{
			while(true){
				System.out.println(":"+ reader.readLine());				
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		try{
			if(reader != null){
				reader.close();
			}
			if(writer != null){
				writer.close();
			}
			if(socket != null){
				socket.close();
			}
		}catch(IOException e){
			e.printStackTrace();
		}
	}
	
}

public class Main {
	public static void main(String[] args) {
		MyTcpClient tcpclient;
		tcpclient = new MyTcpClient();
		tcpclient.connect();
	}

}

服務端執行效果圖

客戶端執行效果圖

UDP網路程式

使用UDP協議的程式流程簡單很多,它收發包流程如下:

UDP網路通訊的發包過程:

  1. 使用DatagramSocket()建立一個數據包套接字。
  2. 使用DatagramPacket(byte[]buf,int offset,int length,InetAddress address,int port)建立要傳送的資料包。
  3. 使用DatagramSocket類的send()方法資料包。

UDP網路通訊的收包過程:

  1. 使用DatagramSocket()建立一個數據包套接字,繫結到指定的埠。
  2. 使用DatagramPacket(byte[]buf,int length)建立位元組陣列來接收資料包.
  3. 使用DatagramPacket類的receive()方法接收UDP。

總結

網路程式設計是程式實現網路通訊的基石,在網際網路高度繁榮的當下,幾乎沒有什麼應用不需要網路支援。網路通訊基於TCP/IP,基於此,網路程式設計可以選擇使用TCP傳輸或UDP傳輸,它們兩個是比較底層的通訊協議,TCP提供可靠的連線,UDP則不提供可靠的連線,在實際應用中大多數選用TCP,而UDP主要用於音視訊、NTP對時這種對資料可靠性要求不是那麼高的場合。