网络程序设计考试大作业 聊天室程序_第1页
网络程序设计考试大作业 聊天室程序_第2页
网络程序设计考试大作业 聊天室程序_第3页
网络程序设计考试大作业 聊天室程序_第4页
网络程序设计考试大作业 聊天室程序_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

网络程序设计考试大作业

题目:聊天室程序

班级:

学号:

姓名:

成绩:

网络程序设计考试大作业..................................1

一.所使用的背景知识'主要函数的描述.................3

程序设计思想及程序设计流程框图...................3

三.主要代码及代码运行结果...........................4

1.启动服务器......................................4

2.登录...........................................6

3.注册..........................................10

4.登录和注册判定................................12

5.进入聊天界面..................................13

6.私聊页面......................................17

所使用的背景知识、主要函数的描述

背景:根据现在最流行的聊天工具QQ,模仿一部分主要功能来完成。

主要函数:

publicclassServer;服务器的创建。

publicclassClient;客户端的创建。

publicclassMainextendsJFrame;登录界面的显示。

publicclassRegistextendsJDialog;注册界面的显示。

publicclassUserinformation;用户信息的保存和验证。

publicclassAllTalkFrameextendsJFrame;登录后进入群聊界面。

publicclassPointToPointTalkFrameextendsJFrame;私聊界面。

二.程序设计思想及程序设计流程框图

设计思想:

利用socket与serversocket在客户端与客户端之间的通信,InputStream

InputStreamReader输入输出流进行信息的发送与接收。

程序设计流程:

主页面:输入账号与密码,点击登录或者注册进入下一页面。

登录:判定是否正确,正确则进去聊天界面。

注册:进去注册界面,成功则返回主页面。

进入聊天室:能发送信息让在线的所有人看到。

私聊界面:能与一个人单独聊天,信息只能被双方看到。

主页面

三.主要代码及代码运行结果

1.启动服务器

代码:

