版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
./服務(wù)器端代碼:import.*;importjava.io.*;importjava.util.*;importjava.util.concurrent.*;importjavax.swing.*;publicclassServer{ privatestaticfinalintPORT=6666; G_Menugm=newG_Menu<>; privateServerSocketserver; publicArrayList<PrintWriter>list; publicstaticStringuser; publicstaticArrayList<User>list1=newArrayList<User><>;//定義用戶集合 publicUseruu; publicServer<Stringuser> { this.user=user; } publicvoidgetServer<> { list=newArrayList<PrintWriter><>; try{ server=newServerSocket<PORT>; System.out.println<"服務(wù)器啟動,開始監(jiān)聽">; while<true> { Socketclient=server.accept<>;//接收客戶端線程 PrintWriterwriter=newPrintWriter<client.getOutputStream<>>;list.add<writer>; Threadt=newThread<newChat<client>>;t.start<>; } }catch<Exceptionex>{ ex.printStackTrace<>; } } publicstaticvoidmain<String[]args> { newServer<user>.getServer<>; } classChatimplementsRunnable { Socketsocket; privateBufferedReaderbr; privateStringmsg; privateStringmssg=""; publicChat<Socketsocket> { try{ this.socket=socket; }catch<Exceptionex>{ ex.printStackTrace<>; } } publicvoidrun<> { try{ br=newBufferedReader<newInputStreamReader<socket.getInputStream<>>>; while<<msg=br.readLine<>>!=null> { if<msg.equals<"1008611">>//匹配字符串顯示好友列表 { msg=br.readLine<>; String[]st=msg.split<":">;//將用戶信息跟消息分隔開 uu=newUser<st[0],st[1],socket>;//將用戶信息添加到User對象中 list1.add<uu>;//將對象添加到用戶集合 Iterator<User>it=Server.list1.iterator<>;//遍歷用戶集合 while<it.hasNext<>> { Useruse=it.next<>; msg=use.getName<>+"<"+use.getSex<>+">:"; mssg+=msg;//將所有的用戶信息連接成一個字符串 } sendMessage<"1008611">;//顯示好友列表匹配標(biāo)識 sendMessage<mssg>;//群發(fā)消息 } elseif<msg.equals<"10010">>//顯示說話消息 { msg=br.readLine<>; System.out.println<msg>; sendMessage<"10010">;//顯示說話信息匹配標(biāo)識 sendMessage<msg>; } elseif<msg.equals<"10086">>//顯示進(jìn)入聊天室 { msg=br.readLine<>; System.out.println<msg>; sendMessage<"10086">;//進(jìn)入聊天室匹配標(biāo)識 sendMessage<msg>; } elseif<msg.equals<"841163574">>//私聊 { msg=br.readLine<>; String[]rt=msg.split<"1072416535">;//把傳進(jìn)來的用戶信息跟說話內(nèi)容分開 System.out.println<rt[1]>;//在服務(wù)器端顯示說話內(nèi)容 String[]tg=rt[0].split<":">;//因為是私聊,傳過來兩個用戶的用戶信息,這句作用是再把兩個用戶信息分開 Iterator<User>iu=Server.list1.iterator<>;//遍歷用戶集合 while<iu.hasNext<>> { Userse=iu.next<>; if<tg[1].equals<se.getName<>+"<"+se.getSex<>+">">>//如果傳進(jìn)來的用戶信息跟集合中的用戶信息吻合 { try{ PrintWriterpwriter=newPrintWriter<se.getSock<>.getOutputStream<>>;//建立用戶自己的流 pwriter.println<"841163574">;//匹配標(biāo)識 pwriter.println<rt[1]>;//向單獨用戶發(fā)送消息 pwriter.flush<>; System.out.println<rt[1]>; }catch<Exceptionex>{ ex.printStackTrace<>; } } elseif<tg[0].equals<se.getName<>>>//如果傳進(jìn)來的用戶信息跟集合中的用戶信息吻合 { try{ PrintWriterpwr=newPrintWriter<se.getSock<>.getOutputStream<>>;//建立用戶自己的流 pwr.println<"841163574">;//匹配標(biāo)識 pwr.println<rt[1]>;//向單獨用戶發(fā)送消息 pwr.flush<>; System.out.println<rt[1]>; }catch<Exceptionex>{ ex.printStackTrace<>; } } } } elseif<msg.equals<"456987">>//下線 { msg=br.readLine<>; System.out.println<msg>;//在服務(wù)端顯示信息 sendMessage<"456987">;//匹配字符串 sendMessage<msg>;//匹配完畢后群發(fā)消息 String[]si=msg.split<":">;//將傳過來的用戶名跟信息分隔開 Iterator<User>at=Server.list1.iterator<>;//遍歷用戶集合 while<at.hasNext<>> { Usersr=at.next<>; if<sr.getName<>.equals<si[0]>>//如果傳過來的用戶名跟用戶集合里的用戶吻合 { list1.remove<sr>;//將吻合的用戶移除 sr.getSock<>.close<>;//關(guān)閉此用戶的socket } } break; } elseif<msg.equals<"123654">>//刷新 { Stringmssge=""; Iterator<User>iter=Server.list1.iterator<>;//遍歷用戶集合 while<iter.hasNext<>> { Useruus=iter.next<>; msg=uus.getName<>+"<"+uus.getSex<>+">:"; mssge+=msg;//將所有的用戶信息連接成一個字符串 } sendMessage<"123654">;//發(fā)送刷新匹配標(biāo)識 sendMessage<mssge>;//群發(fā)消息 } } }catch<IOExceptionex>{ ex.printStackTrace<>; } } } publicvoidsendMessage<Stringmessage>//群發(fā)消息方法 { try{ for<PrintWriterpw:list>//輸出流集合 { pw.println<message>; pw.flush<>; } }catch<Exceptionex>{ ex.printStackTrace<>; } }}客戶端代碼:import.*;importjava.io.*;importjava.util.*;importjava.util.concurrent.*;publicclassSocket_one//客戶端{(lán) privatestaticfinalintPORT=6666;//端口 publicstaticStringuser; publicstaticSocketsocket; publicSocket_one<Stringuser> { this.user=user; try{ socket=newSocket<"",PORT>;//建立socket連接 System.out.println<"["+user+"]歡迎來到聊天室!">; Threadtt=newThread<newRecove<socket,user>>;//建立客戶端線程 tt.start<>;//啟動線程 }catch<Exceptionex> { ex.printStackTrace<>; } } publicstaticvoidmain<String[]args>throwsException { newSocket_one<user>; }}classRecoveimplementsRunnable{ publicStringuser; privateSocketsocket; privateBufferedReaderkeybord; publicBufferedReaderbr; privatePrintWriterpw; privateStringmsg; G_Menugm=newG_Menu<>; publicRecove<Socketsocket,Stringuser>throwsIOException { try{ this.socket=socket; this.user=user; }catch<Exceptionex>{ ex.printStackTrace<>; } } publicvoidrun<> { try{ br=newBufferedReader<newInputStreamReader<socket.getInputStream<>>>; while<<msg=br.readLine<>>!=null> { Stringmessage=msg; if<message.equals<"1008611">>//匹配字符串顯示好友列表 { gm.listModel1.clear<>;//接收前清空好友列表 gm.jcomb.removeAllItems<>;//清空J(rèn)Combox gm.jcomb.addItem<"所有人">; message=br.readLine<>; String[]str=message.split<":">;//將接收到的所有用戶信息分隔開 for<Stringss:str> { gm.listModel1.addElement<ss>;//將所有用戶信息添加到好友列表 gm.jcomb.addItem<ss>;//將所有用戶信息添加到JCombox } } elseif<message.equals<"841163574">>//私聊 { message=br.readLine<>; System.out.println<"收到:"+message>;//在服務(wù)器端顯示私聊消息 gm.jta2.append<message+"\n">;//在我的頻道顯示私聊信息 } elseif<message.equals<"10010">>//顯示說話消息 { message=br.readLine<>; System.out.println<"收到:"+message>;//在服務(wù)器端顯示說話信息 gm.jta1.append<message+"\n">;//在公共頻道顯示說話信息 gm.jta2.append<message+"\n">;//在我的頻道顯示說話信息 } elseif<message.equals<"10086">>//顯示進(jìn)入聊天室 { message=br.readLine<>; gm.jta1.append<message+"\n">;//在公共頻道顯示進(jìn)入聊天室信息 gm.jta2.append<message+"\n">;//在我的頻道顯示進(jìn)入聊天室信息 } elseif<message.equals<"123654">>//刷新 { gm.listModel1.clear<>;//將好友列表清空 gm.jcomb.removeAllItems<>;//將JCombox清空 gm.jcomb.addItem<"所有人">; message=br.readLine<>; String[]sr=message.split<":">;//將接收到的用戶信息分隔開 for<Stringsst:sr> { gm.listModel1.addElement<sst>;////將刷新后所有用戶信息添加到好友列表 gm.jcomb.addItem<sst>;//將刷新后所有用戶信息添加到JCombox } } elseif<message.equals<"456987">>//下線 { message=br.readLine<>; gm.jta1.append<message+"\n">;//在公共頻道顯示用戶下線信息 gm.jta2.append<message+"\n">;//在我的頻道顯示用戶下線信息 } } }catch<IOExceptionex>{ ex.printStackTrace<>; } }}登陸界面代碼:importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjava.util.*;importjavax.swing.border.*;classLandenextendsFrameimplementsActionListener{ JFramejf=newJFrame<"聊天登陸">; JPaneljp1=newJPanel<>; JPaneljp2=newJPanel<>; JPaneljp3=newJPanel<>; JPaneljp4=newJPanel<>; JLabeljl1=newJLabel<"__">; JLabeljl2=newJLabel<"地址:">; JLabeljl3=newJLabel<"端口:">; JRadioButtonjrb1=newJRadioButton<"男生">; JRadioButtonjrb2=newJRadioButton<"女生">; JRadioButtonjrb3=newJRadioButton<"XX">; publicJTextFieldjtf1=newJTextField<10>; publicJTextFieldjtf2=newJTextField<10>; publicJTextFieldjtf3=newJTextField<10>; utton1=newutton<"連接">; utton2=newutton<"斷開">; TitledBordertb=newTitledBorder<"">; ButtonGroupgb=newButtonGroup<>; publicvoidinit<>//顯示登錄界面 { 1.addActionListener<this>; 2.addActionListener<this>; jp1.add<jl1>; jp1.add<jtf1>; jp1.add<jrb1>; jp1.add<jrb2>; jp1.add<jrb3>; jp2.add<jl2>; jp2.add<jtf2>; jp2.add<jl3>; jp2.add<jtf3>; jp3.add<1>; jp3.add<2>; jp4.setLayout<newGridLayout<3,1>>; jp4.add<jp1>; jp4.add<jp2>; jp4.add<jp3>; jf.add<jp4>; jtf2.setText<"localhost">; jtf3.setText<"6666">; gb.add<jrb1>; gb.add<jrb2>; gb.add<jrb3>; jf.setLocation<200,200>; jf.setSize<350,200>; jf.setResizable<false>; jf.setDefaultCloseOperation<JFrame.DISPOSE_ON_CLOSE>; jf.setVisible<true>; } publicvoidactionPerformed<ActionEventevent>//事件觸發(fā) { 1.setText<"連接">; 2.setText<"斷開">; Strings1=null; if<event.getActionCommand<>.equals<"斷開">> { System.exit<0>; } if<event.getActionCommand<>.equals<"連接">> { if<jtf1.getText<>.equals<"">> { JOptionPane.showMessageDialog<null,"請輸入用戶名!">; } elseif<!jrb1.isSelected<>&&!jrb2.isSelected<>&&!jrb3.isSelected<>> { JOptionPane.showMessageDialog<null,"請選擇性別!">; } else { jf.setVisible<false>; if<jrb1.isSelected<>> { s1="boy"; } elseif<jrb2.isSelected<>> { s1="girl"; } elseif<jrb3.isSelected<>> { s1="secret"; } G_Menugmu=newG_Menu<>; gmu.getMenu<jtf1.getText<>,s1>; gmu.sock<>; } } }}publicclassLogin{ publicstaticvoidmain<String[]args> { newLanden<>.init<>; }}主界面代碼:importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjavax.swing.border.*;import.*;importjava.io.*;classG_MenuextendsJFrameimplementsActionListener{ JFramejf=newJFrame<"聊天室">; publicSocket_onesoc; publicPrintWriterpw; publicJPaneljp1=newJPanel<>; publicJPaneljp2=newJPanel<>; publicJPaneljp3=newJPanel<>; publicJPaneljp4=newJPanel<>; publicJPaneljp5=newJPanel<>; publicJPaneljp6=newJPanel<>; publicJPaneljp7=newJPanel<>; publicstaticJTextAreajta1=newJTextArea<12,42>; publicstaticJTextAreajta2=newJTextArea<12,42>; publicJLabeljl1=newJLabel<"對">; publicstaticJComboBoxjcomb=newJComboBox<>; publicJCheckBoxjcb=newJCheckBox<"私聊">; publicJTextFieldjtf=newJTextField<36>; publicutton1=newutton<"發(fā)送>>">; publicutton2=newutton<"刷新">; publicstaticDefaultListModellistModel1; publicstaticJListlst1; publicStringna; publicStringse; publicStringmessage; publicvoidgetMenu<Stringname,Stringsex>//顯示聊天界面 { jcomb.addItem<"所有人">; this.na=name; this.se=sex; jta1.setEditable<false>; jta2.setEditable<false>; listModel1=newDefaultListModel<>; lst1=newJList<listModel1>; lst1.setSelectionMode<ListSelectionModel.SINGLE_SELECTION>; lst1.setVisibleRowCount<18>; lst1.setFixedCellHeight<28>; lst1.setFixedCellWidth<100>; JScrollPanejsp1=newJScrollPane<jta1>; JScrollPanejsp2=newJScrollPane<jta2>; JScrollPanejsp3=newJScrollPane<lst1>; jsp3.setBorder<newTitledBorder<"好友列表">>; jsp1.setBorder<newTitledBorder<"主聊天頻道">>; jsp2.setBorder<newTitledBorder<"我的頻道">>; jp1.setLayout<newGridLayout<2,1>>; jp1.add<jsp1>; jp1.add<jsp2>; jp2.setLayout<newFlowLayout<FlowLayout.LEFT>>; jp2.add<jl1>; jp2.add<jcomb>; jp2.add<jcb>; jp3.setLayout<newFlowLayout<FlowLayout.LEFT>>; jp3.add<jtf>; jp3.add<1>; jp4.setLayout<newGridLayout<2,1>>; jp4.add<jp2>; jp4.add<jp3>; jp5.setLayout<newBorderLayout<>>; jp5.add<jp1,BorderLayout.NORTH>; jp5.add<jp4,BorderLayout.SOUTH>; jp6.setLayout<newBorderLayout<>>; jp6.add<jsp3,BorderLayout.NORTH>; jp6.add<2,BorderLayout.SOUTH>; jp7.setLayout<newFlowLayout<FlowLayout.LEFT>>; jp7.add<jp5>; jp7.add<jp6>; jf.add<jp7>; jf.setLocation<200,200>; jf.setSize<700,650>; jf.setResizable<false>; jf.setDefaultCloseOperation<JFrame.DO_NOTHING_ON_CLOSE>; jf.setVisible<true>; 1.addActionListener<this>; 2.addActionListener<this>; jta1.setLineWrap<true>; jta2.setLineWrap<true>; jsp1.setVerticalScrollBarPolicy<ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS>; jsp1.setHorizontalScrollBarPolicy<ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER>; jsp2.setVerticalScrollBarPolicy<ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS>; jsp2.setHorizontalScrollBarPolicy<ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER>; jsp3.setVerticalScrollBarPolicy<ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS>; jsp3.setHorizontalScrollBarPolicy<ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER>; jf.pack<>; } publicvoidsock<> {try{ Stringuser=na+"<"+se+">";//將用戶信息保存成字符串形式 soc=newSocket_one<user>;//創(chuàng)建客戶端對象 pw=newPrintWriter<soc.socket.getOutputStream<>>;//創(chuàng)建輸出流 pw.println<"1008611">;//發(fā)送好友列表標(biāo)識 pw.println<na+":"+se>;//發(fā)送用戶信息 pw.flush<>; pw.println<"10086">;//發(fā)送進(jìn)入聊天室標(biāo)識 pw.println<"["+na+"]"+"進(jìn)入聊天室">;//發(fā)送進(jìn)入聊天室信息 pw.flush<>; }catch<Exceptionex>{ ex.printStackTrace<>; } } publicG_Menu<>{//設(shè)置窗口關(guān)閉事件,如果點擊窗口右上角叉號關(guān)閉,執(zhí)行下邊程序 jf.addWindowListener<newWindowAdapter<>{ publicvoidwindowClosing<WindowEvente>{ try{ pw=newPrintWriter<soc.socket.getOutputStream<>>; pw.println<"456987">;//發(fā)送下線標(biāo)識 pw.println<na+":離開聊天室">;//發(fā)送下線信息 pw.flush<>; jf.dispose<>;//關(guān)閉窗口 }catch<Exceptionex>{ } } } >; } publicvoidactionPerformed<ActionEvent
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 高考物理總復(fù)習(xí)專題七電場第1講庫侖定律、電場強度、電場線練習(xí)含答案
- 專業(yè)混凝土分包合同范本
- 《平衡計分卡培訓(xùn)》課件
- 高中數(shù)學(xué) 2.2 直線的方程 2.2.3.1 兩條直線相交、平行與重合的條件教案 新人教B版必修2
- 八年級物理下冊 第九章 機械和功 第三節(jié) 功教案 (新版)北師大版
- 六年級品德與社會上冊 科學(xué)技術(shù)的另一面教案 泰山版
- 高中數(shù)學(xué) 1.1.2 空間向量的數(shù)量積運算教學(xué)設(shè)計 新人教A版選擇性必修第一冊
- 2024年六年級品社下冊《讓科學(xué)技術(shù)走進(jìn)生活》教案1 冀教版
- 廚房管理規(guī)章制度
- 租借手機的合同(2篇)
- 2023年12月2024年中國鐵路成都局招考聘用高校畢業(yè)生924人(一)筆試歷年高頻考點(難、易錯點)附答案詳解
- 直播運營團隊組織架構(gòu)與各崗位職責(zé)研究
- 慢病管理及遠(yuǎn)程醫(yī)療的應(yīng)用
- 學(xué)校個性化課程管理制度
- 肺炎支原體性肺炎護(hù)理課件
- 辦理各類證件所需表格
- 內(nèi)蒙古五句話的事實和道理輔導(dǎo)讀本
- 黑色素瘤護(hù)理的課件
- 水性可剝離涂料的制備
- 小程序會員協(xié)議書
- 貝克抑郁量表(BDI)
評論
0/150
提交評論