安卓基础(Socket)

1. Socket 学习网络基础准备

Socket 就像一个"信封",它帮助两台计算机互相发送消息。每个计算机都有一个地址(就像你家有地址一样),计算机通过这些地址和"信封"来收发消息。

为了让信封送到正确的地方,我们还需要知道一些规则,比如:

  • IP 地址:就像计算机的"家庭住址"。
  • 端口号:就像计算机中不同的"房间号码",帮助我们找到要给谁送信。
  • 协议:就像约定好的规则,告诉我们怎么写信、怎么送信。

2. 基于 TCP 协议的 Socket 通信

TCP 就像是你和朋友发信的时候,双方都必须同意并确认收到了信,保证信件不丢失。这样发送和接收消息是非常安全的。

  • 服务器(就像邮局)会等待你来寄信,它先开一个门(端口)。
  • 客户端(就像你家)去找这个邮局寄信。你把信寄出去,邮局会确认信收到了,保证不丢失。

3. 基于 UDP 协议的 Socket 通信

UDP 就像你丢纸飞机出去,虽然可能有时候纸飞机会掉下来或飞错地方,但速度更快。如果你不在乎纸飞机是否安全到达,只要它飞得快,这种方式就适合。

  • 你可以直接丢纸飞机(发送数据),不需要等待对方确认接收到,也不管它是否飞到对方那里。

总结:

  • TCP和UDP 都需要开放端口来接收数据。
  • TCP 在建立连接后才会开始数据传输,并且会确保数据完整。
  • UDP 会更快,但不管数据是否到达对方。
TCP客户端代码:
复制代码
import android.os.AsyncTask;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

public class TcpClient extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... voids) {
        try {
            // 创建一个Socket连接到服务器
            Socket socket = new Socket("服务器IP地址", 12345); // 12345为服务器的端口
            OutputStream outputStream = socket.getOutputStream();
            
            // 发送数据
            String message = "Hello Server";
            outputStream.write(message.getBytes());
            outputStream.flush();
            
            // 关闭连接
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

socket.getOutputStream():

  • 想象你有一个信封 ,这个信封就是 socket。
  • getOutputStream() 就是你打开信封的方式,准备把信纸(数据)放进去,准备发送给别人。

outputStream.write(message.getBytes()):

  • message 就是你想写在信纸上的内容,比如 "Hello"。
  • getBytes() 就是把信纸上的内容变成一组数字,计算机只能理解这些数字(字节),所以我们要把"Hello"变成数字形式。
  • outputStream.write() 就是把这张信纸装进信封,发送给别人,把这些数字通过信封发送出去。
  • flush() 就是确保你写的内容立刻发出去,就像你写完信后立刻把信封交给邮递员。
TCP服务器端代码:
复制代码
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {
    public static void main(String[] args) {
        try {
            // 在端口12345上开启一个服务器监听
            ServerSocket serverSocket = new ServerSocket(12345);
            while (true) {
                Socket clientSocket = serverSocket.accept();  // 等待客户端连接
                InputStream inputStream = clientSocket.getInputStream();
                
                byte[] buffer = new byte[1024];
                int bytesRead = inputStream.read(buffer);  // 读取客户端发送的数据
                
                String message = new String(buffer, 0, bytesRead);
                System.out.println("Received message: " + message);
                
                clientSocket.close();  // 关闭连接
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

UDP是一种无连接的协议,不需要建立连接,可以直接发送数据。

UDP客户端代码:
复制代码
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UdpClient {
    public static void main(String[] args) {
        try {
            // 创建DatagramSocket对象
            DatagramSocket socket = new DatagramSocket();
            
            // 数据包内容
            String message = "Hello UDP Server";
            byte[] buffer = message.getBytes();
            
            // 创建数据包,目标是服务器的IP地址和端口
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName("服务器IP地址"), 12345);
            
            // 发送数据包
            socket.send(packet);
            
            socket.close();  // 关闭连接
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
UDP服务器端代码:
复制代码
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UdpServer {
    public static void main(String[] args) {
        try {
            // 创建DatagramSocket对象,监听12345端口
            DatagramSocket socket = new DatagramSocket(12345);
            
            byte[] buffer = new byte[1024];
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
            
            while (true) {
                // 接收数据
                socket.receive(packet);
                
                // 打印接收到的消息
                String message = new String(packet.getData(), 0, packet.getLength());
                System.out.println("Received message: " + message);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
相关推荐
重生之高冷汉堡包2 分钟前
Perplexity爬虫怎么做?2026常见方案对比、实操教程与问题排查
大数据·网络·爬虫·安全·ai
承渊政道6 分钟前
Linux网络学习【深入理解应用层HTTP协议、Cookie与Session机制及HTTPS协议原理】
linux·网络·学习·http·cookie·session
启博网络16 分钟前
IPv4枯竭、NAT穿透卡顿?用公网IPv6直连搭建异地组网,速度直接起飞
网络·远程安全访问·启博
羑悻的小杀马特17 分钟前
超越Bridge:全面掌握Docker网络隔离与通信的底层逻辑!
运维·网络·docker·容器
电梯界知识分子1 小时前
江西赣州赣县三层设计师自建房:1700mm中空极限利用,全观光铝合金电梯的精度与防震处理
大数据·服务器·网络·人工智能·家用电梯
裕晟资质规划21 小时前
三类资质变更报告时限差在哪?军工 15 日、集成印制 10 日
大数据·服务器·网络
轻舟技术A21 小时前
Provider 不属于 Agent 核心:rpi 的分层理由与收益
服务器·网络
Escalating_xu21 小时前
【Linux 网络编程】TCP Socket 编程(上):从 listen、accept 到完整回显通信
linux·网络·tcp/ip
NetX行者21 小时前
Python 工程化入门:从脚本到规范的 Python 项目结构
网络·python
Yang961121 小时前
从相位噪声到实时带宽:HD-063B支撑的频谱实验项目
网络