怎么实现java一对一聊天室?可以介绍一下吗

怎么实现java一对一聊天室?可以介绍一下吗,第1张

要实现Java一对一聊天室,可以使用Socket编程,以下是一个简单的实现步骤:
1创建客户端服务器端的Socket对象,分别用于连接客户端和服务器端;
2在客户端和服务器端中分别创建输入和输出流,用于发送和接收消息
3实现客户端和服务器端的消息传递机制,即客户端和服务器端可以相互发送和接收消息;
4实现GUI,即为客户端创建一个用户界面,使得用户可以方便地输入和接收消息;
5在代码中添加异常处理机制,以处理可能发生的异常情况。

package service_client_for_many;
import javaawtBorderLayout;
import javaawtFont;
import javaawteventActionEvent;
import javaawteventActionListener;
import javaioIOException;
import javanetServerSocket;
import javanetSocket;
import javautilVector;
import javaxswingJButton;
import javaxswingJFrame;
import javaxswingJPanel;
import javaxswingJScrollPane;
import javaxswingJTextArea;
import javaxswingJTextField;
/
双工服务器,多人 本服务器默认不提供服务,而是在客户端连接时创建独立线程负责业务
/
public class MutilServer implements ActionListener {
private JFrame frame;
/ 边界布局的主面板 /
private JPanel panelMain;
private JPanel panelDown;
private JTextArea ta;
private JTextField txt;
private JButton but;
private JScrollPane jsp;
private Font font;
/
当前服务器使用端口
/
private int port = 6666;
/
远程客户端的IP
/
private String clientIp;
/
记录所有正在工作的服务员的登记表
/
private Vector<Waiter> dengJiBiao;
public MutilServer() {
frame = new JFrame("双工多人服务器");
panelMain = new JPanel(new BorderLayout());
panelDown = new JPanel();
ta = new JTextArea();
txt = new JTextField(20);
but = new JButton("发送");
jsp = new JScrollPane(ta);
// 粘贴界面
panelDownadd(txt);
panelDownadd(but);
panelMainadd(jsp, BorderLayoutCENTER);
panelMainadd(panelDown, BorderLayoutSOUTH);
// 字体
font = new Font("宋体", FontBOLD, 18);
txtsetFont(font);
tasetFont(font);
butsetFont(font);
// 文本域只读
tasetEditable(false);
// 按钮添加监听
butaddActionListener(this);
frameadd(panelMain);
framesetBounds(100, 300, 400, 400);
framesetDefaultCloseOperation(JFrameEXIT_ON_CLOSE);// 关闭窗体时结束程序
framesetAlwaysOnTop(true);// 永远在所有窗体最上
framesetVisible(true);
// 创建登记表
dengJiBiao = new Vector<Waiter>();
// 光标给消息文本框
txtrequestFocus();
createServer();
}
/
显示文本到文本域,并且追加一个换行

@param msg
要显示的文本
/
public void showTxt(String msg) {
taappend(msg + "\n");
}
public static void main(String[] args) {
new MutilServer();
}
// 动作监听
public void actionPerformed(ActionEvent e) {
if (egetSource() == but) {// 发送
txtrequestFocus();
String str = txtgetText()trim();
if(strlength()==0){
showTxt("不可以发送空消息");
return;
}
if(dengJiBiaosize()==0){
showTxt("当前木有客户连接,无法发送信息");
return;
}
str ="服务器消息:"+str;
//找到所有登记表中的服务员,实现群发
for (int i = 0; i < dengJiBiaosize(); i++) {
Waiter w = dengJiBiaoget(i);//得到当前循环的服务员
wsend(str);
}
// 清空文本框,得到焦点
txtsetText("");
}
}
/
启动网络服务器
/
public void createServer() {
showTxt("正在启动服务器,使用本机" + port + "端口");
try {
ServerSocket server = new ServerSocket(port);
showTxt("服务器启动成功,开始监听网络连接");
while (true) {
Socket jiaoYi = serveraccept();
// 每得到一个交易,就是来了一个客户端需要交给一个新的服务员去维护处理
new Waiter(jiaoYi, dengJiBiao, this);
}
} catch (IOException e) {
showTxt("服务器启动失败,可能端口被占用");
}
}
}
package service_client_for_many;
import javaawtBorderLayout;
import javaawtFont;
import javaawteventActionEvent;
import javaawteventActionListener;
import javaioBufferedReader;
import javaioBufferedWriter;
import javaioIOException;
import javaioInputStreamReader;
import javaioOutputStreamWriter;
import javanetSocket;
import javanetUnknownHostException;
import javaxswingJButton;
import javaxswingJFrame;
import javaxswingJPanel;
import javaxswingJScrollPane;
import javaxswingJTextArea;
import javaxswingJTextField;
/ 客户端双工 /
public class MyClient implements ActionListener{
private JFrame frame;
/ 边界布局的主面板 /
private JPanel panelMain;
private JPanel panelDown;
private JTextArea ta;
private JTextField txt;
private JButton but;
private JScrollPane jsp;
private Font font;
/
服务器IP
/
private String ip = "19216810239";
/
服务器端口
/
private int port = 6666;
private BufferedReader br;
private BufferedWriter bw;
public MyClient() {
frame = new JFrame("双工客户端1");
panelMain = new JPanel(new BorderLayout());
panelDown = new JPanel();
ta = new JTextArea();
txt = new JTextField(20);
but = new JButton("发送");
jsp = new JScrollPane(ta);
// 粘贴界面
panelDownadd(txt);
panelDownadd(but);
panelMainadd(jsp, BorderLayoutCENTER);
panelMainadd(panelDown, BorderLayoutSOUTH);
// 字体
font = new Font("宋体", FontBOLD, 18);
txtsetFont(font);
tasetFont(font);
butsetFont(font);
// 文本域只读
tasetEditable(false);
//按钮添加监听
butaddActionListener(this);
frameadd(panelMain);
framesetBounds(500, 200, 400, 400);
framesetDefaultCloseOperation(JFrameEXIT_ON_CLOSE);// 关闭窗体时结束程序
framesetAlwaysOnTop(true);// 永远在所有窗体最上
framesetVisible(true);
// 光标给消息文本框
txtrequestFocus();
linkServer();
}
/ 显示文本到文本域,并且追加一个换行
@param msg 要显示的文本
/
public void showTxt(String msg) {
taappend(msg+"\n");
}
public static void main(String[] args) {
new MyClient();
}
//动作监听
public void actionPerformed(ActionEvent e) {
if (egetSource() == but) {// 发送
if (bw == null) {
showTxt("当前没有客户端连接,无法发送消息");
return;
}
String s = txtgetText()trim();// 得到文本框要发送的文字,去掉两端空格
if (slength() == 0) {
showTxt("不可以发送空消息");
return;
}
showTxt("我说:" + s);
try {
bwwrite(s + "\n");// 发送网络消息给对方
bwflush();// 清空缓冲
} catch (IOException e1) {
showTxt("信息:" + s + " 发送失败");
}
// 清空文本框,得到焦点
txtsetText("");
txtrequestFocus();
}
}
/
连接服务器
/
public void linkServer(){
showTxt("准备连接服务器"+ip+":"+port);
try {
Socket jiaoYi = new Socket(ip,port);
showTxt("连接服务器成功,开始进行通讯");
// 得到输入和输出
br = new BufferedReader(new InputStreamReader(
jiaoYigetInputStream()));
bw = new BufferedWriter(new OutputStreamWriter(
jiaoYigetOutputStream()));
String s = null;
while ((s = brreadLine()) != null) {
showTxt( s);
}
} catch (UnknownHostException e) {
showTxt("连接服务器失败,网络连通错误");
} catch (IOException e) {
showTxt("与服务器通讯失败,已经断开连接");
}
showTxt("关闭");
}
}
package service_client_for_many;
import javaawtBorderLayout;
import javaawtFont;
import javaawteventActionEvent;
import javaawteventActionListener;
import javaioBufferedReader;
import javaioBufferedWriter;
import javaioIOException;
import javaioInputStreamReader;
import javaioOutputStreamWriter;
import javanetSocket;
import javanetUnknownHostException;
import javaxswingJButton;
import javaxswingJFrame;
import javaxswingJPanel;
import javaxswingJScrollPane;
import javaxswingJTextArea;
import javaxswingJTextField;
/ 客户端双工 /
public class MyClient2 implements ActionListener{
private JFrame frame;
/ 边界布局的主面板 /
private JPanel panelMain;
private JPanel panelDown;
private JTextArea ta;
private JTextField txt;
private JButton but;
private JScrollPane jsp;
private Font font;
/
服务器IP
/
private String ip = "19216810239";
/
服务器端口
/
private int port = 6666;
private BufferedReader br;
private BufferedWriter bw;
public MyClient2() {
frame = new JFrame("双工客户端2");
panelMain = new JPanel(new BorderLayout());
panelDown = new JPanel();
ta = new JTextArea();
txt = new JTextField(20);
but = new JButton("发送");
jsp = new JScrollPane(ta);
// 粘贴界面
panelDownadd(txt);
panelDownadd(but);
panelMainadd(jsp, BorderLayoutCENTER);
panelMainadd(panelDown, BorderLayoutSOUTH);
// 字体
font = new Font("宋体", FontBOLD, 18);
txtsetFont(font);
tasetFont(font);
butsetFont(font);
// 文本域只读
tasetEditable(false);
//按钮添加监听
butaddActionListener(this);
frameadd(panelMain);
framesetBounds(900, 200, 400, 400);
framesetDefaultCloseOperation(JFrameEXIT_ON_CLOSE);// 关闭窗体时结束程序
framesetAlwaysOnTop(true);// 永远在所有窗体最上
framesetVisible(true);
// 光标给消息文本框
txtrequestFocus();
linkServer();
}
/ 显示文本到文本域,并且追加一个换行
@param msg 要显示的文本
/
public void showTxt(String msg) {
taappend(msg+"\n");
}
public static void main(String[] args) {
new MyClient2();
}
//动作监听
public void actionPerformed(ActionEvent e) {
if (egetSource() == but) {// 发送
if (bw == null) {
showTxt("当前没有客户端连接,无法发送消息");
return;
}
String s = txtgetText()trim();// 得到文本框要发送的文字,去掉两端空格
if (slength() == 0) {
showTxt("不可以发送空消息");
return;
}
showTxt("我说:" + s);
try {
bwwrite(s + "\n");// 发送网络消息给对方
bwflush();// 清空缓冲
} catch (IOException e1) {
showTxt("信息:" + s + " 发送失败");
}
// 清空文本框,得到焦点
txtsetText("");
txtrequestFocus();
}
}
/
连接服务器
/
public void linkServer(){
showTxt("准备连接服务器"+ip+":"+port);
try {
Socket jiaoYi = new Socket(ip,port);
showTxt("连接服务器成功,开始进行通讯");
// 得到输入和输出
br = new BufferedReader(new InputStreamReader(
jiaoYigetInputStream()));
bw = new BufferedWriter(new OutputStreamWriter(
jiaoYigetOutputStream()));
String s = null;
while ((s = brreadLine()) != null) {
showTxt(s);
}
} catch (UnknownHostException e) {
showTxt("连接服务器失败,网络连通错误");
} catch (IOException e) {
showTxt("与服务器通讯失败,已经断开连接");
}
showTxt("关闭");
}
}
package service_client_for_many;
import javaioBufferedReader;
import javaioBufferedWriter;
import javaioIOException;
import javaioInputStreamReader;
import javaioOutputStreamWriter;
import javanetSocket;
import javautilVector;
/
服务员,线程类
在客户端连接后创建启动
负责当前客户端的所有数据收发
并且在业务需要时,将结果与服务器(老板)进行报告
/
public class Waiter extends Thread{
private Socket sc;
private Vector<Waiter> dengJiBiao ;
private MutilServer server;
/
客户端IP
/
private String ip;
private BufferedReader br;
private BufferedWriter bw;
/ 创建一个的新的服务员,负责当前传递的客户端连接(交易)
启动新线程
@param sc 负责的交易
@param dengJiBiao所有正在工作的服务员(所有交易)
@param server 老板,也就是服务器
/
public Waiter(Socket sc, Vector<Waiter> dengJiBiao,
MutilServer server) {
thissc = sc;
thisdengJiBiao = dengJiBiao;
thisserver = server;
//初始化连接的准备工作
ip = scgetInetAddress()getHostAddress();
// 得到输入和输出
try {
br = new BufferedReader(new InputStreamReader(
scgetInputStream()));
bw = new BufferedWriter(new OutputStreamWriter(
scgetOutputStream()));
} catch (IOException e) {
thisservershowTxt("与客户端:"+ip+"建立通讯失败");
eprintStackTrace();
return;//无效客户,不再继续
}
thisservershowTxt("客户端:"+ip+"连接服务器成功");
//启动线程
thisstart();
}
//线程
public void run(){
//开始时,登记开工
dengJiBiaoaddElement(this);
Systemoutprintln(thisgetClass()getName());
try {
String s = null;
while ((s = brreadLine()) != null) {
servershowTxt("客户"+ip+"说:" + s);
//当前客户发来的信息,其它客户也要能看得见需要实现转发
//从登记表找到所有正在干活的服务员
for (int i = 0; i < dengJiBiaosize(); i++) {
Waiter w = dengJiBiaoget(i);
//排除掉当前服务员自己
if(w!=this)
wsend("客户"+ip+"说:" + s);
}
}
} catch (Exception e) {
servershowTxt("客户"+ip+"已经离开");
}
//结束时,登记下班
dengJiBiaoremoveElement(this);
}
/ 发送信息给当前服务员负责的客户端
@param msg
/
public void send(String msg){
try {
bwwrite(msg+"\n");
bwflush();
} catch (Exception e) {
servershowTxt("给客户:"+ip+"发送信息"+msg+"失败");
}
}
}
一个服务器类·两个客户端类,一个线程类负责收发

