1. 程式人生 > >簡單Socket網絡通信

簡單Socket網絡通信

技術 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;
import
java.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網絡通信