Java学习之路--网络编程
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();
}
}
__EOF__

本文作者:CaiDingChao
本文链接:https://www.cnblogs.com/CaiDingChao/p/17717588.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/CaiDingChao/p/17717588.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义