《计算机网络通信》课程设计报告

更新时间: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 -

本文来源:https://www.bwwdw.com/article/795o.html

Top