網(wǎng)絡(luò)程序設(shè)計(jì)考試大作業(yè) 聊天室程序_第1頁(yè)
網(wǎng)絡(luò)程序設(shè)計(jì)考試大作業(yè) 聊天室程序_第2頁(yè)
網(wǎng)絡(luò)程序設(shè)計(jì)考試大作業(yè) 聊天室程序_第3頁(yè)
網(wǎng)絡(luò)程序設(shè)計(jì)考試大作業(yè) 聊天室程序_第4頁(yè)
網(wǎng)絡(luò)程序設(shè)計(jì)考試大作業(yè) 聊天室程序_第5頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

網(wǎng)絡(luò)程序設(shè)計(jì)考試大作業(yè)

題目:聊天室程序

班級(jí):

學(xué)號(hào):

姓名:

成績(jī):

網(wǎng)絡(luò)程序設(shè)計(jì)考試大作業(yè)..................................1

一.所使用的背景知識(shí)'主要函數(shù)的描述.................3

程序設(shè)計(jì)思想及程序設(shè)計(jì)流程框圖...................3

三.主要代碼及代碼運(yùn)行結(jié)果...........................4

1.啟動(dòng)服務(wù)器......................................4

2.登錄...........................................6

3.注冊(cè)..........................................10

4.登錄和注冊(cè)判定................................12

5.進(jìn)入聊天界面..................................13

6.私聊頁(yè)面......................................17

所使用的背景知識(shí)、主要函數(shù)的描述

背景:根據(jù)現(xiàn)在最流行的聊天工具QQ,模仿一部分主要功能來(lái)完成。

主要函數(shù):

publicclassServer;服務(wù)器的創(chuàng)建。

publicclassClient;客戶端的創(chuàng)建。

publicclassMainextendsJFrame;登錄界面的顯示。

publicclassRegistextendsJDialog;注冊(cè)界面的顯示。

publicclassUserinformation;用戶信息的保存和驗(yàn)證。

publicclassAllTalkFrameextendsJFrame;登錄后進(jìn)入群聊界面。

publicclassPointToPointTalkFrameextendsJFrame;私聊界面。

二.程序設(shè)計(jì)思想及程序設(shè)計(jì)流程框圖

設(shè)計(jì)思想:

利用socket與serversocket在客戶端與客戶端之間的通信,InputStream

InputStreamReader輸入輸出流進(jìn)行信息的發(fā)送與接收。

程序設(shè)計(jì)流程:

主頁(yè)面:輸入賬號(hào)與密碼,點(diǎn)擊登錄或者注冊(cè)進(jìn)入下一頁(yè)面。

登錄:判定是否正確,正確則進(jìn)去聊天界面。

注冊(cè):進(jìn)去注冊(cè)界面,成功則返回主頁(yè)面。

進(jìn)入聊天室:能發(fā)送信息讓在線的所有人看到。

私聊界面:能與一個(gè)人單獨(dú)聊天,信息只能被雙方看到。

主頁(yè)面

三.主要代碼及代碼運(yùn)行結(jié)果

1.啟動(dòng)服務(wù)器

代碼:

