TCP 实现多收多发(上线下线提醒)
创建发送端
public static void main(String[] args) throws IOException {
System.out.println("客户端");
// 创建客户端对象
Socket socket = new Socket("192.168.43.1", 7771);
// 创建低级输出流并转高级
PrintStream ps = new PrintStream(socket.getOutputStream());
// 创建输入
Scanner sc = new Scanner(System.in);
while (true){
System.out.println("请说:");
ps.println(sc.nextLine());
// 刷新
ps.flush();
}
}
创建接收端
public static void main(String[] args) throws IOException {
// 创建服务端
// 调用连接方法
ServerSocket server = new ServerSocket(7771);
while (true) {
Socket accept = server.accept();
// 当用户到了这里,说明已经上线准备发送数据了
// 上线提醒应该在这里
System.out.println(accept.getRemoteSocketAddress() + "上线啦!!!");
new MyTherad(accept).start();
}
}
创建多线程
public class MyTherad extends Thread {
private Socket accept;
public MyTherad(Socket socket) {
this.accept = socket;
}
@Override
public void run() {
// 把低级流转换高级流
try {
BufferedReader buff = new BufferedReader(new InputStreamReader(accept.getInputStream()));
String msg;
while ((msg = buff.readLine()) != null) {
// 打印了
System.out.println(accept.getRemoteSocketAddress() + "说了:" + msg);
}
} catch (IOException e) {
System.out.println(accept.getRemoteSocketAddress() + "离线啦!!!");
}
}
}
使用线程池优化多收多发的代码
创建接收端
public static void main(String[] args) throws IOException {
// 创建服务端
ServerSocket server = new ServerSocket(7771);
// 创建线程池 3 个核心 5个最大,预留五个准备空位
ThreadPoolExecutor pool = new ThreadPoolExecutor(3, 5, 6, TimeUnit.SECONDS,
new ArrayBlockingQueue<>(3), new ThreadPoolExecutor.AbortPolicy());
while (true) {
// 调用连接方法
Socket accept = server.accept();
// 当用户到了这里,说明已经上线准备发送数据了
// 上线提醒应该在这里
System.out.println(accept.getRemoteSocketAddress() + "上线啦!!!");
pool.execute(new MyTherad(accept));;
}
}
创建发送端
public static void main(String[] args) throws IOException {
// 创建客户端
Socket socket = new Socket("192.168.43.1", 7771);
// 创建打印流
PrintStream ps = new PrintStream(socket.getOutputStream());
Scanner sc = new Scanner(System.in);
while (true){
String s = sc.nextLine();
if(s.equals("exit")){
System.exit(0);
}
ps.println(s);
}
}
创建线程
public class MyTherad extends Thread {
private final Socket accept;
public MyTherad(Socket socket) {
this.accept = socket;
}
@Override
public void run() {
// 把低级流转换高级流
try {
BufferedReader buff = new BufferedReader(new InputStreamReader(accept.getInputStream()));
String msg;
while ((msg = buff.readLine()) != null) {
// 打印了
System.out.println(accept.getRemoteSocketAddress() + "说了:" + msg);
}
} catch (IOException e) {
System.out.println(accept.getRemoteSocketAddress() + "离线啦!!!");
}
}
}
UDP多收多发
创建发送端
public static void main(String[] args) throws IOException {
// 创建发送端
DatagramSocket data = new DatagramSocket();
Scanner sc = new Scanner(System.in);
while (true){
System.out.println("请说:");
String s = sc.nextLine();
if(s.equals("exit")){
data.close();
break;
}
// 写入数据
byte[] bytes = s.getBytes();
// 创建数据包
DatagramPacket pack = new DatagramPacket(bytes, 0, bytes.length, InetAddress.getLocalHost(), 6666);
data.send(pack);
}
}
创建接收端
public static void main(String[] args) throws IOException {
// 创建接收端
DatagramSocket data = new DatagramSocket(6666);
byte[] bytes = new byte[1024 * 24];
// 创建数据包
DatagramPacket pack = new DatagramPacket(bytes,bytes.length);
while (true){
// 接收数据
data.receive(pack);
// 获取数据发送的长度
int len = pack.getLength();
// 数据转换成字符串打印
String s = new String(bytes, 0, len);
System.out.println(s);
// 打印发送者ip
System.out.println(pack.getSocketAddress());
// 打印发送者端口号
System.out.println(pack.getPort());
}
}
UDP广播发送接收
只需要把发送的 ip 换成如下 OK
InetAddress.getByName("255.255.255.255")
创建发送端
public static void main(String[] args) throws IOException {
// 创建发送端
DatagramSocket data = new DatagramSocket();
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请说:");
String s = sc.nextLine();
if (s.equals("exit")) {
data.close();
break;
}
// 写入数据
byte[] bytes = s.getBytes();
// 创建数据包
DatagramPacket pack = new DatagramPacket(bytes, 0, bytes.length, InetAddress.getByName("255.255.255.255"), 6666);
data.send(pack);
}
创建接收端
public static void main(String[] args) throws IOException {
// 创建接收端
DatagramSocket data = new DatagramSocket(6666);
byte[] bytes = new byte[1024 * 24];
// 创建数据包
DatagramPacket pack = new DatagramPacket(bytes,bytes.length);
while (true){
// 接收数据
data.receive(pack);
// 获取数据发送的长度
int len = pack.getLength();
// 数据转换成字符串打印
String s = new String(bytes, 0, len);
System.out.println(s);
// 打印发送者ip
System.out.println(pack.getSocketAddress());
// 打印发送者端口号
System.out.println(pack.getPort());
}
}
UDP 组播发送接收
接收端的改变
要使用MulticastSocket,但是技术在 java14 就过时了。
// 创建接收端
MulticastSocket data = new MulticastSocket(6666);
data.joinGroup(InetAddress.getByName("224.0.3.6"));
使用新版。不适用 java 1.8
// 创建接收端
MulticastSocket data = new MulticastSocket(6666);
data.joinGroup(new InetSocketAddress(InetAddress.getByName("224.0.3.6"),6666),
NetworkInterface.getByInetAddress(InetAddress.getLocalHost()));
发送端
public static void main(String[] args) throws IOException {
// 创建发送端
DatagramSocket data = new DatagramSocket();
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请说:");
String s = sc.nextLine();
if (s.equals("exit")) {
data.close();
break;
}
// 写入数据
byte[] bytes = s.getBytes();
// 创建数据包 组播地址,在224之间
DatagramPacket pack = new DatagramPacket(bytes, bytes.length,
InetAddress.getByName("224.0.0.1"), 9999);
data.send(pack);
}
}
接收端
public static void main(String[] args) throws IOException {
// 创建接收端
MulticastSocket data = new MulticastSocket(9999);
data.joinGroup(new InetSocketAddress(InetAddress.getByName("224.0.0.1"), 9999),
NetworkInterface.getByInetAddress(InetAddress.getLocalHost()));
byte[] bytes = new byte[1024 * 64];
// 创建数据包
DatagramPacket pack = new DatagramPacket(bytes, bytes.length);
while (true) {
// 接收数据
data.receive(pack);
// 获取数据发送的长度
int len = pack.getLength();
// 数据转换成字符串打印
String s = new String(bytes, 0, len);
System.out.println(s);
// 打印发送者ip
System.out.println(pack.getSocketAddress());
// 打印发送者端口号
System.out.println(pack.getPort());
}
}