Java聊天室程序设计报告.docx

上传人:b****6 文档编号:4059876 上传时间:2022-11-27 格式:DOCX 页数:15 大小:109.33KB
下载 相关 举报
Java聊天室程序设计报告.docx_第1页
第1页 / 共15页
Java聊天室程序设计报告.docx_第2页
第2页 / 共15页
Java聊天室程序设计报告.docx_第3页
第3页 / 共15页
Java聊天室程序设计报告.docx_第4页
第4页 / 共15页
Java聊天室程序设计报告.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

Java聊天室程序设计报告.docx

《Java聊天室程序设计报告.docx》由会员分享,可在线阅读,更多相关《Java聊天室程序设计报告.docx(15页珍藏版)》请在冰豆网上搜索。

Java聊天室程序设计报告.docx

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;i

if(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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 初中教育 > 政史地

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1