簡單Socket網絡通信
阿新 • • 發佈:2019-02-12
技術 java content clas new ima ket t對象 sys
問題:編寫一個網絡應用程序,有客戶端和服務端,客戶端向服務端發送一個字符串(如"Hello Socket"),服務器收到該
字符串後將其打印到命令行上,然後向客戶端返回該字符串的長度,最後,客戶端輸出服務器端返回的該字符串的長度,
分別用TCP和UDP兩種方式去實現。
Socket通信流程:
實現代碼如下:
TCP:
package scoket; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; importjava.net.Socket; /** * 服務端Socket */ public class TCPServer { public static void main(String[] args) throws IOException { // 創建服務端socket,綁定端口號為65000 ServerSocket socket = new ServerSocket(65000); // 構建一個死循環,用來監聽並處理客戶端請求 while (true) { // 接收一個客戶端請求,封裝為一個Socket對象// 此時處於阻塞狀態 Socket s = socket.accept(); // 處理收到的請求 // 獲取客戶端輸入流 InputStream in = s.getInputStream(); // 獲取客戶端輸出流 OutputStream out = s.getOutputStream(); // 定義用於存客戶端信息的變量 byte[] buff = new byte[1024]; // 從輸入流中讀取數據int length = in.read(buff); // 將字節流轉化為字符串並在控制臺打印 String content = new String(buff, 0, length); System.out.println(content); // 將數據長度轉化為字節流並寫入輸出流 out.write(String.valueOf(length).getBytes()); // 關閉相關流以及socket out.close(); in.close(); s.close(); } } }
package scoket; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; /** * TCP客戶端Socket */ public class TCPClient { public static void main(String[] args) throws IOException { // 創建Socket,並指明要連接的服務器IP和端口 Socket socket = new Socket("127.0.0.1", 65000); // 獲取socket輸入流與輸出流 InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); // 客戶端將指定字符串寫入流 out.write(new String("Hello Socket").getBytes()); // 客戶端接收服務器發送的字符串長度並打印 byte[] buff = new byte[1024]; int length = in.read(buff); String content = new String(buff, 0, length); System.out.println(content); // 關閉相關的流以及Socket in.close(); out.close(); socket.close(); } }
UDP:
package scoket; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; /** * UDP客戶端Socket */ public class UDPServer { public static void main(String[] args) throws IOException { // 創建服務端Socket並綁定端口 DatagramSocket socket = new DatagramSocket(65001); // 定義存儲客戶端信息的變量 byte[] buff = new byte[1024]; // 將信息封裝為一個Packet DatagramPacket packet = new DatagramPacket(buff, buff.length); socket.receive(packet); // 從packet中取出真正的數據 byte[] data = packet.getData(); // 處理字節流數據並打印 String content = new String(data, 0, packet.getLength()); System.out.println(content); // 服務端向客戶端發送數據報 byte[] length = String.valueOf(packet.getLength()).getBytes(); // 定義新的數據報,並將原客戶端的IP和端口封裝進數據報中 DatagramPacket lengthPacket = new DatagramPacket(length, length.length, packet.getAddress(), packet.getPort()); // 發送數據給客戶端 socket.send(lengthPacket); } }
package scoket; import java.io.IOException; import java.net.*; /** * UDP客戶端Socket */ public class UDPClient { public static void main(String[] args) throws IOException { // 創建客戶端Socket DatagramSocket socket = new DatagramSocket(); // 封裝數據報,並綁定IP和端口 InetAddress address = InetAddress.getByName("127.0.0.1"); // 創建數據信息 byte[] info = "Hello Socket".getBytes(); DatagramPacket packet = new DatagramPacket(info, info.length, address, 65001); // 發送數據給服務端 socket.send(packet); // 接收服務端發來的信息 byte[] buff = new byte[1024]; DatagramPacket lengthPacket = new DatagramPacket(buff, buff.length); socket.receive(lengthPacket); // 取得真正的信息 byte[] data = lengthPacket.getData(); String content = new String(data, 0, data.length); System.out.println(content); } }
值得註意的是,運行代碼時,必須先啟動Server,再啟動Client
簡單Socket網絡通信