TCP与UDP区别
TCP特点 面向连接,传输可靠,速度比udp慢。适用于传输大量的数
据,对可靠性要求较高的场景;
UDP特点 面向无连接,传输不可靠,速度快。传送少量数据、对可靠性要求不高的场景。
基于Socket的UDP编程
TCP通信中包含服务端和客户端,下面分别讲述。
服务端
第一步 创建DatagramSocket对象(指定要监听的端口);
第二步 调用DatagramSocket的receive方法接收客户端发过来的数据包,客户端发过来的数据包是一个DatagramPacket类型,通过DatagramPacket可以获取到客户端使用的端口和地址。
下面贴上代码:
public class UdpServer extends Base {
private DatagramSocket mSocket;
private boolean mIsStop;
UdpServer(BaseListener listener) {
super(listener);
}
public void start() {
new Thread(new Runnable() {
@Override
public void run() {
try {
mIsStop = false;
mSocket = new DatagramSocket(9090);
while (!mIsStop) {
recv();
}
} catch (SocketException e) {
e.printStackTrace();
}
}
}).start();
}
public void stop() {
mIsStop = true;
if (mSocket == null) {
return;
}
mSocket.close();
mSocket = null;
}
public boolean send(@NonNull final DatagramPacket packet, @NonNull final String content) {
if (mSocket == null) {
return false;
}
new Thread(new Runnable() {
@Override
public void run() {
byte[] bytes = content.getBytes();
try {
mSocket.send(new DatagramPacket(bytes, bytes.length, packet.getAddress(),
packet.getPort()));
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
return true;
}
private void recv() {
if (mSocket == null) {
return;
}
byte[] bytes = new byte[1024];
DatagramPacket mRecvPacket = new DatagramPacket(bytes, bytes.length);
try {
mSocket.receive(mRecvPacket);
mHandler.sendMsgRecv(new String(bytes));
send(mRecvPacket, "hello world " + new Date().toString());
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端
第一步 创建DatagramSocket对象;
第二步 调用DatagramSocket的send方法发送数据包到服务端,数据包是DatagramPacket类型。
下面贴上代码:
public class UdpClient extends Base {
private DatagramSocket mSocket;
private boolean mIsStop;
UdpClient(BaseListener listener) {
super(listener);
}
public void start() {
new Thread(new Runnable() {
@Override
public void run() {
try {
mIsStop = false;
mSocket = new DatagramSocket();
while (!mIsStop) {
recv();
}
} catch (SocketException e) {
e.printStackTrace();
}
}
}).start();
}
public void stop() {
mIsStop = true;
if (mSocket == null) {
return;
}
mSocket.close();
mSocket = null;
}
public boolean send(@NonNull final String content) {
if (mSocket == null) {
return false;
}
new Thread(new Runnable() {
@Override
public void run() {
byte[] bytes = content.getBytes();
try {
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
mSocket.send(new DatagramPacket(bytes, bytes.length, inetAddress, 9090));
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
return true;
}
private void recv() {
if (mSocket == null) {
return;
}
byte[] bytes = new byte[1024];
DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
try {
mSocket.receive(packet);
mHandler.sendMsgRecv(new String(bytes));
} catch (IOException e) {
e.printStackTrace();
}
}
}