JiveJdon Community Forums
在线139人   首页   主题总表   培训咨询   精华   查搜   注册    登陆
首页 » 论坛 » J2EE/JavaEE/JEE/EJB/JSF等技术讨论
???en_US.forumThreadPrev.name??? 上一主题
  Go back to the topic 返回本主题   Go back to the topic listing返回主题列表
???en_US.forumThreadNext.name??? 下一主题
Go 总共有 10 回复 / 1
 发表新帖子   回复该主题贴
pet

悄悄话
发表文章: 11
注册时间: 2008年04月16日 21:49
有谁愿意帮我检查一下我的聊天室哪里错了?? 2008年04月17日 14:19 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
标签列表
上个月写了一个简单的聊天室,但功能不全,只能用客户端对客户端的形式进行对话,在服务器中不能发信息,但当进行客户之间谈话时,就偶尔出现了收不到信息的错误,我花了很多时间也找不到错误的所在.........如果大家愿意的话,请帮我看看究竟是怎么回事,谢谢了!
pet

悄悄话
发表文章: 11
注册时间: 2008年04月16日 21:49
回复:有谁愿意帮我检查一下我的聊天室哪里错了?? 2008年04月17日 14:20 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
//服务器端程序:
//11开头表示新加入了聊天用户;22开头表示公聊;33开头表示私聊

import java.io.*;
import javax.swing.*;
import java.awt.*;
import javax.swing.border.TitledBorder;
import java.awt.event.*;
import java.net.*;
import java.util.*;

