返回

Android网络编程之TCP、UDP详解

Android

Android网络编程

Android 网络编程主要是通过套接字来实现的。

  • 套接字是两个程序在网络上进行通信时所使用的端点。
  • 每个套接字都有一个唯一的标识符,称为套接字符。

TCP 和 UDP

  • TCP(传输控制协议)是一种面向连接的协议,需要在两个应用程序之间建立连接。
  • UDP(用户数据报协议)是一种无连接的协议,不需要在两个应用程序之间建立连接。

TCP

  • TCP 协议是Android网络编程中使用最广泛的协议之一,主要用于在两个应用程序之间传输可靠的数据。
  • TCP 协议提供了以下特性:
  • 连接性 :TCP 连接是建立在客户端和服务器之间的,连接一旦建立,就可以在两个应用程序之间传输数据。
  • 可靠性 :TCP 协议保证数据在传输过程中不会丢失或损坏。
  • 顺序性 :TCP 协议保证数据按照发送的顺序接收。
  • 流量控制 :TCP 协议提供流量控制机制,防止发送方发送数据太快,导致接收方无法处理。

UDP

  • UDP 协议是Android网络编程中使用较少的协议,主要用于在两个应用程序之间传输不那么重要的数据。
  • UDP 协议没有TCP协议那么可靠,它不保证数据在传输过程中不会丢失或损坏。
  • UDP 协议没有连接性,它不需要在两个应用程序之间建立连接。
  • UDP 协议没有顺序性,数据不按照发送的顺序接收。
  • UDP 协议没有流量控制机制,发送方可以向接收方发送任意数量的数据。

代码实现

TCP客户端

import java.io.*;
import java.net.*;

public class TCPClient {

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

        // 创建一个套接字
        Socket socket = new Socket("localhost", 1234);

        // 创建一个输出流
        OutputStreamWriter osw = new OutputStreamWriter(socket.getOutputStream());

        // 写入数据
        osw.write("Hello, world!");

        // 关闭输出流
        osw.close();

        // 关闭套接字
        socket.close();
    }
}

TCP服务器

import java.io.*;
import java.net.*;

public class TCPServer {

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

        // 创建一个套接字
        ServerSocket serverSocket = new ServerSocket(1234);

        // 等待客户端连接
        Socket socket = serverSocket.accept();

        // 创建一个输入流
        InputStreamReader isr = new InputStreamReader(socket.getInputStream());

        // 读取数据
        char[] buffer = new char[1024];
        int len = isr.read(buffer);

        // 打印数据
        System.out.println(new String(buffer, 0, len));

        // 关闭输入流
        isr.close();

        // 关闭套接字
        socket.close();

        // 关闭服务器套接字
        serverSocket.close();
    }
}

UDP客户端

import java.io.*;
import java.net.*;

public class UDPClient {

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

        // 创建一个套接字
        DatagramSocket socket = new DatagramSocket();

        // 创建一个数据包
        byte[] data = "Hello, world!".getBytes();
        DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getByName("localhost"), 1234);

        // 发送数据包
        socket.send(packet);

        // 关闭套接字
        socket.close();
    }
}

UDP服务器

import java.io.*;
import java.net.*;

public class UDPServer {

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

        // 创建一个套接字
        DatagramSocket socket = new DatagramSocket(1234);

        // 创建一个数据包
        byte[] data = new byte[1024];
        DatagramPacket packet = new DatagramPacket(data, data.length);

        // 接收数据包
        socket.receive(packet);

        // 打印数据
        System.out.println(new String(packet.getData(), 0, packet.getLength()));

        // 关闭套接字
        socket.close();
    }
}