publicclassServer{

ServerSocketserver;

staticintclientNum=0;

//存放与服务器连接上的对应的Socket,作用是保存服务器与客户端之间的流,

便于服务器给每个客户端进行回发消息

List<Socket>clientConnection=newArrayList<Socket>();

publicServer(){

try{

server=newServerSocket(9999);

System.out.printin(〃服务器已经启动〃);

}catch(lOExceptione){

e.printStackTrace();

System.out.printin(〃服务器启动失败〃);

}

)

//内部类,监听客户端是否有连接到服务器,并将此客户端的Socket传递给

HandleSocket进行处理,同时将client存放到List中,即clientConnection中

classSocketListenerimplementsRunnable{

publicvoidrun(){

Socketclient;

try{

while(true){

client=server,accept();

//连接上一个就压入List中,即clientconnection中

c1ientConnection.add(client);

HandleSockeths=newHandleSocket(client);

//连接上就让HandleSocket去处理

newThread(hs).start();

}

}catch(lOExceptione){

System.out.printin(〃客户连接服务器失败〃);

)

//内部类处理一个Socket,接收一个Client发送过来的消息,并且服务器原

封不动的返回给所有客户端,客户端对消息进行过滤

classHandleSocketimplementsRunnable{

Socketclient;

HandleSocket(Socketclient){

this.client=client;

}

publicvoidrun(){

try{

clientNunA^-\

//启用输入流

InputStreamis=client,getInputStream();

InputStreamReaderisr=newInputstreamReader(is);

BufferedReaderbr=newBufferedReader(isr);

System.printin(〃第〃+clientNum+〃个客户端连接进入服务

器〃);

booleanflag=true;

Strings;

do{

//对用户发来的消息进行群发给客户端

s=br.readLine();

System,out.printin(〃接受到一个客户端消息:〃+s);

for(inti=0;i<clientConnection.size();i++){

Socketclient=clientConnection.get(i);

OutputStreamos=client.getOutputStreamO;

PrintStreamps=newPrintStream(os);

ps.println(s);

)

}while(flag);

client,close();

}catch(lOExceptione){

System,out.printin(〃有一个客户断开与服务器的连接〃);

)

)

界面:

TH▼

QuickAccessJavaEE]割)Java

L_Marke...口Prop...酰Serve...渔Data...恒Snipp...日Cons...区

四X一|良地虔国I日里▼。▼

Server[JavaApplication]D:\jdkAbin\javaw.exe(2015年6月18日下午12:04:36)口

服务器已经启动鼎

2.登录

代码:

packagecom.qq.main;

importjava.awt.Color;

importjava.awt.Dimension;

importjava.awt.Toolkit;

importjava.awt.event.ActionEvent;

importjava.awt.event.ActionListener;

importjavax.swing.JButton;

importjavax.swing.JFrame;

importjavax.swing.JLabel;

importjavax.swing.JOptionPane;

importjavax.swing.JPasswordField;

importjavax.swing.JTextField;

importcom.qq.regist.Regist;

importcom.qq.regist.Userlnformation;

/**

*主界面

*/

publicclassMainextendsJFrame{

〃组件的内容

privateJLabeluserid;

privateJLabeluserPassword;

privateJTextFieldinputld;

privateJPasswordFieldinputPassword;

privateJButtonbtLogin;

privateJButtonbtRegist;

MainO{

userid=newJLabel(〃帐号〃);

userPassword=newJLabel(〃密码〃);

inputId=newJTextField(6);

inputPassword=newJPasswordField();

btLogin=newJButton(“登陆〃);

btRegist=newJButton(〃注册“);

//设置窗体属性

Toolkittk=Toolkit.getDefaultToolkit();

DimensionscreenSize=tk.getScreenSizeO;〃得到当前屏幕的长和宽

intx=(int)screenSize.getWidthO;

inty=(int)screenSize.getHeightO;

this.setBounds((x-240)/2,(y-600)/2,240,600);〃窗口显示

的大小,位置

this.setResizable(false);〃窗口大小不能改变

this.setLayout(null);〃默认的格式

this.setBackground(Color.BLACK);//窗口的颜色

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);〃退出程序

//设置JLabel属性

userid.setBounds(30,160,40,20);

userPassword.setBounds(30,200,40,20);

//设置文本域属性

inputld.setBounds(90,160,100,20);

inputPassword.setBounds(90,200,100,20);

inputPassword.setEchoChar(J*');〃用*显示代替你输入的密码

//设置JButton属性

btLogin.setBounds(50,240,60,20);

btRegist.setBounds(120,240,60,20);

//注册“登陆”按钮监听器

btLogin.addActionListener(newActionListener(){

publicvoidactionPerformed(ActionEvente){

UserInformationuser=newUserlnformationO;

StringuserName=inputld.getText();

StringuserPassword=new

String(inputPassword.getPasswordO);

if(userName.equals(z,//)){

JOptionPane.showMessageDialog(null,〃用户名不能为空〃);

}elseif(/zzz.equals(userPassword)){

JOptionPane.showMessageDialog(null,〃密码不能为空〃);

}elseif(user.isExist(userName)

&&user,userinfomation.getProperty(userName).equals(

userPassword)){

newAlITalkFrame(userName).setVisible(true);//判断成功

后new一个群聊窗口

Main.this,dispose();

}else{

JOptionPane.showMessageDialog(null,〃此用户名不存在或者

密码不正确〃);

)

)

});

//注册“注册”按钮监听器

btRegist.addActionListener(newActionListener(){

publicvoidactionPerformed(ActionEvente){

newRegist();〃注册页面

)

});

this.add(userid);

this,add(userPassword);

this,add(inputld);

this,add(inputPassword);

this,add(btLogin);

this,add(btRegist);

this.setVisible(true);

)

publicstaticvoidmain(String[]args)

newMainO;

)

)

界面:

s

3.注册

代码:

//注册“提交”按钮的监听器

btSubmit.addActionListener(newActionListener()

publicvoidactionPerformed(ActionEvente){

StringuserName=inputld.getText0;

StringuserPassword=new

String(inputPassword.getPasswordO);

StringuserPasswordConfirm=newString(inputPasswordConfirm

.getPassword());

System.out.printin(〃您点击了提交按钮〃);

if(userName.equals(,,,z)){

JOptionPane.showMessageDialog(jWL11,〃用户名不能为空〃);

}elseifequals(userPassword)

|〃〃.equals(userPasswordConfirm)){

JOptionPane.showMessageDialog{nw11,〃密码和密码重复都不

能为空〃);

}elseif(!userPassword.equals(userPasswordConfirm)){

JOptionPane.showMessageDialog{n\i11,〃密码和密码重复不一

致〃);

}else{

Userinformationuser=newUserlnformationO;

if(user,isExist(userName)){

JOptionPane.showMessageDialogSwll,〃此用户名已存在

〃);

}else{

JOptionPane.showMessageDialog(xwi11,〃注册成功〃);

user,insert(userName,

userPassword);//Userinformation类

Regist.this,dispose();

)

)

}

});

//注册“取消”按钮的监听器