publicclassServer{

ServerSocketserver;

staticintclientNum=0;

//存放與服務(wù)器連接上的對(duì)應(yīng)的Socket,作用是保存服務(wù)器與客戶端之間的流,

便于服務(wù)器給每個(gè)客戶端進(jìn)行回發(fā)消息

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

publicServer(){

try{

server=newServerSocket(9999);

System.out.printin(〃服務(wù)器已經(jīng)啟動(dòng)〃);

}catch(lOExceptione){

e.printStackTrace();

System.out.printin(〃服務(wù)器啟動(dòng)失敗〃);

}

)

//內(nèi)部類,監(jiān)聽客戶端是否有連接到服務(wù)器,并將此客戶端的Socket傳遞給

HandleSocket進(jìn)行處理,同時(shí)將client存放到List中,即clientConnection中

classSocketListenerimplementsRunnable{

publicvoidrun(){

Socketclient;

try{

while(true){

client=server,accept();

//連接上一個(gè)就壓入List中,即clientconnection中

c1ientConnection.add(client);

HandleSockeths=newHandleSocket(client);

//連接上就讓HandleSocket去處理

newThread(hs).start();

}

}catch(lOExceptione){

System.out.printin(〃客戶連接服務(wù)器失敗〃);

)

//內(nèi)部類處理一個(gè)Socket,接收一個(gè)Client發(fā)送過來(lái)的消息,并且服務(wù)器原

封不動(dòng)的返回給所有客戶端,客戶端對(duì)消息進(jìn)行過濾

classHandleSocketimplementsRunnable{

Socketclient;

HandleSocket(Socketclient){

this.client=client;

}

publicvoidrun(){

try{

clientNunA^-\

//啟用輸入流

InputStreamis=client,getInputStream();

InputStreamReaderisr=newInputstreamReader(is);

BufferedReaderbr=newBufferedReader(isr);

System.printin(〃第〃+clientNum+〃個(gè)客戶端連接進(jìn)入服務(wù)

器〃);

booleanflag=true;

Strings;

do{

//對(duì)用戶發(fā)來(lái)的消息進(jìn)行群發(fā)給客戶端

s=br.readLine();

System,out.printin(〃接受到一個(gè)客戶端消息:〃+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(〃有一個(gè)客戶斷開與服務(wù)器的連接〃);

)

)

界面:

TH▼

QuickAccessJavaEE]割)Java

L_Marke...口Prop...酰Serve...漁Data...恒Snipp...日Cons...區(qū)

四X一|良地虔國(guó)I日里▼。▼

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

服務(wù)器已經(jīng)啟動(dòng)鼎

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{

〃組件的內(nèi)容

privateJLabeluserid;

privateJLabeluserPassword;

privateJTextFieldinputld;

privateJPasswordFieldinputPassword;

privateJButtonbtLogin;

privateJButtonbtRegist;

MainO{

userid=newJLabel(〃帳號(hào)〃);

userPassword=newJLabel(〃密碼〃);

inputId=newJTextField(6);

inputPassword=newJPasswordField();

btLogin=newJButton(“登陸〃);

btRegist=newJButton(〃注冊(cè)“);

//設(shè)置窗體屬性

Toolkittk=Toolkit.getDefaultToolkit();

DimensionscreenSize=tk.getScreenSizeO;〃得到當(dāng)前屏幕的長(zhǎng)和寬

intx=(int)screenSize.getWidthO;

inty=(int)screenSize.getHeightO;

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

的大小,位置

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

this.setLayout(null);〃默認(rèn)的格式

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

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

//設(shè)置JLabel屬性

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

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

//設(shè)置文本域?qū)傩?/p>

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

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

inputPassword.setEchoChar(J*');〃用*顯示代替你輸入的密碼

//設(shè)置JButton屬性

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

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

//注冊(cè)“登陸”按鈕監(jiān)聽器

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一個(gè)群聊窗口

Main.this,dispose();

}else{

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

密碼不正確〃);

)

)

});

//注冊(cè)“注冊(cè)”按鈕監(jiān)聽器

btRegist.addActionListener(newActionListener(){

publicvoidactionPerformed(ActionEvente){

newRegist();〃注冊(cè)頁(yè)面

)

});

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.注冊(cè)

代碼:

//注冊(cè)“提交”按鈕的監(jiān)聽器

btSubmit.addActionListener(newActionListener()

publicvoidactionPerformed(ActionEvente){

StringuserName=inputld.getText0;

StringuserPassword=new

String(inputPassword.getPasswordO);

StringuserPasswordConfirm=newString(inputPasswordConfirm

.getPassword());

System.out.printin(〃您點(diǎn)擊了提交按鈕〃);

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

JOptionPane.showMessageDialog(jWL11,〃用戶名不能為空〃);

}elseifequals(userPassword)

|〃〃.equals(userPasswordConfirm)){

JOptionPane.showMessageDialog{nw11,〃密碼和密碼重復(fù)都不

能為空〃);

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

JOptionPane.showMessageDialog{n\i11,〃密碼和密碼重復(fù)不一

致〃);

}else{

Userinformationuser=newUserlnformationO;

if(user,isExist(userName)){

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

〃);

}else{

JOptionPane.showMessageDialog(xwi11,〃注冊(cè)成功〃);

user,insert(userName,

userPassword);//Userinformation類

Regist.this,dispose();

)

)

}

});