public class Server1 extends JFrame
{
JTextArea JT2; // "聊天记录"那个文本域
JTextArea JT3; // "发送信息"那个文本域
JButton B1; // "发送"按钮
JButton B2; // "删除"按钮
final JCheckBox JC; //"发送给所有用户"复选框
TitledBorder TB1; //"参与者"边框
TitledBorder TB2; //"聊天记录"边框
TitledBorder TB3; //"发送信息"边框
Socket s; //客户端套接字
BufferedReader BR;
PrintWriter PW;
boolean bool=false;
boolean flag=true;
//String line=System.getProperty("line.separator"); //起到换行作用
HashMap map=new HashMap(); //用来储存socket和用户名
JList userList=new JList(); //用来显示参与者
DefaultListModel ListModel=new DefaultListModel();
Vector ve=new Vector(); //用来储存用户名

public Server1(String str)
{
super(str);
this.getContentPane().setLayout(null); //设置主窗口的布局管理器为空
//创建组件
JT2=new JTextArea(60,30);
JT2.setCaretPosition(JT2.getText().length());
JT3=new JTextArea(60,30);
B1=new JButton("发送");
B2=new JButton("删除");
JC=new JCheckBox("发送给所有用户");
TB1=BorderFactory.createTitledBorder("参与者");
TB2=BorderFactory.createTitledBorder("聊天记录");
TB3=BorderFactory.createTitledBorder("发送信息");

//创建面板
JPanel JP1=new JPanel();
JPanel JP2=new JPanel();
JPanel JP3=new JPanel();
JPanel JP4=new JPanel();
JPanel JP5=new JPanel();
pet

悄悄话
发表文章: 11
注册时间: 2008年04月16日 21:49
回复:有谁愿意帮我检查一下我的聊天室哪里错了?? 2008年04月17日 14:21 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
//布置JP1面板
JP1.setLayout(new GridLayout(1,1));
userList.setModel(ListModel);
JScrollPane JS=new JScrollPane(userList); //创建滚动条
JS.setBorder(TB1); //添加边框
JP1.add(JS);
JP1.setBounds(7,10,150,425); //设置JP1面板的大小和坐标
this.getContentPane().add(JP1); //先用getContentPane()返回主窗口的面板,再在此面板中添加JP1

//布置JP2面板
JP2.add(JC);
JP2.setBounds(30,432,150,50);
this.getContentPane().add(JP2);

//布置JP3面板
JP3.setLayout(new GridLayout(1,1));
JT2.setEditable(false); //设置JT2文本域不可编辑
JScrollPane JSP2=new JScrollPane(JT2);
JSP2.setBorder(TB2);
JP3.add(JSP2);
JP3.setBounds(160,10,380,250);
this.getContentPane().add(JP3);

//布置JP4面板
JP4.setLayout(new GridLayout(1,1));
JScrollPane JSP3=new JScrollPane(JT3);
JSP3.setBorder(TB3);
JP4.add(JSP3);
JP4.setBounds(160,258,380,177);
this.getContentPane().add(JP4);

//布置JP5面板
JLabel j=new JLabel(" "); //此标签只起分隔B1和B2的作用
JP5.add(B1);
JP5.add(j);
JP5.add(B2);
JP5.setBounds(350,430,200,35);
this.getContentPane().add(JP5);
this.pack(); //用来整理组件的空隙
B1.addMouseListener(new action()); //为B1添加监听器,"acion"是一个类,在下面定义了
JC.addActionListener(new ActionListener() //为JC添加监听器
{
public void actionPerformed(ActionEvent e)
{
bool=JC.isSelected(); //用来标志此复选按钮是否被打勾
}
});
}
public void receive() //接收用户信息
{
try
{
ServerSocket ss=new ServerSocket(8000); //定义服务器套接字
while(flag)
{
s=ss.accept(); //接收用户的请求,并创建一个客户端套接字
work w=new work(s); //创建线程 w
w.start(); //启动线程
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
pet

悄悄话
发表文章: 11
注册时间: 2008年04月16日 21:49
回复:有谁愿意帮我检查一下我的聊天室哪里错了?? 2008年04月17日 14:24 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
class action extends MouseAdapter //自定义监听器
{
public void mousePressed(MouseEvent e) //鼠标按下所以触发的事件
{
String str=JT3.getText(); //获取"发送信息"文本域的内容
PW.println(str); //向对应的输出流输出str
JT3.setText(""); //设置"发送信息"文本域为空
}
}
class work extends Thread //线程类
{
Socket s;
public work(Socket s)
{
this.s=s;
}
public void run()
{
try
{
InputStream in=s.getInputStream(); //获取相应的输入流
OutputStream out=s.getOutputStream(); //获取相应的输出流
BR=new BufferedReader(new InputStreamReader(in)); //创建输入流
PW=new PrintWriter(out,true); //创建输出流
String value;

String str=BR.readLine(); //读取从客户段传过来的数据
str=str.trim(); //读取输入流BR的内容
while(str.length()!=0)
{
Iterator it; //定义一个迭代器
int int_1=Integer.parseInt(str.substring(0,2)); //截取str的前两个字符
String str2=str.substring(2); //得到一个以索引2为起点的新字符串
Set keySet_; //用来保存用户名和相应的Socket
int num;
pet

悄悄话
发表文章: 11
注册时间: 2008年04月16日 21:49
回复:有谁愿意帮我检查一下我的聊天室哪里错了?? 2008年04月17日 14:25 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
switch(int_1) //验证str的前两个字符
{
case 11: //str以"11"开头的,表示新来的用户
ListModel.addElement(str2); //在列表中添加新的用户
ve.add(str2); //把用户名添加到Vector数组中
map.put(s,str2); //设置用户名的key和值
num=ve.size(); //返回Vector的元素个数
keySet_=map.keySet(); //返回所有key,即所有的Socket
it=keySet_.iterator(); //返回一个迭代器
while(it.hasNext()) //判断是否具有元素
{
Socket s1=(Socket)it.next(); //取得Socket
value=(String)map.get(s1); //返回对应Socket的值
PW=new PrintWriter(s1.getOutputStream(),true); //创建一个有对应客户端的输出流
PW.println("00aaaa"); //向对应的Socket客户端传输字符串"00aaaa"(作用:用来告诉客户端要清空用户列表)
for(int i=0;i<num;i++)
{
if(value!=ve.get(i)) //用来实现不向自己客户端列表发送自己的名字
{
PW.println("11"+(String)ve.get(i)); //发送以"11"开头的用户名到相应的客户端
}
}
}break;
case 22 : //以"22"开头,表示公聊
keySet_=map.keySet(); //返回所有key,即所有的Socket
it=keySet_.iterator(); //返回一个迭代器
while(it.hasNext()) //判断是否具有元素
{
Socket s1=(Socket)it.next(); //取得Socket
if(s1!=s) //用来实现:不向发信客户端的发送信息
{
PW=new PrintWriter(s1.getOutputStream(),true); //创建一个有对应客户端的输出流
PW.println("22"+map.get(s)+" 对大家说:"+str2); //向相应的客户端发送以"22"开头的信息
}
}break;
pet

悄悄话
发表文章: 11
注册时间: 2008年04月16日 21:49
回复:有谁愿意帮我检查一下我的聊天室哪里错了?? 2008年04月17日 14:26 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
case 33 : //以"33"开头,表示私聊
int index=str2.indexOf("++"); //用来作为名字标记,因为用户名字后面直接跟上"++"
String userName=str2.substring(0,index); //获取str2中包含的用户名
String str3=str2.substring(index+2); //获取纯的聊天信息(次信息不包括任何标记,只是纯谈话信息)
keySet_=map.keySet();
it=keySet_.iterator();
while(it.hasNext())
{
Socket s1=(Socket)it.next();
value=(String)map.get(s1);
if(value.equals(userName)) //当找到相应的要发送的用户时则为真
{
PW=new PrintWriter(s1.getOutputStream(),true);
PW.println("33"+map.get(s)+" 对你说:"+str3);
}
}break;
}
str=BR.readLine();
str=str.trim(); //清楚字符串前后的空白
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
banq

悄悄话
发表文章: 9313
注册时间: 2002年08月03日 17:08
回复:有谁愿意帮我检查一下我的聊天室哪里错了?? 2008年04月17日 14:45 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
你源作者自己都不能找到错误的地方,更别指望别人,这不是水平高低的问题,而是设计的问题。

你没有使用OO编程方式,采取的是过程式编程,所以,很难检查问题,也很难测试。所以,写了出问题查不出来等于白写。

重新架构设计,把你的需求写出来,引入设计模式
pet

悄悄话
发表文章: 11
注册时间: 2008年04月16日 21:49
回复:回复:有谁愿意帮我检查一下我的聊天室哪里错了?? 2008年04月17日 17:02 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
其实上面的代码我还没有发完,不过我也觉得我的程序有很大的问题,但我是自学的,没有人指导,所以对设计模式不是很懂,不过我会去找点资料看看先,谢谢指教!
pet

悄悄话
发表文章: 11
注册时间: 2008年04月16日 21:49
回复:回复:有谁愿意帮我检查一下我的聊天室哪里错了?? 2008年04月17日 17:09 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
请问有没有合适的设计模式的书籍推荐,以免我大海捞针,不知是好,对于Java的认识我还不是很深,我前几天才收索到这个论坛,所以希望能多给我点指导,好让我少走点弯路,谢谢了!
banq

悄悄话
发表文章: 9313
注册时间: 2002年08月03日 17:08
回复:回复:回复:有谁愿意帮我检查一下我的聊天室哪里错了?? 2008年04月18日 09:29 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
见首页链接: 初学者Java学习之路
http://www.jdon.com/jivejdon/thread/30976.html
pet

悄悄话
发表文章: 11
注册时间: 2008年04月16日 21:49
回复:回复:回复:回复:有谁愿意帮我检查一下我的聊天室哪里错了?? 2008年04月18日 20:45 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
好,谢谢了
这个主题有 10 回复 / 1Go
???en_US.forumThreadPrev.name??? 上一主题
  Go back to the topic 返回本主题   Go back to the topic listing返回主题列表    返回页首返回页首
???en_US.forumThreadNext.name??? 下一主题
热点TAG: AOP cache 缓存 DDD EJB 集群 设计模式 Hibernate IOC JiveJdon OO RBAC Seam Spring Struts
正在读取,请等待...
google yahoo 新浪ViVi 365Key网摘 天极网摘 CSDN网摘 添加到百度搜藏 POCO网摘 博采网摘
查询本论坛内 回复超过的热门帖子
     回复该主题贴
标题
 
粗体 斜体 下划线 插入图片 插入代码 插入url链接 插入附件
内容
 

手机阅读 add to google add to yahoo
解惑之道在J道 ,打造中国最具影响力的的企业软件社区
OpenSource JIVEJDON v3.0 Powered by JdonFramework Code © 2002-08 jdon.com
anti spam