Java学习之路--网络编程

发布时间 2023-09-20 16:02:26作者: 寂灭无言
package com.kuang.chat;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

//2023.3.6/3.7 采用UDP 方式 多线程 实现互相循环聊天------接收端代码实现
public class TalkReceive implements Runnable{
//套接字
DatagramSocket socket = null;
//自己的端口号
private int port;
//消息的发送者
private String msgFrom;

public TalkReceive(int port, String msgFrom) {
this.port = port;
this.msgFrom = msgFrom;

try {
//1.建立套接字,绑定端口号
socket = new DatagramSocket(this.port);
} catch (Exception e) {
e.printStackTrace();
}
}

@Override
public void run() {

//2.建立数据包,用来接收数据
byte[] buffer = new byte[1024];//缓冲区

while (true){
try {
// //2.建立数据包,用来接收数据
// byte[] buffer = new byte[1024];//缓冲区---数据包拿到外面去放着是为了避免一直发送和接收第一条消息
DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
socket.receive(packet);//3.接收数据----阻塞式接收包裹

//4.获取接收的数据,并编译成String
byte[] packetData = packet.getData();
String receiveData = new String(packetData,0, packetData.length);

//打印数据
System.out.println(msgFrom + "发送消息:" + receiveData.trim());

//5.如果接收到对话bye,则断开连接
if (receiveData.trim().equals("bye")){
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
socket.close();
}
}

//
package com.kuang.chat;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

//2023.3.6/3.7 采用UDP 方式 多线程 实现互相循环聊天-----发送端代码实
public class TalkSend implements Runnable {
//套接字
DatagramSocket socket = null;
//控制台输入的一行字符
BufferedReader reader = null;

//发送地的端口号,接受地的IP、端口号
private int fromPort;
private String toIP;
private int toPort;

public TalkSend(int fromPort, String toIP, int toPort) {
this.fromPort = fromPort;
this.toIP = toIP;
this.toPort = toPort;

// reader = new BufferedReader(new InputStreamReader(System.in));
try {
//1.建立套接字,绑定端口号
socket = new DatagramSocket(fromPort);//1.建立套接字,绑定端口号
//准备数据:控制台读取System.in---获取控制台输入的一行字符
reader = new BufferedReader(new InputStreamReader(System.in));
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void run() {

while (true) {
try {
//2.建立数据包,用来发送数据
String s = reader.readLine();
byte[] datas = s.getBytes();//编译成byte[] 数组
DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress(this.toIP, this.toPort));
//3.发送数据
socket.send(packet);

//4.如果发送对话bye,则断开连接
if (s.trim().equals("bye")) {
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
socket.close();
}
}

//
package com.kuang.chat;

//2023.3.7 UDP 多线程实现在线聊天 学生端---调用发送端和接收端的实现代码
public class TalkStudent {
public static void main(String[] args) {

//1.学生发送消息:从学生端口(数字随意)发送到老师端口
new Thread(new TalkSend(1,"localhost",9999)).start();

//2.学生接收信息:学生端口8888,接收的信息从“老师”那端来
new Thread(new TalkReceive(8888,"老师")).start();
}
}

//
package com.kuang.chat;

//2023.3.7 UDP 多线程实现在线聊天 老师端---调用发送端和接收端的实现代码
public class TalkTeacher {
public static void main(String[] args) {

//2.老师发送消息:从老师端口(数字随意),发送到学生端口8888
new Thread(new TalkSend(2,"localhost",8888)).start();

//1.老师接收消息:老师端口9999,接收的消息从 “学生” 而来
new Thread(new TalkReceive(9999,"学生")).start();
}
}

//
package com.kuang.chat;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UdpReceiveDemo01 {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(6666);


while (true){
//准备接收包裹
byte[] container = new byte[1024];
DatagramPacket packet = new DatagramPacket(container,0,container.length);
socket.receive(packet);//阻塞式接收包裹

//断开连接 bye
byte[] data = packet.getData();
String receiveData = new String(data,0, data.length);
System.out.println(receiveData);

if (receiveData.equals("bye")){
break;
}
}
socket.close();
}
}

//
package com.kuang.chat;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

//2023.3.6 UDP 方式 实现互相循环聊天,Sender--发送方 Receive--接收方
public class UdpSenderDemo01 {
public static void main(String[] args) throws Exception {

DatagramSocket socket = new DatagramSocket(8888);

//准备数据:控制台读取System.in
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

while (true){
String data = reader.readLine();
byte[] datas = data.getBytes();
DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",6666));

socket.send(packet);
if (datas.equals("bye")){
break;
}
}
socket.close();
}
}