btCancel.addActionListener(newActionListener(){

publicvoidactionPerformed(ActionEvente){

System.out.printin(〃您点击了取消按钮〃);

Regist.this,dispose();

});

界面:

4.登录和注册判定

代码:

〃注册一个用户

publicvoidinsert(StringuserName,StringuserPassword){

try(

userinfomation=newProperties();

InputStreamis;

OutputStreamos;

is=newFilelnputStreamCzc:/userlnfo.properties77);

os=newFileOutputStream(,/c:/userInfo,properties'",true);

userinfomation.load(is);

//将用户名和密码存储到内存中

userinfomation.setProperty(userName,userPassword);

//将用户名和密码保存到文件中

userinfomation.store(os,null);

}catch(FileNotFoundExceptionel){

System.out.printin(〃文件userinfo,properties没有找到");

}catch(lOExceptione){

System.out,printin(〃写userinfo,properties出错〃);

}

)

〃判断此用户名是否存在

publicbooleanisExist(StringuserName){

try(

userinfomation=newProperties();

InputStreamis;

is=newFileInputStream(z,c:/userInfo.properties^);

userinfomation.load(is);

if(userinfomation.containsKey(userName)){

returntrue;

)

}catch(FileNotFoundExceptionel){

System,out.printin(〃文件userinfo,properties没有找到〃);

}catch(lOExceptione){

System.out.printin(〃写userinfo,properties出错〃);

)

returnfalse;

)

5.进入聊天界面

代码:

classshowOldMessageThreadimplementsRunnable{

publicvoidrun(){

booleanflag=true;

while(flag){

try{

//接收群聊服务器端回发过来的消息

StringserverOutput=client,br.readLine()+〃\r\n〃;

if(!serverOutput.startsWith(〃私聊〃)

&&!serverOutput.startsWith(〃*〃)

&&!(serverOutput.substring(serverOutput

.indexOf(〃:〃)+1).equals(〃\r\n〃)))(

Stringsi=serverOutput.replace('说',’');

Strings=si.replaceAll〃,〃\r\n〃);

oldMessageTextArea.append(s);

//添加客户端的用户在线列表

if(!serverOutput.startsWith(〃*〃)

&&!serverOutput.startsWith(“私聊〃)

&&(serverOutput.indexOf(〃说〃)!=-1)){

StringlistName=serverOutput.substring(0,

serverOutput.indexOfC说‘));

//如果JList中有相同名字的用户,则不添加,否则添加

if(!users,contains(listName)){

System.printin(〃用户〃+listName+〃上线了〃);

users,add(listName);

userList.setListData(users);

//判断服务器回发过来的消息是不是以〃私聊〃开头的,是的话

就提取出这两个用户名

if(serverOutput.startsWith(〃私聊”)){

StringsiliaoNamel=serverOutput.substring(

serverOutput.indexOf+1,serverOutput

.indexOf("和〃));

StringsiliaoName2=serverOutput.substring(

serverOutput.indexOf(〃和〃)+1,serverOutput

.indexOf(〃\r〃));

StringsiliaoBenshen=〃〃;

StringsiliaoDuixiangName=〃〃;

if(siliaoNamel.equals(clientName)){

siliaoBenshen=siliaoNamel;

siliaoDuixiangName=siliaoName2;

}else{

siliaoBenshen=siliaoName2;

siliaoDuixiangName=siliaoNamel;

)

//判断这两个名字中是否有与自己同名的,有的话就弹出

个私聊窗口

if(siliaoNamel.equals(clientName)

IsiliaoName2.equals(c1ientName)){

newPointToPointTalkFrame(si1iaoBenshen+〃和〃

+siliaoDuixiangName).setVisible(true);

)

)

}catch(lOExceptionel){

System.out.printing读取服务器端消息出错〃);

)

)

)

)

//注册JList的点击事件,进入私聊界面

userList.addMouseListener(newMouseAdapter(){

publicvoidmousedicked(MouseEvente){

if(e.getClickCount0==2){

if(AHTalkFrame.this.userList.getSelectedValue()

.toString0.equals(clientName)){

JOptionPane.showMessageDialog^xwi11,〃不能和自己聊天

〃);

}else{

StringPToPMemberName=〃私聊〃

+〃*〃

+clientName

+〃和〃

+

AHTalkFrame.this.userList.getSelectedValue()

.toString();

client,ps.printIn(PToPMemberName);

)

});

界面:

IS?Markers口Properties晶Servers.DataSourceExp...恒Snippets日Console及

■x鼠地画里)1凶耳

Server[JavaApplication]D:\jdk7\bin\javaw.exe(2015年6月18日下午12:04:36)

I第

r

』潢

5器

臂r

一h

4力

而n

l7”T

心:

危^

手^

山n

iT,>l

乂1

T山

.说•

二7

工•

47,削.12

1N自

山•

i说

J而

一2

,联.

1出

小4^

.山I.

i而

4Nn

l.2说

7山

d心•

4,削

早自

”212

一7.

i山•

们史

4子

J而%.^

!?自:

T心^2

iF?1•、

客•

T>子

息2

F而

v•_

6.私聊页面

代码:

//线程:只要服务器端有消息,就将消息显示到。IdMessageTextArea

classshowOldMessageThreadimplementsRunnable{

publicvoidrun(){

booleanflag=true;

while(flag){

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论