//注冊(cè)“取消”按鈕的監(jiān)聽器

btCancel.addActionListener(newActionListener(){

publicvoidactionPerformed(ActionEvente){

System.out.printin(〃您點(diǎn)擊了取消按鈕〃);

Regist.this,dispose();

});

界面:

4.登錄和注冊(cè)判定

代碼:

〃注冊(cè)一個(gè)用戶

publicvoidinsert(StringuserName,StringuserPassword){

try(

userinfomation=newProperties();

InputStreamis;

OutputStreamos;

is=newFilelnputStreamCzc:/userlnfo.properties77);

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

userinfomation.load(is);

//將用戶名和密碼存儲(chǔ)到內(nèi)存中

userinfomation.setProperty(userName,userPassword);

//將用戶名和密碼保存到文件中

userinfomation.store(os,null);

}catch(FileNotFoundExceptionel){

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

}catch(lOExceptione){

System.out,printin(〃寫userinfo,properties出錯(cuò)〃);

}

)

〃判斷此用戶名是否存在

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出錯(cuò)〃);

)

returnfalse;

)

5.進(jìn)入聊天界面

代碼:

classshowOldMessageThreadimplementsRunnable{

publicvoidrun(){

booleanflag=true;

while(flag){

try{

//接收群聊服務(wù)器端回發(fā)過來(lái)的消息

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

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

&&!serverOutput.startsWith(〃*〃)

&&!(serverOutput.substring(serverOutput

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

Stringsi=serverOutput.replace('說(shuō)',’');

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

oldMessageTextArea.append(s);

//添加客戶端的用戶在線列表

if(!serverOutput.startsWith(〃*〃)

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

&&(serverOutput.indexOf(〃說(shuō)〃)!=-1)){

StringlistName=serverOutput.substring(0,

serverOutput.indexOfC說(shuō)‘));

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

if(!users,contains(listName)){

System.printin(〃用戶〃+listName+〃上線了〃);

users,add(listName);

userList.setListData(users);

//判斷服務(wù)器回發(fā)過來(lái)的消息是不是以〃私聊〃開頭的,是的話

就提取出這兩個(gè)用戶名

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;

)

//判斷這兩個(gè)名字中是否有與自己同名的,有的話就彈出

個(gè)私聊窗口

if(siliaoNamel.equals(clientName)

IsiliaoName2.equals(c1ientName)){

newPointToPointTalkFrame(si1iaoBenshen+〃和〃

+siliaoDuixiangName).setVisible(true);

)

)

}catch(lOExceptionel){

System.out.printing讀取服務(wù)器端消息出錯(cuò)〃);

)

)

)

)

//注冊(cè)JList的點(diǎn)擊事件,進(jìn)入私聊界面

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

』潢

務(wù)

5器

臂r

一h

說(shuō)

、

4力

而n

l7”T

心:

危^

手^

務(wù)

山n

iT,>l

乂1

T山

.說(shuō)?

二7

工?

47,削.12

1N自

山?

i說(shuō)

、

J而

一2

,聯(lián).

1出

務(wù)

小4^

.山I.

機(jī)

i而

4Nn

l.2說(shuō)

7山

d心?

4,削

早自

”212

一7.

i山?

說(shuō)

們史

4子

J而%.^

!?自:

、

T心^2

iF?1?、

客?

說(shuō)

T>子

息2

F而

v?_

6.私聊頁(yè)面

代碼:

//線程:只要服務(wù)器端有消息,就將消息顯示到。IdMessageTextArea

classshowOldMessageThreadimplementsRunnable{

publicvoidrun(){

booleanflag=true;

while(flag){

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論