Java簡單實現UDP和TCP


TCP實現

TCP協議需要在雙方之間建立連接,通過輸入輸出流來進行數據的交換,建立需要通過三次握手,斷開需要四次揮手,保證了數據的完整性,但傳輸效率也會相應的降低。

簡單的TCP實現

//服務端
public class TcpServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8886);  // 建立服務端,ip為本機ip,端口為8886
        Socket accept = serverSocket.accept();  // 監聽客戶端的連接,一旦有客戶端連接,則會返回客戶端對應的accept
        
        InputStream in = accept.getInputStream();   //獲取到客戶端的輸出流
        byte b[] = new byte[1024];
        int len = in.read(b);
        System.out.println("接受到客戶端數據,返回數據"+new String(b,0,len));  
        
        OutputStream out = accept.getOutputStream();  // 給客戶端發送消息
        out.write("服務端已經接受".getBytes());
        
        serverSocket.close();
    }
}

// 客戶端
public class TcpClient {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1", 8886);   // 通過Socket來建立和服務端的連接
        OutputStream out = socket.getOutputStream();   // 獲取輸出流(客戶端輸出流即向服務端輸出信息)
        out.write("hello tcp Server".getBytes());  // 輸出信息
        
        InputStream in = socket.getInputStream();   // 接受服務端的消息
        byte b[] = new byte[1024];
        int len = in.read(b);
        System.out.println("接受到服務器消息 : "+new String(b,0,len));   // 輸出
        out.write("返回的的數據已經收到 ".getBytes());  // 向服務器返回消息
        socket.close();
    }
}

改進服務端,啟用多線程來接受客戶端的數據

// server
 public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8886); // 建立服務端,ip為本機ip,端口為8886
        int i=4;
        while(i>2){
            Socket accept = serverSocket.accept(); // 監聽客戶端的連接,一旦有客戶端連接,則會返回客戶端對應的accept
            
            ServerThread st = new ServerThread(accept);   // 啟動線程
            Thread th = new Thread(st);
            th.start();
        }
        serverSocket.close();
    }

// thread

public class ServerThread implements Runnable {
    private Socket accept;
    public ServerThread(Socket s) {
        this.accept = s;
    }
    public void run(){
        InputStream in;
        try {
            in = accept.getInputStream();
            byte b[] = new byte[1024];
            int len = in.read(b);
            System.out.println("接受到客戶端數據,返回數據" + new String(b, 0, len));
            OutputStream out = accept.getOutputStream(); // 給客戶端發送消息
            out.write("服務端已經接受".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        } 
    }
}

傳遞圖片


// 服務端

public class Server {
    public static void main(String[] args) throws IOException {

        ServerSocket serverSocket = new ServerSocket(5555);
        Socket ss = serverSocket.accept();
        
        BufferedInputStream br = new BufferedInputStream(ss.getInputStream());

        BufferedOutputStream bw = new BufferedOutputStream(new FileOutputStream("copy.jpg"));  // 寫出文件流
       
        byte b[] = new byte[1024];
        int len = 0;
 
        while ((len = br.read(b)) != -1) {   // 寫出文件
            bw.write(b, 0, len);
            bw.flush();  // 別忘了刷新,要不然最后一塊緩沖區字符串會缺失
        }

        BufferedWriter bw2 = new BufferedWriter(new OutputStreamWriter(ss.getOutputStream())); // 輸出
        bw2.write("圖片傳輸成功");
        bw2.flush();
        
        bw.close();
        ss.close();
    }

}


// 客戶端

public class Client {
    public static void main(String[] args) throws UnknownHostException, IOException {
        Socket socket = new Socket("127.0.0.1", 5555);
        BufferedInputStream in = new BufferedInputStream(new FileInputStream("c.jpg"));

        BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());

        byte b[] = new byte[1024];
        int len = 0;

        while ((len = in.read(b)) != -1) {
            out.write(b, 0, len);
            out.flush();    // 刷新緩沖區 要不然最后一塊緩沖區字符串會缺失
        }
        
        socket.shutdownOutput();   // 關閉流以后Server段才會接收道結束字符結束接受

        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String line;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
        
        in.close();
        socket.close();

    }

}

UDP實現

UDP是將數據打成數據包向對方發送,只關系是否發送成功,而不關心是否接收成功,傳輸速度快,但是可靠性低。

udp代碼實現

// 發送端
public class SendDemo {
    public static void main(String[] args) throws IOException {
        DatagramSocket ds = new DatagramSocket(); // 此類表示用來發送和接收數據報包的套接字。
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 鍵盤輸入
        String line = null;
        while ((line = br.readLine()) != null) {
            byte[] bytes = line.getBytes();
            DatagramPacket dp = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("127.0.0.1"), 10005); // 數據包對象
            ds.send(dp);
            if ("886".equals(line)) { // 當輸入886時結束發送
                break;
            }
        }
        ds.close();
    }

}


// 接收端

public class ReciveDemo {
    public static void main(String[] args) throws IOException {
        DatagramSocket ds = new DatagramSocket(10005); // 建立服務端
        byte bytes[] = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length); // 建立數據包對象
        while (true) {
            ds.receive(dp); // 接受數據包
            byte[] data = dp.getData(); // 獲取數據
            String str = new String(data, 0, dp.getLength());
            if ("886".equals(str)) {
                break;
            }
            System.out.println(str);
        }
        ds.close();
    }
}


免責聲明!

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



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