Java网络编程实例——简单模拟在线聊天
作者:bluesky 发布时间:2023-08-20 04:39:42
标签:Java,网络编程,在线聊天
目录
1、前提知识
2、实现思路:
1、前提知识
需要知道简单的IO流操作,以及简单的UDP发送数据包的原理。
需要用到的类:DatagramSocket、DatagramPacket
UDP数据包基于DatagramSocket发送和接收,DatagramPacket用于封装数据包
看下案例:
客户端发送消息:
正常情况下从控制台读信息,封装到DatagramPacket之中,再由DatagramSocket的send方法发出
读取到bye的时候退出聊天
public class UdpOnlineClient {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(10000);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String data = bufferedReader.readLine();
byte[] datas = data.getBytes();
DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress("localhost", 9999));
socket.send(packet);
if (data.equals("bye")){
break;
}
}
socket.close();
}
}
服务端接收消息:
DatagramSocket的receive方法接收客户端发送的消息,打印到控制台,如果信息是bye则退出聊天
public class UdpOnlineServer {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(9999);
while (true){
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
socket.receive(packet);
String msg = new String(packet.getData(), 0, packet.getLength());
System.out.println(msg);
if(msg.equals("bye")){
break;
}
}
socket.close();
}
}
试验:正常开启客户端和服务端后:
客户端发送消息:
服务端接收到信息即成功:
有了这个思路,我们只需要把发送和接收封装成发送类和接收类,使用多线程即可实现聊天了
2、实现思路:
创建UDP发送实现类TaskSend、UDP接收实现类TaskReceive,以及模拟多线程通信的通信类ChatThread1、ChatThread2
UDP发送实现类TaskSend:
public class TaskSend implements Runnable{
private String sendIP;
//自己的服务端口
private int ownPort;
private int sendPort;
//读取控制台输入流
private BufferedReader bufferedReader;
private DatagramSocket socket;
public TaskSend(String sendIP, int ownPort, int sendPort) {
this.sendIP = sendIP;
this.sendPort = sendPort;
try {
socket = new DatagramSocket(ownPort);
bufferedReader = new BufferedReader(new InputStreamReader(System.in));
} catch (SocketException e) {
e.printStackTrace();
} finally {
}
}
//发送消息
public void run() {
while (true) {
try {
String data = bufferedReader.readLine();
//打印自己的消息
System.out.println("我:"+data);
byte[] datas = data.getBytes();
DatagramPacket packet = new DatagramPacket(datas, 0, datas.length,new InetSocketAddress(sendIP,sendPort));
socket.send(packet);
if (data.equals("bye")) {
break;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
}
}
socket.close();
}
}
UDP接收实现类TaskReceive:
public class TaskReceive implements Runnable{
private int ownPort;
//发送信息的人
private String msgOwner;
private DatagramSocket socket;
public TaskReceive(int ownPort, String msgOwner) {
this.msgOwner = msgOwner;
try {
socket = new DatagramSocket(ownPort);
} catch (SocketException e) {
e.printStackTrace();
} finally {
}
}
//接收消息
public void run() {
while (true) {
try {
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
socket.receive(packet);
String msg = new String(packet.getData(), 0, packet.getLength());
System.out.println(msgOwner+":"+msg);
if (msg.equals("bye")) {
break;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
}
}
socket.close();
}
}
之后使用两个通信类开启多线程模拟一下:
模拟老师
public class ChatThread1 {
public static void main(String[] args) {
new Thread(new TaskSend("localhost",9999,10000)).start();
new Thread(new TaskReceive(9998,"老师")).start();
}
}
模拟学生
public class ChatThread2 {
public static void main(String[] args) {
new Thread(new TaskReceive(9999,"学生")).start();
new Thread(new TaskSend("localhost",9998,10001)).start();
}
}
实例:
学生
老师
到此简单的在线聊天功能就完成了,可以巩固一下之前学习的网络知识
来源:https://www.cnblogs.com/thatbluesky/archive/2021/05/30/14829154.html


猜你喜欢
- using System;using System.Web;using System.Web.Security;namespace Auth
- 一、先上效果图借用某东App的效果,如下。折叠时的效果:展开时的效果:二、ChipGroup和ChipchipGroup和chip之前写过博
- 本文实例为大家分享了WebView实现文件下载功能的具体代码,供大家参考,具体内容如下本节引言本节给大家介绍的是WebView下载文件的知识
- Java main 方法面试题的详细整理1.不用main方法如何定义一个类?不行,没有main方法我们不能运行Java类。在java 7之前
- ArratList 类:存放同一数据类型容器(只能为引用数据类型,因实际其内部存放的是地址)1.导入其所在包import java.util
- 前言本文简单介绍抽象类,接口以及它们的异同点,另附简单的代码举例。一、抽象类是什么?在 Java 语言中使用 abstract class
- 目录图像修复API操作效果源码图像修复实际应用中,图像常常容易受损,如存在污渍的镜头、旧照片的划痕、人为的涂画(比如马赛克),亦或是图像本身
- 本文实例为大家分享了C#实现飞行棋小游戏的具体代码,供大家参考,具体内容如下逻辑图 以下是掷色子的一个代码,比较有代表性,里面的逻
- 前言本文主要演示一个普通 java 项目导入IDEA的流程步骤及可能出现的问题、原因及解决办法。本文使用的部分软件版本如下:IDEA 201
- 1.1 简介 1.1.1 概述 Feign 旨在使编写 Java Http 客户端变得更容易。在使用 Ribbon + Rest
- 我就废话不多说啦,还是直接看代码吧!/** * 设置数据库是否自动提交事务 * @param flag
- jar包运行时提示jar中没有主清单属性解决办法在pom文件中添加<build> &n
- 一、Android 个人手机通讯录开发数据存储:SQLite 数据库开发工具:Android Studio二、Phone Module 简介
- 一 引入项目有个新需求,当点击或触碰TextBox时,基于TextBox的相对位置,弹出一个自定义的Keyboard,如下图所示:二 Key
- 本文所述为C#新手常犯的错误,但是实际上很多有经验的程序员也经常犯这些错误,对此特别整理了一下,供大家参考。具体如下:1、遍历List的错误
- 博主第一次安装Android Studio 3.6版本的时候就找不到R.java文件,于是在网上找个各种方法,但是都没能解决问题。注意:本博
- 今天就给大家分享android实现支付宝手势密码,很常见,像现在用微信支付,支付宝支付的时候都要自己设置的4位PIN码,然后输入PIN码后立
- 一、问题描述有时候,我们会遇到在遍历List集合的过程中删除数据的情况。看着自己写的代码,感觉完全没有问题,但就是达不到预期的效果,这是为什
- 前言做Android的这两年时间,通过研究Android源码,也会Java并发处理多线程有了自己的一些理解。那么问题来了,如何实现一个串行的
- eMMC主要是针对手机和平板电脑等产品的内嵌式存储器,由于其在封装中集成了一个控制器,且提供标准接口并管理闪存等优势,越来越受到Androi