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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

網(wǎng)絡程序設計考試大作業(yè)

題目:聊天室程序

班級:

學號:

姓名:

成績:

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

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

程序設計思想及程序設計流程框圖...................3

三.主要代碼及代碼運行結果...........................4

1.啟動服務器......................................4

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

3.注冊..........................................10

4.登錄和注冊判定................................12

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

6.私聊頁面......................................17

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

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

主要函數(shù):

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

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

publicclassMainextendsJFrame;登錄界面的顯示。

publicclassRegistextendsJDialog;注冊界面的顯示。

publicclassUserinformation;用戶信息的保存和驗證。

publicclassAllTalkFrameextendsJFrame;登錄后進入群聊界面。

publicclassPointToPointTalkFrameextendsJFrame;私聊界面。

二.程序設計思想及程序設計流程框圖

設計思想:

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

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

程序設計流程:

主頁面:輸入賬號與密碼,點擊登錄或者注冊進入下一頁面。

登錄:判定是否正確,正確則進去聊天界面。

注冊:進去注冊界面,成功則返回主頁面。

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

私聊界面:能與一個人單獨聊天,信息只能被雙方看到。

主頁面

三.主要代碼及代碼運行結果

1.啟動服務器

代碼:

publicclassServer{

ServerSocketserver;

staticintclientNum=0;

//存放與服務器連接上的對應的Socket,作用是保存服務器與客戶端之間的流,

便于服務器給每個客戶端進行回發(fā)消息

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

publicServer(){

try{

server=newServerSocket(9999);

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

}catch(lOExceptione){

e.printStackTrace();

System.out.printin(〃服務器啟動失敗〃);

}

)

//內部類,監(jiān)聽客戶端是否有連接到服務器,并將此客戶端的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發(fā)送過來的消息,并且服務器原

封不動的返回給所有客戶端,客戶端對消息進行過濾

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{

//對用戶發(fā)來的消息進行群發(fā)給客戶端

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...區(qū)

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

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

服務器已經(jī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{

〃組件的內容

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

//注冊“登陸”按鈕監(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一個群聊窗口

Main.this,dispose();

}else{

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

密碼不正確〃);

)

)

});

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

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.注冊

代碼:

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

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();

)

)

}

});

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

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{

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

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

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

就提取出這兩個用戶名

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

,聯(lián).

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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論