Java聊天室程序设计报告.docx
《Java聊天室程序设计报告.docx》由会员分享,可在线阅读,更多相关《Java聊天室程序设计报告.docx(15页珍藏版)》请在冰豆网上搜索。
![Java聊天室程序设计报告.docx](https://file1.bdocx.com/fileroot1/2022-11/27/244ef841-688d-4c19-b335-86f50710462e/244ef841-688d-4c19-b335-86f50710462e1.gif)
Java聊天室程序设计报告
《Java之聊天室制作》总结报告
姓名__赵其国___________________
学号__2_____________
班级__嵌入式一班_______________
二〇一二年十二月二十日
一,设计目的
为了更好的巩固输入输出流,窗体设计,多线程运用,网络通信设计方面的知识。
把所学的课程及相关知识加以融会贯通。
二,设计内容
设计的聊天室能实现用户登录,显示登录用户列表,以及发送聊天信息和显示聊天信息的功能。
并可以选择接收信息的用户进行单发或群发的功能,运行程序,登录服务器后,可以从列表中选择单个或多个用户进行聊天,它是图形界面,线程,流和文件系统等技术的综合使用。
三,概要设计
实现的功能:
1,启动服务器端,接收客户端发来的信息,并在服务器端窗体显示客户端聊天信息,再吧信息返给在线用户,窗体背景色为粉色
2,启动客户端窗体,窗体背景色为粉色
3,用户名编辑框输入用户名,设置字体显红色,单击登录按钮,在显示在线用户列表内显示用户名,同时用户名编辑框不能编辑
4,发送编辑框输入发送内容,单击发送按钮,启动输出流,把信息发送出去,同时把发出的信息追加到聊天内容文本域内,显示用户名,时间和发送内容。
5,单击退出按钮,运用File类和JfileChooser类实现聊天信息的保存
6,聊天信息文本域,在线用户显示域和发送信息的文本域加了滚动条,其中聊天信息文本域,发送信息的文本域的文字能自动换行。
7,别的客户端发来信息是通过输入流读取信息,并截取发来信息的用户名及信息,用户名加到在线用户列表上显示在线,信息追加到聊天内容文本域内,显示用户名,时间和发送内容。
功能不足之处:
1,保存聊天信息保存为text格式的有黑块。
保存为Doc格式的要转码不能直接打开
2,用户在线显示,只能在用户发送信息时别的用户才能得到在线的用户名,然后再加到在线用户列表中,显示用户在线。
3,聊天室只适合群聊,没有实现技能群聊又能和单个人聊天的功能
4,用户输出“退出”后在线用户列表中就会把用户删除,不过没有实现没找到错误出在哪里。
四,演示截图
客户端1用户界面(可在同一个类中打开多个窗体):
客户端2用户界面:
服务器端用户界面:
用doc格式保存的聊天信息(打开时转码为简体中文格式):
五,设计源代码(导入的代码省略):
客户端1代码(客户端2,3..代码同下)
@SuppressWarnings("all")
publicclassClient1extendsJFrame{
privateJLabelusername,input;
privateJButtondenglu,exit,send;
privateJTextAreaname,msg,say;
privateJTextFieldjt1;
privateJSplitPanesplit;
booleanloginFlag=false;
privateSocketsocket;
privateOutputStreamop;
privateJListuser_list;//列表
privateDefaultComboBoxModelmodel;//组件模型
publicClient1(){
super();
setTitle("聊天室");
username=newJLabel("用户名:
");
input=newJLabel("输入聊天内容:
");
denglu=newJButton("登陆");
exit=newJButton("退出");
send=newJButton("发送");
msg=newJTextArea(10,25);
msg.setEnabled(false);//文本条不可编辑
Fontfnt1=newFont("Serief",Font.PLAIN,20);//根据名称、样式和磅值大小设置字体
msg.setFont(fnt1);
msg.setLineWrap(true);//自动换行
jt1=newJTextField(15);
jt1.setForeground(Color.red);
say=newJTextArea(2,15);
say.setLineWrap(true);
name=newJTextArea(10,5);
name.setEnabled(false);
user_list=newJList();
user_list.setModel(newDefaultComboBoxModel(newString[]{""}));
model=(DefaultComboBoxModel)user_list.getModel();//获得列表框的模型
}
publicvoidclientThread(){
try{
socket=newSocket("localhost",8866);//创建接口
op=socket.getOutputStream();//创建输出流
newClientThread(msg,socket,model,jt1).start();//启动线程
}catch(UnknownHostExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
//发送事件
publicvoidsend(){
Filef=newFile("d:
\\聊天记录.doc");//聊天信息保存位置
if(!
loginFlag){//先登录
JOptionPane.showMessageDialog(null,"请先登录。
");
return;
}
StringsendUserName=jt1.getText();
Stringinfo=say.getText();
if(info.equals("")){//信息为空就提示
JOptionPane.showMessageDialog(null,"请输入发送信息!
!
");
return;
}
try{
Stringusername=jt1.getText()+"说:
";//初始化传递发送信息的标记
op.write((username+info).getBytes());//创建输出流
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
DateFormatdf=DateFormat.getDateInstance();//获得DateFormat实例
StringdateString=df.format(newDate());//格式化日期
df=DateFormat.getTimeInstance(DateFormat.MEDIUM);
StringtimeString=df.format(newDate());//格式化时间
msg.append(""+sendUserName+""+dateString+""+timeString
+"\n"+""+info+"\n");//追加发送的信息
try{
FileWriterfw=newFileWriter(f,true);//文件输出流
fw.write(msg.getText().toString());//向文件内写入信息
fw.close();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
say.setText("");
}
publicvoidinit(){
setLayout(newBorderLayout());//窗体布局
JPanelup=newJPanel();
up.setBackground(Color.PINK);//背景色
up.add(username);
up.add(jt1);
up.add(denglu);
up.add(exit);
//添加滚动条
JScrollPanescr=newJScrollPane(say);
JScrollPanejs1=newJScrollPane(user_list);
JScrollPanejs=newJScrollPane(msg);
//JSplitPane用于分隔两个(只能两个)Component
split=newJSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,js1,js);
split.setDividerLocation(100);//分割位置
JPaneldown=newJPanel();
down.setBackground(Color.PINK);//设置背景色
down.add(input);
down.add(scr);
down.add(send);
add(up,BorderLayout.NORTH);
add(split,BorderLayout.CENTER);
add(down,BorderLayout.SOUTH);
denglu.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEvente){
//TODOAuto-generatedmethodstub
if(loginFlag){//已登录标记为true
JOptionPane.showMessageDialog(null,"在同一窗口只能登录一次。
");
return;
}
jt1.setEnabled(false);
loginFlag=true;
model.addElement(jt1.getText());
}
});
send.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEvente){
//TODOAuto-generatedmethodstub
send();
}
});
exit.addActionListener(newActionListener(){
publicvoidactionPerformed(finalActionEvente){
JFileChooserchooser=newJFileChooser();//创建文件选择器
FileNameExtensionFilterfilter=newFileNameExtensionFilter(
"jpg","gif","txt","mdl","doc");//设置文件格式
chooser.setFileFilter(filter);//设置当前文件过滤器
intreturnVal=chooser.showSaveDialog(null);
if(returnVal==JFileChooser.APPROVE_OPTION){
System.out.println("YouchosetoSavethisfile:
"
+chooser.getSelectedFile().getName());
}
try{
op.close();
socket.close();
}catch(IOExceptione1){
//TODOAuto-generatedcatchblock
e1.printStackTrace();
}
System.exit(0);
}
});
}
publicvoidshowMe(){
init();
//pack();
setSize(500,500);//窗体大小
setResizable(false);//不可改变大小
setLocation(200,200);//位置
setVisible(true);//显示
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//
}
publicstaticvoidmain(String[]args){
Client1l=newClient1();
l.showMe();
l.clientThread();
}
}
客户端线程部分ClientThread类:
@SuppressWarnings("all")
publicclassClientThreadextendsThread{
privateJTextAreamsg;
privateSocketsocket;
DefaultComboBoxModelmodel;
privateJTextFieldjt1;
publicClientThread(JTextAreamsg,Socketsocket,DefaultComboBoxModelmodel,JTextFieldjt1){
this.msg=msg;
this.socket=socket;
this.model=model;
this.jt1=jt1;
}
@Override
publicvoidrun(){
while(true){
try{
InputStreamis=socket.getInputStream();//创建输入流
byte[]b=newbyte[1024];
intn=is.read(b);//获得字节数
Strings=newString(b,0,n);//接收到的信息
Stringusername=jt1.getText()+"说:
";
if(!
s.startsWith(username)){//只接受别人发来的信息
Stringsendname=s.substring(0,s.indexOf("说:
"));//获得用户名
Stringreceive=s.substring(s.indexOf("说:
")+2);//获得信息
if(s.startsWith("sendname说:
退出")){//是否退出
model.removeElement(sendname);//从用户列表中移除用户
}else{
booleanitemFlag=false;//标记是否为列表框添加列表项,为true不添加,为false添加
for(inti=0;iif(sendname.equals((String)model.getElementAt(i))){//如果用户列表中存在该用户名
itemFlag=true;//设置为true,表示不添加到用户列表
break;
}
}
if(!
itemFlag){
model.addElement(sendname);//将登录用户添加到用户列表
}
}
DateFormatdf=DateFormat.getDateInstance();//获得DateFormat
StringdateString=df.format(newDate());//格式化日期
df=DateFormat.getTimeInstance(DateFormat.MEDIUM);
StringtimeString=df.format(newDate());//格式化时间
msg.append(""+sendname+""+dateString+""+timeString+"\n"+""+receive+"\n");//追加信息
}
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
}
服务器端ServerAreaText类:
@SuppressWarnings("all")
publicclassServerAreaTextextendsJFrame{
privateJTextAreajta;
privateJScrollPanejsp;
privateSocketsocket;
privatestaticArrayListal=newArrayList();//套接字列表
publicServerAreaText(){
jta=newJTextArea(20,40);
jta.setEditable(false);
jta.setLineWrap(true);
jsp=newJScrollPane(jta);
}
//getset方法,属于类变量
publicstaticArrayListgetAl(){
returnal;
}
publicstaticvoidsetAl(ArrayListal){
ServerAreaText.al=al;
}
publicvoidinit(){
setTitle("聊天室服务器端");
this.add(jsp);
}
publicvoidEventHandle(){
try{
ServerSocketserver=newServerSocket(8866);//创建接口
while(true){
jta.append("等待用户连接…"+"\n");
socket=server.accept();//连接
al.add(socket);
jta.append(socket.getPort()+"已连接"+"\n");
newServerThread1(jta,socket).start();//启动线程
}
}catch(Exceptione){
e.printStackTrace();
}
}
publicvoidshowMe(){
init();
pack();
setResizable(false);
this.setLocation(150,150);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
EventHandle();
}
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
newServerAreaText().showMe();
}
}
服务器端线程部分ServerThread1类:
@SuppressWarnings("all")
publicclassServerThread1extendsThread{
privateJTextAreajta2;
privateJTextFieldjtf_name;
privateArrayListalt=ServerAreaText.getAl();
privateSocketsocket;
publicServerThread1(JTextAreajta2,Socketsocket){
super();
this.jta2=jta2;
this.socket=socket;
}
@Override
publicvoidrun(){
InputStreamis=null;
OutputStreamos=null;
try{
while(true){
is=socket.getInputStream();//创建输入流
byte[]b=newbyte[1024];
intn=is.read(b);//获得信息字节数
Strings=newString(b,0,n);//读取的信息
jta2.append(socket.getPort()+"客户端:
"+s+"\n");
for(Sockettmp:
alt){//遍历列表
os=tmp.getOutputStream();//创建输出流
os.write(s.getBytes());//输出信息
}
}
}catch(IOExceptione){
//TODOAu