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> {@Overrideprotected 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();}}
}