Java实现一个简易聊天室流程
作者:宏远十一冠王 时间:2023-10-02 19:55:53
说到网络,相信大家都对TCP、UDP和HTTP协议这些都不是很陌生,学习这部分应该先对端口、Ip地址这些基础知识有一定了解,后面我们都是直接上demo来解释代码
文件传输
Tcp方式
这里我们指的是C/S架构的文件传输,需要涉及一个客户端Client和服务器端(Server),这里采用的是TCP协议进行传输的,TCP需要经过三次握手和四次挥手,需要注意的是Client上传文件我们需要告诉服务器,我已经传输完成了socket.shutdownOutput()。
服务器
import java.io.*;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class TestServerUpload {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(9999);
Socket socket = serverSocket.accept();
// 或去输入
InputStream is = socket.getInputStream();
FileOutputStream outputStream = new FileOutputStream(new File("receive.jpg"));
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
OutputStream outputStream1 = socket.getOutputStream();
outputStream1.write("我接收完毕了".getBytes());
is.close();
outputStream.close();
serverSocket.close();
serverSocket.close();
outputStream1.close();
}
}
客户端
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
public class TestClientUpload {
public static void main(String[] args) throws Exception {
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9999);
// 创建输出流
OutputStream outputStream = socket.getOutputStream();
FileInputStream fileInputStream = new FileInputStream(new File("1.jpg"));
byte[] buffer = new byte[1024];
int len;
while (((len = fileInputStream.read(buffer))) != -1) {
outputStream.write(buffer, 0, len);
}
// 通知服务器我已经结束了
socket.shutdownOutput();
InputStream inputStream = socket.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer2 = new byte[1024];
int len2;
while ((len2 = inputStream.read(buffer2)) != -1) {
baos.write(buffer2, 0, len2);
}
System.out.println(baos.toString());
socket.close();
fileInputStream.close();
outputStream.close();
inputStream.close();
baos.close();
}
}
Udp 方式
UDP是一种只管发送,不需要确保你已经接收的通信协议,就比如短信,我只管发送给您,但是不管有没有接收到。
public class UdpClient {
public static void main(String[] args) throws Exception {
// 1. 建包
DatagramSocket socket = null;
try {
socket = new DatagramSocket();
} catch (SocketException e) {
e.printStackTrace();
}
// 2. 建个包
String msg = "早安呀,大勇";
InetAddress localhost = InetAddress.getByName("localhost");
int port = 9999;
DatagramPacket datagramPacket = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port);
// 3. 发送包
socket.send(datagramPacket);
socket.close();
}
}
public class UdpServer {
public static void main(String[] args) throws Exception{
// 开发端口
DatagramSocket socket = new DatagramSocket(9999);
// 收包
byte[] buffer = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(buffer, 0, buffer.length);
// 阻塞接收
socket.receive(datagramPacket);
System.out.println(new String(datagramPacket.getData(), 0, datagramPacket.getLength()));
System.out.println(datagramPacket.getAddress().getHostAddress());
socket.close();
}
}
简易聊天室的实现
接收端
public class TalkReceive implements Runnable {
DatagramSocket socket;
private int port;
private String msgFrom;
public TalkReceive(int port, String msgFrom) {
this.msgFrom = msgFrom;
this.port = port;
try {
socket = new DatagramSocket(port);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
try {
byte[] buffer = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(buffer, 0, buffer.length);
socket.receive(datagramPacket);
if (datagramPacket.getLength() > 0) {
byte[] data = datagramPacket.getData();
String receiveDatas = new String(data, 0, data.length);
System.out.println("接收到了"+ msgFrom + receiveDatas);
if ("bye".equals(receiveDatas)) {
break;
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
socket.close();
}
}
发送端
public class TalkSend implements Runnable {
DatagramSocket socket = null;
private int fromPort;
private String toIp;
private int toPort;
BufferedReader reader = null;
public TalkSend(int fromPort, String toIp, int port) {
this.fromPort = fromPort;
this.toIp = toIp;
this.toPort = port;
try {
socket = new DatagramSocket(fromPort);
reader = new BufferedReader(new InputStreamReader(System.in));
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
try {
String data = reader.readLine();
byte[] datas = data.getBytes();
DatagramPacket packet = new DatagramPacket(datas, 0, data.length(), new InetSocketAddress(this.toIp, toPort));
socket.send(packet);
if ("bye".equals(data)) {
break;
}
} catch (Exception e) {
e.printStackTrace();
}
// 数据
}
socket.close();
}
}
启动
public class TalkStudent {
public static void main(String[] args) {
new Thread(new TalkSend(7777, "localhost", 9999)).start();
new Thread(new TalkReceive(8888, "老师")).start();
}
}
public class TalkTeacher {
public static void main(String[] args) {
new Thread(new TalkSend(5555, "localhost", 8888)).start();
new Thread(new TalkReceive(9999, "学生")).start();
}
}
来源:https://blog.csdn.net/zly03/article/details/127712315
标签:Java,聊天室
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
C++ 中的异常抛出和捕获方式
2021-06-08 21:24:19
深入理解Java设计模式之抽象工厂模式
2023-11-28 12:11:34
![](https://img.aspxhome.com/file/2023/6/60336_0s.jpg)
Android编程中避免内存泄露的方法总结
2023-07-27 19:32:50
使用Sharding-JDBC对数据进行分片处理详解
2021-07-27 23:46:04
![](https://img.aspxhome.com/file/2023/2/108942_0s.jpg)
一文看懂C#中List的扩容机制
2022-11-04 22:12:01
![](https://img.aspxhome.com/file/2023/3/129673_0s.png)
Java用 Rhino/Nashorn 代替第三方 JSON 转换库
2023-11-04 02:20:26
c#调用qq邮箱smtp发送邮件修改版代码分享
2023-04-03 11:11:31
基于spring-boot和docker-java实现对docker容器的动态管理和监控功能[附完整源码下载]
2022-02-04 00:41:18
![](https://img.aspxhome.com/file/2023/6/82446_0s.png)
Android使用CountDownTimer模拟短信验证倒计时
2022-10-24 18:00:28
![](https://img.aspxhome.com/file/2023/3/123243_0s.gif)
快速解决commons-fileupload组件无法处理自定义head信息的bug
2023-03-05 15:20:14
springcloud feign传输List的坑及解决
2023-06-20 18:31:57
Android开发登陆案例
2022-03-19 10:13:01
![](https://img.aspxhome.com/file/2023/3/137743_0s.png)
如何利用Spring MVC实现RESTful风格
2021-06-06 02:02:13
![](https://img.aspxhome.com/file/2023/6/80936_0s.png)
C#使用NPOI将excel导入到list的方法
2023-11-17 22:49:09
![](https://img.aspxhome.com/file/2023/6/100116_0s.jpg)
Android App中自定义View视图的实例教程
2021-08-16 16:54:35
![](https://img.aspxhome.com/file/2023/7/137857_0s.jpg)
Kotlin协程与并发深入全面讲解
2022-09-11 12:28:25
![](https://img.aspxhome.com/file/2023/6/127216_0s.png)
springboot 项目启动后无日志输出直接结束的解决
2023-05-25 02:28:21
![](https://img.aspxhome.com/file/2023/0/66240_0s.gif)
Javaweb El表达式实例详解
2021-06-21 22:59:32
![](https://img.aspxhome.com/file/2023/8/94368_0s.png)
解析C#彩色图像灰度化算法的实现代码详解
2022-01-26 07:34:55
SpringBoot 如何使用RestTemplate发送Post请求
2022-03-03 09:35:47
![](https://img.aspxhome.com/file/2023/7/66527_0s.png)