社区
非技术区
帖子详情
第一个项目,被卡住了.(JAVA聊天程序如何显示上线用户和实现私聊?)
xjl2306
2005-04-26 10:21:19
这是我做的第一个项目,被如何显示上线用户和实现私聊卡住,希望在此得到帮助...
项目:聊天室程序
使用技术:Socket、Thread、IO流、集合类(Set、List、Map)、Swing 注(不使用数据库)
...全文
864
34
打赏
收藏
第一个项目,被卡住了.(JAVA聊天程序如何显示上线用户和实现私聊?)
这是我做的第一个项目,被如何显示上线用户和实现私聊卡住,希望在此得到帮助... 项目:聊天室程序 使用技术:Socket、Thread、IO流、集合类(Set、List、Map)、Swing 注(不使用数据库)
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
34 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
elite19890707
2010-05-29
打赏
举报
回复
代码调试有错误。。不知道怎么该
SnowingXimen
2005-05-13
打赏
举报
回复
这里有人写的JICQ,挺好的,你去看看吧
http://www.csdn.net/cnshare/soft/20/20517.shtm
drugon
2005-05-09
打赏
举报
回复
主要是你人为的控制,你在头脑里面控制好了,做起来就很容易的了。
pengpong
2005-05-09
打赏
举报
回复
好贴
hongyan2004
2005-05-06
打赏
举报
回复
up
acc1982
2005-05-06
打赏
举报
回复
支持xjl2306(JAVA2 新人类) !
接分!!!
ado_jerry
2005-05-06
打赏
举报
回复
UP,学习一下!
liuquanyi
2005-05-06
打赏
举报
回复
学习!
nlstone
2005-05-06
打赏
举报
回复
sorry,原来你的是聊天室程序,不是QQ类的聊天:(
那就更简单了,把我上面的方法稍加变通即可
nlstone
2005-05-06
打赏
举报
回复
没有看你的代码,java我还不太熟,好在你所说的与语言问题无关
你的问题应该是很简单的一类:
1 私聊
2 在线用户
私聊的解决方案很多,在消息中随便加一点标志就可以区分出来
在线用户也很容易解决,随便举个例子,用户自上线连接后,服务器通知该用户的已上线"好友"该用户已上线,且上线用户定时发一个固定消息到服务器,服务器若在指定时间内未收到某个已上线用户的消息,则认定该用户已下线,且通知该用户的好友此人已下线
MARS.nEIL
2005-05-06
打赏
举报
回复
学习.帮顶.
xjl2306
2005-05-05
打赏
举报
回复
那显示在线用户呢?下线又如何处理?
ifsohx
2005-05-04
打赏
举报
回复
不喜欢太多的线程..在公聊和私聊前面加上一些标识(如&,#,...),服务器就可以判断出来你想要公还是私,然后返回给客户端.
xjl2306
2005-05-04
打赏
举报
回复
public void setLMsg() //给信息框赋消息方法
{
String str=null;
try{
str=br.readLine(); //接收服务器消息
jTextArea1.append(str+"\n");
//str=br.readLine();
//jTextArea4.append("\n"+str+"\n");
}
catch(IOException ee){}
}
public void run()
{
while(true)
{
setLMsg(); //接收服务器消息
}
}
public void get()
{
String msg=jTextArea3.getText();
if(msg.equals(""))
{
JOptionPane.showMessageDialog(null,"不能发送空消息!");
jTextArea3.requestFocus();
}
else
{
jTextArea2.append("你对所有人说: "+msg+"\n");
//发送消息至服务器
pw.println("("+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+") "+jTextField1.getText()+"对所有人说:"+" "+msg);
jTextArea3.setText("");
jTextArea3.requestFocus();
}
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==jButton1)
{
get();
}
if(e.getSource()==jButton2)
{
pw.println("quit");
try{
pw.close();
br.close();
s.close();
}
catch(IOException ee){}
System.exit(0);
}
}
xjl2306
2005-05-04
打赏
举报
回复
//初始化聊天室
private void jbInit() throws Exception {
getContentPane().setLayout(borderLayout1);
jPanel1.setAlignmentY((float) 1.0);
jPanel1.setOpaque(true);
jPanel1.setPreferredSize(new Dimension(120, 100));
jPanel1.setLayout(borderLayout2);
jPanel2.setBackground(Color.lightGray);
jPanel2.setAlignmentY((float) 1.0);
jPanel2.setOpaque(true);
jPanel2.setPreferredSize(new Dimension(135, 100));
jPanel2.setLayout(borderLayout7);
jPanel3.setBackground(SystemColor.activeCaptionBorder);
jPanel3.setAlignmentY((float) 1.0);
jPanel3.setPreferredSize(new Dimension(200, 200));
jPanel3.setLayout(borderLayout3);
jTextPane1.setBackground(SystemColor.inactiveCaption);
jTextPane1.setFont(new java.awt.Font("新宋体", Font.PLAIN, 14));
jTextPane1.setForeground(SystemColor.info);
jTextPane1.setBorder(BorderFactory.createRaisedBevelBorder());
jTextPane1.setEditable(false);
jTextPane1.setText("主聊天频道");
jPanel5.setBackground(UIManager.getColor("CheckBox.background"));
jPanel5.setPreferredSize(new Dimension(130, 130));
jPanel5.setLayout(borderLayout5);
jTextPane2.setBackground(SystemColor.inactiveCaption);
jTextPane2.setFont(new java.awt.Font("新宋体", Font.PLAIN, 14));
jTextPane2.setForeground(SystemColor.inactiveCaptionText);
jTextPane2.setBorder(BorderFactory.createRaisedBevelBorder());
jTextPane2.setEditable(false);
jTextPane2.setText("我的聊频道");
jPanel7.setLayout(borderLayout6);
jPanel8.setBorder(titledBorder10);
jPanel8.setPreferredSize(new Dimension(35, 35));
jPanel8.setLayout(null);
jRadioButton1.setFont(new java.awt.Font("新宋体", Font.PLAIN, 14));
jRadioButton1.setBorder(titledBorder7);
jRadioButton1.setNextFocusableComponent(jRadioButton2);
jRadioButton1.setSelected(true);
jRadioButton1.setText("公聊");
jRadioButton1.setBounds(new Rectangle(3, 5, 91, 25));
jRadioButton2.setFont(new java.awt.Font("新宋体", Font.PLAIN, 14));
jRadioButton2.setBorder(titledBorder6);
jRadioButton2.setNextFocusableComponent(jComboBox1);
jRadioButton2.setText("私聊");
jRadioButton2.setBounds(new Rectangle(98, 4, 91, 25));
jComboBox1.setFont(new java.awt.Font("新宋体", Font.PLAIN, 13));
jComboBox1.setBorder(BorderFactory.createLoweredBevelBorder());
jComboBox1.setBounds(new Rectangle(194, 7, 95, 21));
jButton1.setBounds(new Rectangle(32, 33, 73, 30));
jButton1.setFont(new java.awt.Font("新宋体", Font.PLAIN, 14));
jButton1.setBorder(BorderFactory.createRaisedBevelBorder());
jButton1.setNextFocusableComponent(jButton2);
jButton1.setText("发送");
jButton2.setBounds(new Rectangle(33, 66, 72, 30));
jButton2.setFont(new java.awt.Font("新宋体", Font.PLAIN, 14));
jButton2.setBorder(BorderFactory.createRaisedBevelBorder());
jButton2.setNextFocusableComponent(jRadioButton1);
jButton2.setText("关闭");
jPanel4.setLayout(null);
jEditorPane1.setBackground(SystemColor.inactiveCaptionBorder);
jEditorPane1.setFont(new java.awt.Font("新宋体", Font.BOLD, 14));
jEditorPane1.setForeground(Color.red);
jEditorPane1.setBorder(BorderFactory.createRaisedBevelBorder());
jEditorPane1.setEditable(false);
jEditorPane1.setText("上线用户");
jPanel9.setLayout(borderLayout8);
jPanel10.setPreferredSize(new Dimension(130, 130));
jPanel10.setLayout(borderLayout9);
jTextPane4.setBackground(SystemColor.inactiveCaptionBorder);
jTextPane4.setFont(new java.awt.Font("新宋体", Font.BOLD, 14));
jTextPane4.setForeground(Color.red);
jTextPane4.setBorder(BorderFactory.createRaisedBevelBorder());
jTextPane4.setEditable(false);
jTextPane4.setText("系统公告");
borderLayout3.setHgap(0);
borderLayout3.setVgap(0);
borderLayout7.setHgap(0);
borderLayout2.setHgap(1);
borderLayout9.setVgap(0);
borderLayout6.setHgap(1);
borderLayout6.setVgap(1);
borderLayout1.setHgap(1);
borderLayout1.setVgap(0);
borderLayout8.setVgap(0);
this.getContentPane().setBackground(SystemColor.control);
jPanel9.setBackground(SystemColor.desktop);
jList1.setBackground(SystemColor.controlHighlight);
jList1.setFont(new java.awt.Font("新宋体", Font.BOLD, 14));
jList1.setForeground(Color.pink);
jList1.setBorder(BorderFactory.createLoweredBevelBorder());
jPanel4.setBorder(null);
jTextArea3.setFont(new java.awt.Font("新宋体", Font.PLAIN, 14));
jTextArea3.setAlignmentX((float) 1.0);
jTextArea3.setAlignmentY((float) 1.0);
jTextArea3.setBorder(BorderFactory.createLoweredBevelBorder());
jTextArea2.setBackground(SystemColor.inactiveCaptionText);
jTextArea2.setFont(new java.awt.Font("新宋体", Font.PLAIN, 14));
jTextArea2.setBorder(BorderFactory.createLoweredBevelBorder());
jTextArea2.setEditable(false);
jTextArea1.setBackground(SystemColor.control);
jTextArea1.setFont(new java.awt.Font("新宋体", Font.PLAIN, 14));
jTextArea1.setBorder(BorderFactory.createLoweredBevelBorder());
jTextArea1.setEditable(false);
jTextArea4.setBackground(SystemColor.inactiveCaptionText);
jTextArea4.setFont(new java.awt.Font("新宋体", Font.PLAIN, 14));
jTextArea4.setForeground(Color.darkGray);
jTextArea4.setBorder(BorderFactory.createLoweredBevelBorder());
jTextArea4.setText("欢迎来到JAVA聊天室");
jTextArea4.setEditable(false);
this.getContentPane().add(jPanel3, java.awt.BorderLayout.CENTER);
jPanel3.add(jTextPane1, java.awt.BorderLayout.NORTH);
jPanel3.add(jPanel5, java.awt.BorderLayout.SOUTH);
this.getContentPane().add(jPanel2, java.awt.BorderLayout.EAST);
this.getContentPane().add(jPanel1, java.awt.BorderLayout.SOUTH);
jPanel1.add(jPanel4, java.awt.BorderLayout.EAST);
jPanel4.add(jButton1);
jPanel4.add(jButton2);
jPanel1.add(jPanel7, java.awt.BorderLayout.CENTER);
jPanel8.add(jRadioButton1);
jPanel8.add(jRadioButton2);
jPanel8.add(jComboBox1);
jPanel7.add(jScrollPane4, java.awt.BorderLayout.CENTER);
jScrollPane4.getViewport().add(jTextArea3);
jPanel4.setPreferredSize(new Dimension(135, 100));
buttonGroup1.add(jRadioButton1);
jPanel2.add(jEditorPane1, java.awt.BorderLayout.NORTH);
buttonGroup1.add(jRadioButton2);
jPanel9.add(jPanel10, java.awt.BorderLayout.SOUTH);
jPanel10.add(jTextPane4, java.awt.BorderLayout.NORTH);
jPanel10.add(jScrollPane5, java.awt.BorderLayout.CENTER);
jScrollPane5.getViewport().add(jTextArea4);
jPanel9.add(jList1, java.awt.BorderLayout.CENTER);
jPanel2.add(jPanel9, java.awt.BorderLayout.CENTER);
jPanel5.add(jTextPane2, java.awt.BorderLayout.NORTH);
jPanel5.add(jScrollPane1, java.awt.BorderLayout.CENTER);
jPanel3.add(jScrollPane2, java.awt.BorderLayout.CENTER);
jScrollPane2.getViewport().add(jTextArea1);
jScrollPane1.getViewport().add(jTextArea2);
jPanel7.add(jScrollPane3, java.awt.BorderLayout.EAST);
jPanel7.add(jPanel8, java.awt.BorderLayout.NORTH);
jButton1.addActionListener(this);
jButton2.addActionListener(this);
wyon
2005-05-04
打赏
举报
回复
最简单的办法是在聊天信息前加些标识,由服务器检查你发来的信息以什么开头,判断你是想公聊还是私聊
就跟ifsohx说的差不多
zhaoce
2005-05-02
打赏
举报
回复
这我在大学里做过
太麻烦了
慢慢做
oldmoon
2005-05-02
打赏
举报
回复
等下,老师看了肯定发晕!
oldmoon
2005-05-02
打赏
举报
回复
哥们,你是哪个,在这发?课不是讲完了么?
xjl2306
2005-04-28
打赏
举报
回复
谁有关于显示在线用户的代码,发来看看好吗?
加载更多回复(14)
Java
聊天
室
项目
实战:基于Socket与多线程的完整
实现
网络编程是
Java
开发者进阶的必经之路,而基于Socket的实时通信是最直观的实践场景。多线程并发处理与线程安全(如ConcurrentHashMap)是保障服务端稳定性的核心,Swing事件分发线程则决定了客户端界面更新的正确性。通过设计统一JSON消息协议,可优雅
实现
群聊广播、
私聊
路由与在线
用户
列表同步,并解决中文乱码、断线感知等经典工程问题。本文从TCP底层通信出发,逐步拆解服务端
用户
管理、消息路由和客户端异步UI刷新,完整呈现一个
Java
聊天
室的开发全过程,帮助开发者将零散的IO、集合、多线程知识串
基于
Java
的
聊天
室
程序
API开发与实战
简介:【
Java
聊天
室
程序
API】是一个采用
Java
语言开发的交互式在线
聊天
系统,支持多
用户
实时通信、私密对话、个性化内容展示及
用户
注册登录功能。系统利用
Java
Socket
实现
客户端与服务器间的实时消息传输,结合多线程技术处理并发连接,确保消息广播与
私聊
的准确投递。通过JDBC进行数据库操作,
实现
用户
信息存储与头像上传管理,并引入安全机制保障账号认证安全。本
项目
涵盖网络编程、多线程、数据库集成和前端交互等核心技术,适合作为
Java
Web开发学习与实战参考。
Java
UDP多人
聊天
室实战:从TCP对比到中继架构
实现
UDP与TCP是网络编程中两种基础传输协议,TCP面向连接、可靠有序,UDP则无连接、低延迟,通过数据报独立传输。在高实时性、低数据量的场景下,UDP避免了TCP因网络抖动产生的排队阻塞,使消息能即时到达。
Java
开发中,借助DatagramSocket与DatagramPacket可以快速构建基于UDP的通信系统。通过一个由服务端中继转发、多客户端收发消息的简易
聊天
室案例,展示了从协议设计、登录心跳到超时清理的完整落地过程,并对比了TCP与UDP在实际
聊天
体验中的差异,体现了UDP在局域网多人群聊中的应用
Java
聊天
室
项目
实战:Socket+多线程
实现
多人即时通信系统
网络编程是
Java
开发者进阶的必修课,而Socket通信则是理解网络应用的基础。在多客户端场景下,如何高效处理并发连接,往往需要结合多线程技术——每个连接分配一个独立线程,配合阻塞IO(BIO)模型,能够以最简单的逻辑
实现
消息的实时转发。通过构建一个基于CS架构的多人
聊天
室,可以系统性地串联集合、IO、线程安全等核心知识:使用ConcurrentHashMap管理在线
用户
,通过自定义消息协议区分群聊与
私聊
,利用Swing构建客户端界面。这类
项目
不仅覆盖了
Java
基础语法的综合运用,也为后续学习NIO、Net
Java
Web实战:基于WebSocket的一对一实时
聊天
系统设计与
实现
HTTP协议采用请求-响应模式,服务器无法主动推送数据,实时
聊天
场景因此面临挑战。WebSocket全双工通信通过一次握手建立长连接,
实现
了客户端与服务器双向实时数据交互,解决了传统Ajax轮询的延迟和资源浪费问题。在
Java
Web技术栈中,结合Servlet处理登录会话、MySQL持久化
聊天
记录,可以构建完整的实时通信系统。本文从工程实践角度,详细讲解了一个基于WebSocket的一对一
聊天
系统的设计与
实现
,覆盖数据库设计、服务端端点开发、前端交互及常见问题排查,适合正在做课程设计或毕业设计的开发者参考。
非技术区
23,404
社区成员
70,506
社区内容
发帖
与我相关
我的任务
非技术区
Java 非技术区
复制链接
扫一扫
分享
社区描述
Java 非技术区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章