Java群聊功能可以通过网络编程实现,一般使用Socket和ServerSocket类来完成。具体实现步骤如下:
1 创建一个服务器端程序,使用ServerSocket类创建一个ServerSocket对象,并指定监听的端口号。
2 创建一个客户端程序,使用Socket类创建一个Socket对象,并指定连接的服务器IP地址和端口号。
3 服务器端接收客户端连接后,使用accept()方法获取到与该客户端通信的Socket对象。
4 服务器端开启一个新的线程,使用该线程与客户端进行通信,并且将该线程添加到一个线程集合中。
5 客户端向服务器端发送消息时,使用Socket对象的OutputStream将消息发送给服务器端。
6 服务器端从线程集合中获取每个线程,遍历并向每个客户端发送消息,使用Socket对象的OutputStream将消息发送给客户端。
7 客户端使用Socket对象的InputStream读取服务器端发送的消息。
8 当客户端或服务器端任意一方关闭连接时,另一方也需要关闭连接。
以上是简要的Java群聊实现步骤,当然还有其他细节需要考虑,比如消息的格式、多线程同步等问题,但总体上这些步骤可以帮助你实现Java群聊功能。

服务稳定的推送服务,前段时间研究了一下goeasy,后台推送只需要两行代码, js前端推送也只需要3,4行,而且文档齐全,还提供了后台查询信息收发情况,所以我觉得GoEasy推送服务是个不错的选择。

引入goeasyjs

2 客户端订阅,

Var goeasy = new GoEasy({appkey:’your appkey’});

goeasysubscribe(channel:”your channel”, onMessage:function(message)

{alert(‘received message’+ messagecontent)})

3 三种推送方式

Javascript: goeasypublish({channel:’your channel’, message:’your publish msg’});

Java SDK: GoEasy goeasy = new GoEasy(“appkey”); goeasypublish(“your channel”,”your msg”);

RestAPI: >

三步轻松实现web推送及接收

实现java聊天室的方法其实很简单,你可以直接用第三方IM SDK来进行开发,像即构科技的IM SDK就不错,即构的IM产品不仅支持基础的单聊/群聊功能,还支持消息高并发量的房间聊天,单房间人数支持到百万以上。总的来说可以为开发者提供全平台互动、海量并发、超低延时、消息必达的通信服务,助力打造大型直播、语聊房、客服系统等场景。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13378142.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-24
下一篇 2023-07-24

发表评论

登录后才能评论

评论列表(0条)

保存