《计算机网络通信》课程设计报告
更新时间:2024-01-18 11:05:01 阅读量: 教育文库 文档下载
- 计算机网络通信设备有哪些推荐度:
- 相关推荐
计算机网络通信课程设计
设计题目: 聊天程序 课程编号: 1610033 学生姓名 学 号 所在专业 所在班级 指导教师 成绩
1 月 4 日至2010 年 1 月
设计时间
8 日
李财锡,刘伟镇,黄小敏,巫秋燕
计算机网络技术
084 刘思凤
目 录
目 录
(采用了WORD的目录功能,请同学查阅WORD的标题和目录使用方法,以便正确生成目录,模板中的分页符也不得随意删除,以免造成页眉和页码的错误)
设计总说明------------------------------------------------------------------------------------------------------------1
设计总说明 ............................................................................................................................ I 1
系统功能介绍 .............................................................................................................. 1 1.1
建立侦听服务:.................................................................................................. 1
1.2 用户登录 ................................................................................................................ 1 1.3 收发聊天信息 ??????????????????????????????? 1.4 收发系统消息 ...................................................................................................... 2 1.5用户下线和通知 ............................................................................................................ 3 1.6
服务关闭 .............................................................................................................. 4
2. 代码实现 ................................................................................................................ 4 2.1 用户信息链表实现 ????????????????????????? 2.2 服务器主框类架的实现 ..................................................................................... 6 2.3服务器侦听线程类的实现 ........................................................................................ 6 2.4
服务器接收线程类的实现 ................................................................................. 7 2.5 客户端主框类的实现 ............................................................................................ 8 2.6 客户端接收线程类的实现????????????????????? 3 附:源程序 ..................................................................................................................... 9 参考文献 ............................................................................................................................. 10
设计总说明
这里主要用了java的网络编程相关知识,通过学习了解了TCP和UDP协议的基本知识和Socket编程的基本概念,以及TCP协议的响应流程,现在通过使用java提供的流Socket和数据包Socket,利用流Socket和数据包Socket建立通信连接,最后实现了一个完整的聊天程序,该聊天系统是基于TCP协议的流Socket实现的,它采用了典型的C/S架构,包括一个服务器应用程序和一个客户端程序,可以同时供多个用户进行聊天。
课程设计要求:
1 登录功能。客户端登录到聊天服务器,服务器管理所有登录的客户,并将客户列表发送给各个客户显示。
2 客户可以通过服务器转发,实现一对一和多对多聊天。
3 实现呼叫功能。当客户端程序连接服务器时,通过服务器搜索所要呼叫的客户,如果检测到此用户且该用户正处于联网状态,则服务器通知此用户的客户端程序响应主叫方客户端程序,然后在主叫方和被叫方建立连接后,双方就可以聊天或进行其它的通信。
4 客户端程序应该可以实时显示目前其它用户的状态(例如好友信息,上、下线)。
I
网络系统集成课程结业论文(报告)
编写聊天程序
1
系统功能介绍
本程序具有完整的会话功能,采用C/S结构,由两部分组成:客户端和服务器,可
以供多个用户进行聊天。
服务器具有建立侦听服务、转发聊天信息、响应用户下线、发送系统消息的功能;要实现这四个功能,需要建立以下四个类:(1)用户信息链表、(2)服务器主框类、(3)服务器侦听线程类、(4)服务器接收线程类。
客户端具有请求登录、请求下线、发送聊天信息、接收聊天信息、接收系统信息的功能。要实现这些功能也要建立两个类——客户端主框架类和客户端接收线程类。 下面通过聊天系统的演示来具体了解聊天系统的功能。
1.1
建立侦听服务:
初始状态的服务器如图(1)所示,其主框架上具有两个按钮,分别用于启动和
关闭服务器。
点击“启动”按钮处于允许状态,点击“关闭”按钮处于禁止状态;服务器启动后,就进入侦听状态,关闭就结束侦听,这里设计服务在8000端口启动。
图(1) 图(2)
1.2 用户登录
用户登录过程其实就是客服端请求登录和服务器响应登录两个过程。初始状态的客
- 1 -
网络系统集成课程结业论文(报告)
户端如图(3),它的“上线”按钮用于用户登录,“下线”按钮用于用户下线,界面下方的JTextField控件,在用户未登录时输入用户名称,在用户登录后用于输入聊天信息,并按回车确定操作
图(3)
1.3
收发聊天信息
这个过程包含了客户端发送聊天信息和服务器转发聊天信息。当客户端登录后与其
他在线用户进行聊天,只要在界面最底部的JTextField控件中输入聊天信息,按回车键就可以发送出去了,而那两个JComboBox控件分别用来选择聊天信息的对象和发送聊天信息的表情动作,“悄悄话”复选框用来标识此信息是否转发给非目标对象的其他在线用户。
1.4
收发系统消息
系统信息的收发是单方面的,只能有服务器发给客户端,在服务器主界面输入系统信息,按回车键,系统就会将信息发送到所有客户端,客户端收到信息后就会
- 2 -
网络系统集成课程结业论文(报告)
显示在界面上。如下图
1.5用户下线和通知
用户下线与用户登录一样,要涉及到客户端请求下线和服务器响应请求两个过程
用户单击客户端“下线”按钮,客户端就会向服务器发送下线请求,服务器接收后就胡释放与该用户的相关资源,并向其他用户发送该用户下线通知以及更新在线用户列表,如下图
- 3 -
网络系统集成课程结业论文(报告)
1.6 服务关闭
当服务器关闭服务时,就向所有在线用户发送服务器关闭信息,并且关闭所有与在线用户相连接的输入输出流和套接字,将且将界面调整到最初状态,如图()
客服端接收到服务器的关闭信息时,它将在界面上显示服务器关闭的提示信息,并且关闭与服务相连的输入输出流和套接字,删除在线用户列表,将界面调整到最初状
态,
2.
代码实现
2.1 用户信息链表的实现
用户信息链表类(UserInfoList)需要对实现对用户信息的添加、删除和查询功能。在实现UserInfoList类之前,先定义一个用于描述单个用户信息的数据结构Node类,并定义五个数据成员:用户昵称、套接字、输入流、输出流和Next指针。
public class Node {
String username=null;//用户昵称 Socket socket=null;// 套接字
ObjectOutputStream output=null;//输出流 ObjectInputStream input=null;//输入流
Node next=null;//保存链表中下一个节点的指针 }
在UserInfoList
的构造函数中,对UserInfoList的成员变量进行初始化
public UserInfoList() {root=new Node();
root.next=null;//创建链表的节点 pointer=null; count=0;}
为UserInfoList类添加成员函数add完成用户信息节点的添加功能。 public void add(Node n){
- 4 -
网络系统集成课程结业论文(报告)
pointer=root;//将游标指向根节点
pointer=pointer.next;}//将游标后移 pointer.next=n;//加入节点 n.next=null;
count++;}//计数器加一
while(pointer.next!=null){//判断是否链表尾部
为UserInfoList类添加成员函数del,完成用户信息节点的删除功能。
public void del(Node n){
pointer=root;//将游标指向根节点
while (pointer.next!=null){// 判断是否链表尾部
if (pointer.next==n){//判断当前节点是否为要删除节点
pointer.next=n.next;//删除节点 count--;//计数器减一 break;}
pointer=pointer.next;}}//将游标指向下一节点
为UserInfoList类添加成员函数getCount,提供返回链表中元素个数的功能:
public int getCount()
{
return count;//返回当前链表中元素的个数 }
为UserInfoList类添加成员函数find,完成在用户信息链表中查找指定元素的功能,为方便起见,定义两个find函数,入口参数分别为String和int。
public Node find(String username)
{ }
public Node find(int index) {
if (count==0) { }
if (index<0) {
return null; return null;
if (count==0)return null; pointer=root;
while (pointer.next!=null) { }
return null;
pointer=pointer.next;
if (pointer.username.equalsIgnoreCase(username)) { }
return pointer;
- 5 -
网络系统集成课程结业论文(报告)
}
}
}
pointer=root; int i=0;
while (i if (pointer.next!=null) { } else { } i++; return null; pointer=pointer.next; return pointer; 2.2 服务器主框类架的实现 服务器主框类架类需要实现人机交互功能、启动服务功能 关闭服务功能和发送系统信息功能。需要为工程添加服务器主框类,名命为ServerFrame,在ServerFrame类的构造函数中,完成为服务器控件的添加、控件位置的调整、控件的初始状态的设定及控件事件侦听函数的添加。添加函数init,在其中完成界面的初始化功能,在init函数中,除对事件进行添加和调整外,还对控件添加事件侦听器。如为关闭服务按钮添加侦听器: jbStopServer.addActionListener( ); { } public void actionPerformed(ActionEvent e) { } stopServer(); new ActionListener() 在ServerFrame中添加starrServer函数完成启动服务的功能,添加stopServer函数完成关闭服务的功能,添加sendStopToAll函数依次向所有在线用户发送服务器关闭消息,添加sendSystemMessage函数实现发送系统消息的功能,添加sendMsgToAll函数完成向所有在线用户发送系统消息的功能。 2.3服务器侦听线程类的实现 服务器侦听线程类需要侦听客户端的登录请求,并且为该用户启动专用线程,处理 与此用户相关的操作。首先为工程添加ServerListenThread类,继承其父类Thread,在 - 6 - 网络系统集成课程结业论文(报告) 这个类中实现侦听客户端连接,并响应用户登录的功能。在这个类中最重要的功能是在run函数中实现的,当服务器启动时,就会建立侦听线程,并且调用start函数开始运行线程。 public void run(){//服务器侦听线程的执行体 while (!isStop&&!server.isClosed()) { try { client=new Node();//创建用户信息节点 client.socket=server.accept();//侦听客户端连接 client.output=newObjectOutputStream(client.socket.getOutputStream()); client.output.flush();//得到套接字输入输出流 client.input=newObjectInputStream(client.socket.getInputStream()); } client.username=(String)client.input.readObject(); combobox.addItem(client.username);//读取用户昵称 userInfoList.add(client); textarea.append(\+client.username+\上线\+\);//显示提示信息 textfield.setText(\在线用户\+userInfoList.getCount()+\人\\n\); recvThread=new ServerReceiveThread( textarea, textfield, combobox, client, userInfoList); recvThread.start();//启动线程 } 2.4 服务器接收线程类的实现 服务器接收线程类需要接收客户端发来的信息,并且对该信息进行分析,执行相应操作。当服务器收到客户端发来的聊天信息,对发送对象进行判断,如果发送对象是所有用户,则将信息发给所有用户,同理,如果是特定用户就发给特定用户。当服务器接收到客户端发来的下线请求时,就关闭所有与该用户相关的输入输出流和套接字,并将该用户从在线列表中删除,此外,还需向所有在线用户发送该用户下线的通知和重发最新的列表。 首先为工程添加新类,命名为ServerReceiveThread,实现接收客户端信息的功能。方法和侦听线程差不多。它的成员函数sendToAll实现向所有在线用户转发聊天信息的功能 ,另一个成员函数sendUserList实现向所有在线用户发送用户列表的功能。 public void sendToAll(String msg) { int count=userInfoList.getCount(); int i=0; while(i - 7 - 网络系统集成课程结业论文(报告) } Node node=userInfoList.find(i); if(node==null) {i++; } try { node.output.writeObject(\聊天信息\); node.output.flush(); node.output.writeObject(msg); node.output.flush(); continue; 2.5 客户端主框类的实现 客户端主框架类实现了人机交互、用户登录、用户下线和聊天信息的发送功能。 客户端的主框架类为ClientFrame,其构造函数完成为客户端控件的添加、控件位置的调整、控件初始状态的设定以及控件事件侦听函数的添加。成员函数LogIn完成用户登录功能,LogOut完成用户下线功能,SendMessage用于发送聊天信息。 public void SendMessage() { String toSomebody=combobox.getSelectedItem().toString(); String status=\; if(checkbox.isSelected()) { status=\悄悄话\; } String action=actionlist.getSelectedItem().toString(); String message=textfield.getText(); if(socket.isClosed()) { } try { output.writeObject(\聊天信息\);//发送聊天信息标识 output.flush(); output.writeObject(toSomebody);//发送聊天对象 output.flush(); output.writeObject(status);//发送聊天状态 output.flush(); output.writeObject(action);//发送聊天表情 output.flush(); output.writeObject(message);//发送聊天信息内容 return; output.flush(); - 8 - 网络系统集成课程结业论文(报告) 2.6 客户端接收线程类的实现 客户端接收线程类需要接收服务器发来的信息,并对该信息进行分析,执行相应的 操作。客户端收到的服务器信息有三种——聊天信息和系统信息、用户列表信息、服务关闭信息。客户端将接收到聊天信息和系统信息显示在界面上,接收到用户信息就对信息进行分析,获取在线用户列表,显示在界面组合框中,接收到关闭信息,则执行关闭操作。 命名客户端接收线程类为ClientReceiveThread,实现接收服务器信息的功能,主要在run函数中实现该类的功能。 public void run()//线程执行体 {sendUserList(); while(!isStop&&!client.socket.isClosed())//若套接字没有关闭,则一直执行循环体 { try{ String type=( String)client.input.readObject();//读取服务器发送的聊天信息 if(type.equalsIgnoreCase(\聊天信息\)) { //处理聊天信息 String toSomebody=( String)client.input.readObject();//获取系统信息内容 String status=( String)client.input.readObject(); String action=( String)client.input.readObject(); String message=( String)client.input.readObject(); String msg=client.username+action+\对\+toSomebody+ \说\+message+\;//显示信息 3 附:源程序 - 9 - 附 录 参考文献 【Java语言与面向对象程序设计】 【Java编程案例解析】 【计算机网络通信教程】 附 录 - 10 - 附 录 (宋体小四号,1.25倍行距)(要求:附录的有无根据情况需要而定,内容一般包括正文内不便列出的冗长公式推导、符号说明(含缩写)、计算机程序、图纸、表格等。附录中有程序源代码的因篇幅限制可酌情考虑内容的字号。) //用户信息链表类 import java.net.*; import java.io.*; public class Node { } import javax.swing.*; import java.net.*; import java.io.*; public class UserInfoList { Node root; Node pointer; int count; public UserInfoList() { } root=new Node(); root.next=null; pointer=null; count=0; String username=null; Socket socket=null; ObjectOutputStream output=null; ObjectInputStream input=null; Node next=null; public void add(Node n) - 11 - { pointer=root; 附 录 } public int getCount() { } public Node find(String username) { if (count==0)return null; pointer=root; while (pointer.next!=null) { pointer=pointer.next; if (pointer.username.equalsIgnoreCase(username)) { - 12 - return count; while (pointer.next!=null) { } if (pointer.next==n) { } pointer=pointer.next; pointer.next=n.next; count--; break; while(pointer.next!=null) } public void del(Node n) { pointer=root; { pointer=pointer.next; } pointer.next=n; n.next=null; count++; 附 录 } //服务端主框架类 import java.awt.*; import java.awt.event.*; - 13 - } pointer=root; int i=0; while (i if (pointer.next!=null) { } else { } i++; return null; pointer=pointer.next; } public Node find(int index) { if (count==0) { } if (index<0) { return null; return null; } return null; } return pointer; return pointer; } 附 录 import javax.swing.*; import javax.swing.event.*; import javax.swing.border.*; import java.io.*; import java.net.*; public class ServerFrame extends JFrame { public ServerFrame() { } public void init()//初始化 { Border super(\服务端\init(); setSize(370,570); show(); private JButton jbStartServer; private JButton jbStopServer; private JButton b1; private JScrollPane js; private Border border; private ServerSocket serverSocket; private JComboBox combobox; private JTextArea textarea; private JTextField textfield; private JTextField systemMsg; private UserInfoList userInfoList; private ServerListenThread listenThread; bevelBorder=BorderFactory.createBevelBorder(BevelBorder.RAISED,Color.white, Color.white,Color.white,Color.white); Border emptyBorder=BorderFactory.createEmptyBorder(1,1,1,1); border=BorderFactory.createCompoundBorder(bevelBorder,emptyBorder); jbStartServer=new JButton(\启动\jbStopServer=new JButton(\关闭\ - 14 - 附 录 systemMsg.addActionListener( new ActionListener() - 15 - systemMsg=new JTextField(40); systemMsg.setEnabled(false); textfield=new JTextField(40); textfield.setEditable(false); textarea=new JTextArea(20,20); textarea.setEditable(false); js=new JScrollPane(textarea); b1=new JButton(\发送\jbStopServer.setEnabled(false); jbStartServer.addActionListener( { } ); jbStopServer.addActionListener( { } ); combobox=new JComboBox(); combobox.insertItemAt(\所有人\combobox.setSelectedIndex(0); public void actionPerformed(ActionEvent e) { } stopServer(); new ActionListener() public void actionPerformed(ActionEvent e) { } startServer(); new ActionListener() 附 录 c.add(b1,null); c.add(jbStartServer,null); c.add(jbStopServer,null); c.add(textfield,null); c.add(js,null); c.add(combobox,null); - 16 - textfield.setBounds(30,75,100,20); js.setBounds(30,110,300,300); combobox.setBounds(30,425,90,30); systemMsg.setBounds(30,470,200,50); b1.setBounds(250,470,60,50); { } ); this.addWindowListener( { } ); Container c=getContentPane(); c.setLayout(null); jbStartServer.setBorder(border); jbStartServer.setBounds(30,30,90,30); jbStopServer.setBorder(border); jbStopServer.setBounds(150,30,90,30); public void windowClosing(WindowEvent e) { } stopServer(); System.exit(0); new WindowAdapter() public void actionPerformed(ActionEvent e) { } sendSystemMessage(); 附 录 } public void startServer()//启动服务 { } public void stopServer()//实现关闭服务功能 { try { sendStopToAll();//向所有在线用户发送关闭信息 listenThread.isStop=true; serverSocket.close(); int count=userInfoList.getCount(); - 17 - try { } catch (Exception e) { } userInfoList=new UserInfoList(); listenThread=new ServerListenThread(serverSocket, combobox, textarea, textfield, userInfoList); serverSocket=new ServerSocket(8000,10); textarea.append(\服务在8000端口启动...\\n\ jbStartServer.setEnabled(false); jbStopServer.setEnabled(true); systemMsg.setEnabled(true); c.add(systemMsg,null); listenThread.start(); 附 录 } public void sendStopToAll()//向所有在线用户发送服务关闭消息 { int count =userInfoList.getCount(); int i=0; while (i Node node=userInfoList.find(i); if(node==null) { } try - 18 - i++; continue; int i=0; while (i jbStartServer.setEnabled(true); jbStopServer.setEnabled(false); systemMsg.setEnabled(false); Node node=userInfoList.find(i); node.input.close(); node.output.close(); node.socket.close(); i++; combobox.removeAllItems(); combobox.addItem(\所有人\} catch(Exception e) { } 附 录 } public void sendSystemMessage()//实现发送系统消息功能 { } - 19 - String toSomebody=combobox.getSelectedItem().toString(); String message=systemMsg.getText(); if (toSomebody.equalsIgnoreCase(\所有人\{ } else { } Node node=userInfoList.find(toSomebody); try { } catch (Exception e) { } node.output.writeObject(\系统信息\node.output.flush(); node.output.writeObject(message+\node.output.flush(); sendMsgToAll(message+\ } { } catch(Exception e) { } i++; node.output.writeObject(\服务关闭\node.output.flush(); 附 录 public void sendMsgToAll(String msg) { } } //服务器侦听线程类 import java.awt.*; - 20 - public static void main(String args[]) { } new ServerFrame(); int count=userInfoList.getCount(); int i=0; while (i Node node=userInfoList.find(i); if (node==null) { } try { } catch (Exception e) { } i++; node.output.writeObject(\系统信息\node.output.flush(); node.output.writeObject(msg); node.output.flush(); i++; continue; 附 录 import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import java.io.*; import java.net.*; public class ServerListenThread extends Thread { ServerSocket server; JComboBox combobox; JTextArea textarea; JTextField textfield; UserInfoList userInfoList; Node client; ServerReceiveThread recvThread; public boolean isStop; public ServerListenThread( { } - 21 - this.server=server; this.combobox=combobox; this.textarea=textarea; this.textfield=textfield; this.userInfoList=userInfoList; isStop=false; ServerSocket server, JComboBox combobox, JTextArea textarea, JTextField textfield, UserInfoList userInfoList ) 附 录 public void run() { while (!isStop&&!server.isClosed()) { try { client=new Node(); client.socket=server.accept(); client.output=new ObjectOutputStream(client.socket.getOutputStream()); client.output.flush(); client.input=new ObjectInputStream(client.socket.getInputStream()); } } } } catch(Exception e) { } client.username=(String)client.input.readObject(); combobox.addItem(client.username); userInfoList.add(client); textarea.append(\上线\ textfield.setText(\在线用户\人\\n\recvThread=new ServerReceiveThread( textarea, textfield, combobox, client, userInfoList); recvThread.start(); //服务器接收线程类 - 22 - 附 录 } } } //客户端主框架类 import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.border.*; import java.io.*; import java.net.*; public class ClientFrame extends JFrame { private JComboBox combobox; private JTextArea textarea; private JTextField textfield; private JCheckBox checkbox; private JComboBox actionlist; private JButton login; private JButton logout; private Border border; private JTextField seperater; private JScrollPane js; private JButton b1; } catch(Exception e) { } i++; node.output.flush(); Socket socket; ObjectOutputStream output; ObjectInputStream input; ClientReceiveThread recvThread; - 28 - 附 录 public ClientFrame() { super(\客户端\ Border bevelBorder=BorderFactory.createBevelBorder(BevelBorder.RAISED, Color.white,Color.white,Color.white,Color.white); Border emptyBorder=BorderFactory.createEmptyBorder(1,1,1,1); border=BorderFactory.createCompoundBorder(bevelBorder,emptyBorder); login=new JButton(\上线\logout=new JButton(\下线\b1=new JButton(\发送\logout.setEnabled(false); combobox=new JComboBox(); combobox.addItem(\所有人\combobox.setSelectedIndex(0); textarea=new JTextArea(20,20); textarea.setEditable(false); js=new JScrollPane(textarea); textfield=new JTextField(\请先输入你的昵称,再上线\ seperater= new JTextField(\seperater.setEditable(false); checkbox=new JCheckBox(\悄悄话\checkbox.setSelected(false); actionlist=new JComboBox(); actionlist.addItem(\微笑地\actionlist.addItem(\生气地\actionlist.addItem(\小心地\actionlist.setSelectedIndex(0); - 29 - 附 录 login.setBorder(border); login.setBounds(30,30,90,30); logout.setBorder(border); logout.setBounds(150,30,90,30); //seperater.setBounds(30, 75, 300, 20); js.setBounds(30,110,300,300); combobox.setBounds(30,425,90,30); actionlist.setBounds(150,425,90,30); checkbox.setBounds(270,425,90,30); textfield.setBounds(30,470,200,50); b1.setBounds(250,470,60,50); Container c =getContentPane(); c.setLayout(null); c.add(b1,null); c.add(login,null); c.add(logout,null); //c.add(seperater,null); c.add(js,null); c.add(combobox,null); c.add(actionlist,null); c.add(checkbox,null); c.add(textfield,null); login.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { LogIn(); } }); - 30 - 附 录 logout.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { LogOut(); } }); b1.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { } SendMessage(); }); textfield.addActionListener( this.addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { } LogOut(); System.exit(0); new ActionListener() { public void actionPerformed(ActionEvent e) { } SendMessage(); }); }); setSize(370,570); show(); - 31 - 附 录 } public void LogIn() { try { socket=new Socket(\注意服务器IP output=new ObjectOutputStream(socket.getOutputStream()); output.flush(); input=new ObjectInputStream(socket.getInputStream()); output.writeObject(textfield.getText()); output.flush(); recvThread=new ClientReceiveThread(socket,output,input,combobox,textarea); recvThread.start(); login.setEnabled(false); logout.setEnabled(true); textfield.setText(\请输入聊天信息!\ } catch(Exception e) { } } public void LogOut() { login.setEnabled(true); logout.setEnabled(false); textfield.setText(\请输入你的昵称!\ if(socket.isClosed()) - 32 - 附 录 } public void SendMessage() { String toSomebody=combobox.getSelectedItem().toString(); String status=\ if(checkbox.isSelected()) { } String action=actionlist.getSelectedItem().toString(); String message=textfield.getText(); if(socket.isClosed()) { } try - 33 - return; status=\悄悄话\{ } try { } catch(Exception e) { } output.writeObject(\用户下线\output.flush(); input.close(); output.close(); socket.close(); return; 附 录 } } //客户端接收线程类 import javax.swing.*; import java.io.*; import java.net.*; public class ClientReceiveThread extends Thread { private JComboBox combobox; private JTextArea textarea; Socket socket; ObjectOutputStream output; ObjectInputStream input; - 34 - { } new ClientFrame(); public static void main(String args[]) { } catch(Exception e) { } output.writeObject(\聊天信息\output.flush(); output.writeObject(toSomebody); output.flush(); output.writeObject(status); output.flush(); output.writeObject(action); output.flush(); output.writeObject(message); output.flush(); 附 录 public ClientReceiveThread( { } public void run() { while(!socket.isClosed()) { try { String type=(String)input.readObject(); if (type.equalsIgnoreCase(\系统信息\{ } else if(type.equalsIgnoreCase(\服务关闭\{ output.close(); input.close(); socket.close(); textarea.append(\服务器已关闭!\\n\ - 35 - String sysmsg=(String)input.readObject(); textarea.append(\系统信息:\ this.socket=socket; this.output=output; this.input=input; this.combobox=combobox; this.textarea=textarea; Socket socket, ObjectOutputStream output, ObjectInputStream input, JComboBox combobox, JTextArea textarea) 附 录 } break; } } } else if (type.equalsIgnoreCase(\聊天信息\ { String message=(String)input.readObject(); textarea.append(message+\ } else if (type.equalsIgnoreCase(\用户列表\ { String userlist=(String)input.readObject(); String username[]=userlist.split(\ combobox.removeAllItems(); int i=0; combobox.addItem(\所有人\ while(i } combobox.setSelectedIndex(0); } } catch(Exception e) { } - 36 -
正在阅读:
《计算机网络通信》课程设计报告01-18
福建省漳州东山县金融机构短期贷款余额情况3年数据洞察报告202004-25
VB期末参考代码 大题01-16
叫醒沉睡的自己作文700字06-28
生活需要宽容作文600字07-05
小提琴考试作文500字06-26
二级精神病医院基本标准03-08
全国高等教育自学考试模拟试题《管理学原理》(共五套)05-16
信号与系统复习题03-12
开学第一天日记5篇11-20
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 网络通信
- 课程
- 计算机
- 报告
- 设计
- 第3章 8086寻址方式和指令系统-题
- 附中国农业银行广东省分行自助设备集中加配钞业务管理办法(试行)
- Photoshop平面设计预赛试题 - 图文
- 第一节初级钳工专业基础知识
- 宽带接入(FTTH)光缆线路工程施工组织方案
- 日本电影追捕中文台词
- 化学式与化合价教学设计
- 关于移风易俗推进婚事简办工作的实施方案
- 土木工程(结构)毕业设计计算书
- PN结太阳能电池光生伏特效应光谱特性及太阳能电池综合参数测试 - 图文
- 关于加强产业园区领导班子和干部队伍建设的方案
- 粤语对照大全 比D常用广州话你睇下
- 二年级数学下册家庭作业(2014人教版) - 图文
- 万丽芬作文教学设计《介绍自己喜欢的食品》
- 江苏省2016知识产权工程师培训网上自测试卷A卷 86分
- 2018年继续教育工程项目资源节约利用分析评价方法试卷98分
- 关于夜间加班员工供应晚餐夜宵的管理办法
- 金融公司管理制度大全
- 高级财务会计外币习题及答案
- 交通信号灯施工方案