单线程信息收发
UDP和TCP区别
udp不需要创建服务器,只要知道对方ip和端口就可以相互发送;
udp相当于发快递/短信,sender发送消息没人接收就会丢失,不会报错;
tcp相当于打电话,服务器不接受就会报错
发送者
package socket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.*;
public class UdpSender {
public static void main(String[] args) throws Exception {
//1创建发送管道
DatagramSocket socket = new DatagramSocket(8888);
//4创建包
//4.1准备数据:控制台读取流system.in
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
//4.2处理输入流转成byte[]
while (true){//循环发送
//4.3把读取流转成字符串
String data = reader.readLine();
//4.4把字符串转成byte[]
byte[] bytes = data.getBytes();
//4.5打包:数据,数据起始位,数据长度,发给的IP和端口
DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length,new InetSocketAddress("localhost", 6666));
//2发送包
socket.send(packet);
if (data.equals("bye")){//发送关键字出循环
break;
}
}
//3关闭管道
socket.close();
}
}
接收者
package socket;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpReceive {
public static void main(String[] args) throws Exception {
//1创建管道
DatagramSocket socket = new DatagramSocket(6666);//接收端口
//2接收包
while (true){
//2.1准备容器
byte[] container = new byte[1024];//容器根据实际情况创建,可优化
//2.2打包容器
DatagramPacket packet = new DatagramPacket(container, 0,container.length);
//2.3接收包
socket.receive(packet);//阻塞式接收数据
//2.4拆包
byte[] data = packet.getData();
String receiveData = new String(data,0,data.length);
String trim = receiveData.trim();//因为容器问题导致字符串很多空格
System.out.println(trim);
if (trim.equals("bye")){
break;
}
}
//4关闭通道
socket.close();
}
}