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網路通訊的發包過程:
- 使用DatagramSocket()建立一個數據包套接字。
- 使用DatagramPacket(byte[]buf,int offset,int length,InetAddress address,int port)建立要傳送的資料包。
- 使用DatagramSocket類的send()方法資料包。
UDP網路通訊的收包過程:
- 使用DatagramSocket()建立一個數據包套接字,繫結到指定的埠。
- 使用DatagramPacket(byte[]buf,int length)建立位元組陣列來接收資料包.
- 使用DatagramPacket類的receive()方法接收UDP。
總結
網路程式設計是程式實現網路通訊的基石,在網際網路高度繁榮的當下,幾乎沒有什麼應用不需要網路支援。網路通訊基於TCP/IP,基於此,網路程式設計可以選擇使用TCP傳輸或UDP傳輸,它們兩個是比較底層的通訊協議,TCP提供可靠的連線,UDP則不提供可靠的連線,在實際應用中大多數選用TCP,而UDP主要用於音視訊、NTP對時這種對資料可靠性要求不是那麼高的場合。