JAVA实现服务器和客户端的单播/广播消息转发的Socket编程(有图形用户界面)【含源码】

该博客介绍了一个使用JAVA实现的服务器和客户端通过Socket进行单播和广播消息转发的系统。系统包括服务器和多个客户端,服务器作为中转站,客户端之间可以进行聊天。服务器启动后监听8288端口,客户端连接时需要输入昵称、服务器IP和端口。用户上线、下线及聊天信息都会通过服务器进行广播或单播。博客提供了详细的界面流程和源码。
摘要由CSDN通过智能技术生成

JAVA实现服务器和客户端的单播/广播消息转发的Socket编程



实验要求:

一个服务器,多个客户端,服务器负责消息中转,客户端之间可以互相聊天。(广播/单播)

实验环境:WINDOWS

编程环境:JAVA

 

界面流程展示:

1.   服务器界面展示

服务器监听本机的8288端口,首先需要点击启动按钮,才能通过客户端连接

 

2.   客户端界面展示

新建客户端界面后需要先输入用户昵称,服务器ip地址和端口号,点击连接既可以连接服务器。

 

3.   服务器启动

点击服务器界面的启动按钮,日志显示服务器启动成功,好友列表显示全体成员标签。

4.   客户端连接

客户端(左)单击连接按钮,客户端好友列表中显示了所有人标签(用于广播,可点击),服务器日志显示接收到客户端连接,并为客户端创建线程,同时在在线用户列表中添加客户端用户昵称。

 

5.用户上线通知

    再打开两个客户端,服务器收到新的客户端连接的请求,并将用户上线的消息向所有用户转发。服务器和每一个客户端同时也会更新在线用户列表。新上线的用户会收到服务器向其发送的原有在线用户列表信息。

 

6.用户进行群发操作(通过服务器广播)

左下角的用户点击其界面上的所有人标签,或者什么都不点击(默认为向所有人发送消息),并在输入框内部输入消息内容,点击发送。服务器接收到用户的消息,并将其向每一个用户进行转发。

 

 

7.用户进行私聊转发(单播)

右下角的用户点击了在线好友列表中的一位用户,并在输入框内输入消息点击发送。服务器接收到该消息,并将其向对应客户端转发。

 

8.服务器向群体用户广播

    服务器点击所有人标签或不点击(默认为所有人),在输入框内输入消息并点击发送。每个客户端都收到服务器发送的内容。

 

9.服务器私聊转发(单播)

    服务器点击在线用户列表中的某一个人,并输入消息点击发送。对应客户端收到消息。

 

说明文档:

客户端:

1.    声明主类Client的成员变量

这些变量都是在多处调用的,如果不声明为成员变量,利用传参的方法传递很麻烦,故在外声明。尤其是注释内容1.2的socket相关变量,不在外部声明将会导致socket关闭。

1.1  UI组件:连接、断开、发送、昵称、IP、端口、输入内容、在线列表、聊天内容

1.2  Socket相关:客户端socket,输入和输出

1.3  用户昵称:声明DefaultListModel类型的列表,向其内部添加数据可以自动同步到在线列表中

1.4  客户端线程:为了防止死锁,将客户端新建一个与UI界面无关的线程

2.    构造函数

2.1  调用UI函数显示窗口

3.    与连接服务器相关

3.1  连接服务器

3.1.1      获取用户昵称、服务器ip、port

3.1.2      New与socket相关

3.1.3      在线列表添加所有人标签

3.1.4      向服务器发送本地账号登陆

3.1.5      为客户端新建一个与UI分离的线程用于等待服务器发送消息

4.    UI相关

4.1  显示界面

4.2  添加事件监听

4.2.1      连接

4.2.2      发送:将消息按照固定协议发送

4.2.3      选择消息发送对象

4.3输出错误:红色

4.4输出私聊内容:黑色

4.5输出上线下线内容:蓝色

4.6输出广播内容:绿色

5. 客户端线程的内部类

考虑到读取服务器消息时调用readline会将进程死锁,故新建一个线程,该线程继承了Runnable接口,在构造函数被调用后自动执行run方法

       5.1构造函数

       5.2run()

              5.2.1对服务器消息进行解析(分割)

              5.2.1按照制定协议处理消息:

登陆: LOGIN@USERNAME

普通消息: MESSAGE@TO@FROM@CONTENT

6. 发送消息

7.消息分割器

 

服务端:

1.    在主类Server中声明必要的成员变量

1.1  UI组件

1.2  Socket相关:服务器socket

1.3  线程相关:服务器线程、记录每一个客户端的线程地图

1.4  用户昵称

2.    构造函数

3.    启动服务器

3.1建立socket

3.2新建服务器线程

3.3新建存储客户端线程的地图

4. UI相关

       4.1生成界面窗口

       4.2添加监听器:启动、发送消息、检验目标用户

       4.3输出消息内容:黑色

       4.4输出错误提示:红色

       4.5输出成功提示:绿色

5. 服务器线程内部类

       5.1isRuning用于确定服务器是否在运行

       5.2构造函数:调用构造函数后自动调用对应线程

       5.3run()

              5.3.1循环等待下一个客户端连接,注意,这里的socket在内部声明,保证每一个客户端的socket不是同一个。

              5.3.2每接收到一个客户端socket就为其新建一个客户端线程,保证每个客户端之间互不干扰

              5.3.3将新的客户端线程添加到记录客户端线程的地图中

6.客户端线程内部类

       6.1新建线程时首先调用初始化函数,接收登陆消息

              6.1.1为每一个其他用户转发该用户的登陆消息

              6.1.2为该用户发送已经在线的用户列表

              6.1.3在线用户增加该用户的昵称

       6.2run()第二次和以后调用该方法

              6.1阻塞等待客户端传送消息

              6.2收到消息后按照对应要求解析消息

                     6.2.1MESSAGE@TO@FROM@CONTENT

              6.3按照To指向的用户对消息进行单播或广播


源码如下

Client.java

import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;

public class Client {
	//1.以下为必须在外部声明的变量
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值