计算机网络TCP聊天室实验报告

合集下载

计算机网络课程设计实验报告

计算机网络课程设计实验报告

计算机网络课程设计实验报告一、实验项目:网络聊天程序二、实验要求:利用Winsock控件,采用TCP或UDP方式实现一个网络聊天程序。

具体要求如下:(1)能够实现一个聊天服务器(采用TCP方式时可同时允许15个用户连接),并在用户之间相互进行信息发送。

(2)具有聊天记录功能。

(3)制作一个客户端程序。

在课程设计报告中要求给出程序设计的思想、关键程序说明以及服务器和客户程序运行界面的屏幕截图。

三、实验程序功能:采用TCP方式实现的网络聊天程序:(1)以某一用户名注册进入聊天室,自动判断是否与现有聊天室人员重名,给出相关信息。

进入后启动线程,获得现有聊天室人员的列表信息;(2)点击[送出]按钮,向所有人发送信息。

双击列表中某人的名字,在弹出的窗口中可以写悄悄话,悄悄话内容只显示在这个人的屏幕上;(3)点击[刷新谈话区],可以清空聊天信息屏幕。

点击[刷新聊天者列表]可以重新从服务器读取聊天室人员列表信息;(4)点击[退出聊天室],向所有人发送离开信息,同时刷新聊天室人员列表;(5)服务器端程序先行运行,服务器读取来自客户端的信息流请求,并把相应处理结果返回客户端,完成与客户端的通信。

(6)点击[聊天记录],可以查看聊天室的聊天记录。

四、设计与分析:客户端聊天室客户/服务器通信图(《》表示信息流方向):五、设计思想:传输层协议有两种:TCP和UDP,TCP是可靠传输,它把信息包捆绑,在必要的时候,排序和重传这些信息包以获得可靠的数据传输。

UDP支持快速的、无连接的、不可靠的信息包传输。

在JAVA中,使用TCP传输,其套接字的封装函数分TCP/IP客户套接字和TCP/IP服务器套接字。

本程序使用TCP做,采用了JA V A中的流式Socket 的通信机制,流式Socket 通信过程如下图:客户套接字函数:Socket(String hostname,itn port)或Socket(InetAddress ipAddress,int port)服务端套接字函数:ServerSocket(int port)ServerSocket(int port,int maxQueue)ServerSocket(int port,int maxQueue,InetAddress localAddress)六、文件说明:文件清单:(1)客户端线程主类:chatappletthreepublic class chatserverthree implements Runnable{/*聊天室服务器端处理主类*///服务器构造初始化线程public chatserverthree(){}//服务器main()初始化public static void main(String args[]){}//服务器线程connect操作run方法public void run(){}//向聊天室所有人员发送普通话语信息public void broadcast(String msg){}//处理悄悄话,向特定人员发送悄悄话public void broadcast1(String msg){}//客户端线程类firstthreadclass firstthread extends Thread{}//firstthread 初始化线程public firstthread(chatserverthree server,Socket client){}//监听运行线程public void run(){while(true){line=in.readUTF();//line 读取来自客户端线路的信息//线路信息前端为PEOPLE表明有新人进入了聊天室if(line.startsWith("PEOPLE")){}//线路信息前端为QUIT表明有人离开了聊天室else if(line.startsWith("QUIT")){}//线路前端为MSG表明接收到的是普通聊天话语信息e lse if(line.startsWith("MSG")) {}//线路前端为“悄悄的对”表明接收到的是悄悄话else if(line.startsWith("悄悄地对")){}//线路前端为newlist表明得到客户端刷新列表的请求else if(line.startsWith("newlist")){}}}(2) 聊天室界面AWT面板类:Apanel:/*聊天室界面北部面板Apanel类*/class Apanel extends Panel //用于构造面板{}Bpanel:/*聊天室界面中部面板Bpanel类*/class Bpanel extends Panel{}Cpanel:/*聊天室界面南部面板Cpanel类*/class Cpanel extends Panel{}(3) 发送悄悄话弹出式窗口类:Mywindow:class Mywindow extends Frame implements ActionListener{//构造方法初始化画出弹出式窗口界面Mywindow(){}//处理按钮事件的方法public void actionPerformed(ActionEvent e){}}(4)服务器端线程类:Chatserverthree:/*聊天室主类chatappletthree类*/public class chatappletthree extends Applet implements Runnable,ActionListener,ItemListener {//Applet 启动初始化画出聊天室界面,建立与服务器连接public void init() {}//启动线程public void start(){}//终止线程public void stop() {}//关闭监听端口,断开连接public void destroy() {}//客户端启动线程public void run() {}}(4)服务器为每一个客户端启动的线程类Firstthread//客户端线程类firstthreadclass firstthread extends Thread{protected Socket client;//listen读取来自客户端的消息:name 格式为:PEOPLE+名字+[性别]String line,name;protected DataOutputStream firstout,out; //定义网络数据输出流protected chatserverthree server;protected DataInputStream in; //定义网络数据输入流//firstthread 初始化线程public firstthread(chatserverthree server,Socket client){this.server=server;this.client=client;。

网上聊天 实验报告

网上聊天 实验报告

C/S网络聊天室程序----实验报告信科03(1)班楼欢庆I03630117 聊天室程序的设计说明1.实现思想在Internet上的聊天室程序一般都是以服务器提供服务端连接响应,使用者通过客户端程序登录到服务器,就可以与登录在同一服务器上的用户交谈,这是一个面向连接的通信过程。

因此,程序要在TCP/IP环境下,实现服务器端和客户端两部分程序。

实现语言C++,开发环境VC/MFC。

2.功能模块总纲2.1服务器端工作流程服务器端通过socket()系统调用创建一个Sock et数组后(即设定了接受连接客户的最大数目),与指定的本地端口绑定bind(),就可以在端口进行侦听listen()。

如果有客户端连接请求,则在数组中选择一个空Socket,将客户端地址赋给这个Socket。

然后登录成功的客户就可以在服务器上聊天了。

实现方式采用异步非阻塞机制。

2.2客户端工作流程客户端程序相对简单,只需要建立一个Socket 与服务器端连接,成功后通过这个Socket来发送和接收数据就可以了。

2.3 C/S实现过程服务器端:<1>首先使用WSAStartup函数来初始化网络环境。

<2>调用socket(AF_INET,SOCK_STREAM,0)函数来创建一个套接字。

<3>调用bind函数将本地地址与刚建立的套接字关联起来。

<4>调用listen函数监听发向该套接字的连接请求。

<5>客户端的连接请求放在连接请求队列里,服务器调用accept函数从连接请求队列中取出第一个请求,创建一个为之服务的新的套接字,该套接字处理所有与该客户交互操作的信息。

而服务器进程的监听套接字这时继续处理来自其他客户的连接请求,直到因队列空而等待新的连接请求的到来。

<6>调用closesocket()关闭监听套接字,释放套接字资源。

<7>调用WSACleanup函数释放相应资源。

(完整word版)网络编程_基于TCP的简易聊天室_实验报告

(完整word版)网络编程_基于TCP的简易聊天室_实验报告

网络编程课程设计说明书题目名称:基于TCP/IP的网络文字聊天程序设计专业:网络工程班级:1201班学号:1220140105姓名:蒋星指导老师:陈利平完成日期:2014年12月13日目录一、实验基本信息概要31. 题目要求32. 题目内容33. 开发环境3二、流程图4三、系统简介51.界面52. 软件功能53. 系统设计94. 优点与缺点9四、系统详细设计111. ChatServer类 112. ChatClient 类133. SocketException类155. 命令协议156. 消息格式16五、系统测试161. 服务器使用错误162. 客户端使用错误173. 启动服务器174. 启动客户端175. 关闭客户端176. 启动服务器错误提示187. 公开聊天188. 私聊189. 错误的私聊1910. 更名2011. 帮助2012. 非法指令2013. 非法的指令参数2014. 连接服务器失败21六、心得体会21七、完整代码21Charserverd.cpp 服务器main函数文件21ChatServer.h 服务器类头文件22ChatServer.cpp 服务器类23ClientInfo.h 客户信息类33Charclientd.cpp 客户端main函数34ChatClient.h 客户端头文件 34ChatClient.cpp 客户端类35InitSock.cpp 初始化WINSOCK类41SockException.h 异常类41八、[参考文献] 42一、实验基本信息概要1. 题目要求1、开发平台Visual C++ 6.0。

2、对设计方法的要求使用Visual C++ 6.0开发出在Windows控制台或图形界面下运行的程序。

3、对设计内容的要求①实现网络文字聊天程序的服务器端。

②实现网络文字聊天程序的客户端。

③主程序的结构和流程。

④程序运行过程的截图。

⑤网络文字聊天程序的实现原理。

TCP聊天系统实验报告

TCP聊天系统实验报告

信息管理系《计算机网络》课程设计报告学生姓名:王法芝,王敏学号:***************222009602063010 专业班级:2009级信管1班成绩:指导教师:***二0一一年11 月 6 日目录一、背景分析: (3)二、需求分析: (3)三、开发流程: (5)四、具体实现过程: (5)一、客户端发送消息不能为空。

(5)二、在消息后面加上了发送消息的时间 (5)四、添加用户表情: (6)五、系统结构: (6)四、界面: (9)1、最初界面为: (9)2、聊天时的界面为: (9)六、程序的不足之处(尚未实现之处): (10)七、总结: (10)八、参考文献: (10)开发报告一、背景分析:本次实验基于VC++6.0平台,应用MFC和SOCKET编程技术,实现聊天室(chat server and client)的功能添加和功能实现。

关于WinSocket和MFC的一点理解和体会:Socket接口是网络编程(通常是TCP/IP协议,也可以是其他协议)的API。

WinSock以DLL的形式提供。

WinSock也是一个基于Socket模型的API,在Microsoft Windows操作系统类中使用。

Socket是网络通信过程中端点的抽象表示。

Socket在实现中以句柄的形式被创建,包含了进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

要使用socket,首先必须创建一个socket;然后,按要求配置socket;接着,按要求通过socket接收和发送数据;最后,程序关闭此socket。

实现Windows Sockets应用程序在网上的数据通信,必须在Windows 9x/NT 控制面板中的网络配置项里,添加TCP/IP协议,同时给定相应的IP地址,这些IP地址在所建的局域网中,不能有重复,一般要采用C类地址。

Windows 9x/NT带有协议。

tcp实验报告

tcp实验报告

tcp实验报告TCP实验报告一、实验目的TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议,它在互联网通信中扮演着重要的角色。

本实验旨在通过实际操作和观察,深入理解TCP协议的工作原理和特点。

二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.93. 实验工具:Wireshark三、实验步骤与结果1. 建立TCP连接通过Python的socket库,我们可以轻松地创建TCP连接。

在本实验中,我们编写了一个简单的服务器端和客户端程序,通过本地主机进行通信。

2. 数据传输与流量控制在TCP连接建立后,我们进行了数据的传输实验。

首先,我们发送了一个较小的数据包,观察到数据包的传输过程中,TCP协议会自动进行流量控制,确保数据的可靠传输。

接着,我们发送了一个较大的数据包,发现TCP会将大数据包拆分成多个小数据包进行传输,并在接收端进行重组。

3. 拥塞控制为了模拟网络拥塞的情况,我们在实验中人为地降低了网络带宽。

通过Wireshark抓包分析,我们观察到TCP协议在发现网络拥塞时,会自动减少发送速率,以避免网络的过载。

同时,我们还注意到TCP协议会根据网络的状况动态调整拥塞窗口的大小,以提高网络的利用率。

4. 可靠性与重传机制为了测试TCP协议的可靠性,我们在实验中故意模拟了数据包丢失的情况。

通过Wireshark的分析,我们发现当发送端未收到确认消息时,会自动触发重传机制,确保数据的可靠传输。

同时,TCP还会根据超时时间的动态调整,以适应不同网络环境下的传输速度。

五、实验总结通过本次实验,我们深入了解了TCP协议的工作原理和特点。

TCP作为一种可靠的传输协议,在互联网通信中发挥着重要的作用。

它通过流量控制、拥塞控制和重传机制等手段,确保了数据的可靠传输,并适应了不同网络环境的变化。

在今后的学习和实践中,我们将进一步深入研究TCP协议的细节,并结合实际应用场景,优化网络通信的性能和可靠性。

计算机网络实验TCP实验报告

计算机网络实验TCP实验报告

计算机网络实验TCP实验报告大连民族学院计算机科学与工程学院实验报告实验题目:TCP协议分析课程名称:计算机网络实验类型:□演示性√验证性□操作性□设计性□综合性专业:软件工程班级:084 学生姓名:葛玲钰学号:2008082405 实验日期:2010年12月4日实验地点:实验学时:实验成绩:指导教师签字:年月日实验题目:TCP协议分析1.向gaia.cs.umass.esu服务器传送文件的客户端主机的IP地址是10.200.253.26,TCP端口号为:4277。

2.Gaia.cs.umass.esu服务器的IP地址是:10.200.253.11,TCP端口号是:445。

3.客户服务器之间用于初始化TCP连接的TCP SYN报文段是用:seq=0 ,[SYN]来表示该报文段是SYN报文段的。

4.服务器向客户端发送的SYNACK报文段序号是:0,该报文段中,ACKNOWLEDMENT字段的值是:1,Gaia.cs.umass.esu服务器由主机向服务器发送的上一条请求中的seq的值加上发送的数据长度来决定此值,是用[SNY,ACK]来标示该报文段是SYNACK报文段的.5.包含HTTP POST命令的TCP报文段的序号是:152652//6.如果将包含HTTP POST令的TCP报文段看作是TCP连接上的第一个报文段,那么该TCP连接上的第六个报文段的序号是14253.7.前六个 TCP报文段的长度各是:1,1,137,89,106,265//8.在整个跟踪过程中,接收端公示的最小的可用缓存空间是5840.缓存仍然不够用。

9.在跟踪文件中有重传的报文段。

判断依据为:发送端实体在合理的往返时延(RTT)内未收到确认。

tcp实验总结

tcp实验总结

tcp实验总结摘要:1.TCP协议简介2.TCP实验目的与过程3.TCP实验结果与分析4.TCP协议的优点与不足5.总结与建议正文:一、TCP协议简介TCP(Transmission Control Protocol,传输控制协议)是一种面向连接、可靠、基于字节流的传输层通信协议。

它与IP协议共同构成了TCP/IP协议族,是互联网中最常用的协议之一。

TCP协议通过三次握手建立连接,保证数据传输的可靠性,具有错误检测和纠正功能。

二、TCP实验目的与过程本次TCP实验旨在通过实际操作,了解TCP协议的工作原理,掌握TCP 连接的建立、数据传输和断开过程,以及分析TCP协议在实际应用中的性能表现。

实验过程如下:1.搭建TCP服务器和客户端2.实现TCP客户端与服务器的通信3.观察TCP连接的建立与断开4.分析TCP协议的传输性能三、TCP实验结果与分析实验结果显示,TCP协议能够实现可靠的数据传输。

通过对TCP连接的建立、数据传输和断开过程的观察,发现TCP协议具有以下特点:1.TCP连接建立:通过三次握手,客户端与服务器确认对方的存在,并为后续数据传输做好准备。

2.数据传输:TCP协议采用字节流的方式发送数据,保证了数据的顺序和完整性。

3.TCP断开:通过四次挥手,双方确认对方已接收完毕数据,并依次关闭连接。

四、TCP协议的优点与不足优点:1.面向连接,确保数据传输的可靠性2.错误检测和纠正功能,保证数据完整性3.流量控制与拥塞控制,提高网络资源利用率不足:1.相对复杂的实现,占用较多资源2.传输延迟较高,不适合实时应用3.依赖IP协议,不能单独使用五、总结与建议通过TCP实验,我们对TCP协议有了更深入的了解。

在实际应用中,应根据需求选择合适的协议,充分发挥TCP协议的优点,避免其不足。

设计聊天室实验报告

设计聊天室实验报告
strcat( str, name);
write( sockfd, str, strlen( str));
fcntl( 0, F_SETFL, O_NONBLOCK);
while ( 1) {
if ( (status = read( sockfd, str, MAX_LINE))>=0 )
{
if ( status == 0) exit(0);
sizeof( serv_addr))<0) {
printf( "client:can`t connect to server\n");
fflush( stdout);
return( 0);
}
return( sockfd);
}
运行结果:
服务器端运行结果,显示端口号并处于等待连接状态:
群聊功能,四个客户端代表四个用户,通过服务器的转发实现通信。
#include<>
#include<>
#include <>
#include <netinet/>
#include <>
#include <>
#include <>
#define MAX_LINE 500
#define MAX_NAME 100
int init_cli();
#ifndef __SELECT__
实验内容
(1)编写聊天室的客户端和服务器端,客户端主要功能是发送信息,服务器端的主要功能是将客户端发的内容转发到除发送端以外的所有客户端,实现客户端和客户端的通信。
(2)编写基于原始套接字的网络通信原型系统;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机网络原理实验报告书姓名:XXX班级:XXXXXX学号:XXXXXXXXXXXXXXXXXXXXXX二0一一年五月socket编程一、实验目的本次实验的目的是通过利用Socket编写简单的客户/服务器程序,了解TCP/IP网络的基本通信原理和编程方法,初步掌握TCP/IP网络的传输层上的编程接口(Windows Sockets API),学会利用这些接口来编写简单的网络通信软件。

二、实验内容利用socket编写简单的客户/服务器程序,比如聊天室、文件传输等。

三、实验步骤思路分析✧将服务器与客户端分两部分实现,采用多线程实现多个客户端与服务器端连接✧客户端建立一个Socket与服务器端连接,成功后通过这个Socket来发送和接收数据就可以了。

✧服务器端通过创建一个Socket的Arraylist数组,与指定的本地端口绑定,就可以在端口进行侦听。

如果有客户端连接请求,则在数组中选择一个空Socket,将客户端地址赋给这个Socket。

然后登录成功的客户就可以在服务器上聊天了。

代码实现p ackage TCP_chat_room.gui;i mport java.io.IOException;p ublic class ClientApp {public static void main(String[] args) {/*** javax.swing.UIManager$LookAndFeelInfo[Metal javax.swing.plaf.metal.MetalLookAndFeel]javax.swing.UIManager$LookAndFeelInfo[Nimbus com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel]javax.swing.UIManager$LookAndFeelInfo[CDE/Motif com.sun.java.swing.plaf.motif.MotifLookAndFeel]javax.swing.UIManager$LookAndFeelInfo[Windows com.sun.java.swing.plaf.windows.WindowsLookAndFeel] javax.swing.UIManager$LookAndFeelInfo[Windows Classiccom.sun.java.swing.plaf.windows.WindowsClassicLookAn dFeel]* @author Administrator**/try {// 使用Nimbus皮肤UIManager.setLookAndFeel("com.sun.java.swing.plaf.ni mbus.NimbusLookAndFeel");// localhost 或127.0.0.1ClientFrame frClientFrame = newClientFrame("localhost",Server.CHAT_ROOM_PORT); frClientFrame.setConnected(true);frClientFrame.setVisible(true);// 如果登录成功if(frClientFrame.login("222")){frClientFrame.receiveMessage();}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (UnsupportedLookAndFeelException e) { e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}package TCP_chat_room.action;import java.awt.AWTException;public class ClientFrameAction extends WindowAdapter{ private ClientFrame frClientFrame;public ClientFrameAction(ClientFrame frClientFrame){ this.frClientFrame = frClientFrame;}public void windowIconified(WindowEvent e) {if(SystemTray.isSupported()){final SystemTray system =SystemTray.getSystemTray();Image image = ImageManager.getImage("piScreen.gif");final String toolTip = new String("大家聊天室");final PopupMenu popup = new PopupMenu();final MenuItem miRevert = new MenuItem("Restore");final MenuItem miAddFriends = new MenuItem("AddFriends");final MenuItem miRemoveFriends = new MenuItem("Remove Friends");final MenuItem miModifyFriendsInfo = new MenuItem("Modify Friends Infomation");final MenuItem miSearch = new MenuItem("Search Friends");final MenuItem miExit = new MenuItem("Exit");popup.add(miRevert);popup.addSeparator();popup.add(miAddFriends);popup.add(miRemoveFriends);popup.add(miModifyFriendsInfo);popup.add(miSearch);popup.addSeparator();popup.add(miExit);final TrayIcon icon = newTrayIcon(image,toolTip,popup);try {system.add(icon);frClientFrame.setVisible(false);} catch (AWTException e1) {System.out.print("软件在系统通知区域显示出错");e1.printStackTrace();}miRevert.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { system.remove(icon);frClientFrame.setVisible(true);frClientFrame.setState(JFrame.NORMAL);}});miAddFriends.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) { frClientFrame.setVisible(true);frClientFrame.setState(JFrame.NORMAL);}});miExit.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {windowClosing(null);}});// 不知何用icon.addActionListener(miRevert.getActionListeners()[0]);}}public void windowClosing(WindowEvent e) {int result = MessageBox.showConfirmMessage("您确定要退出聊天系统吗?");if(result == JOptionPane.YES_OPTION){frClientFrame.disconnect();frClientFrame.setVisible(false);frClientFrame.dispose();// System.exit(0);}else{// do nothing}}}package TCP_chat_room.gui;import java.awt.Color;public class ClientFrame extends JFrame { private boolean connected = false;private int port;private String host;private Socket s;private DataInputStream dis;private DataOutputStream dos;public DataInputStream getDis() {return dis;}public DataOutputStream getDos() {return dos;}private final JPanel panel = new JPanel();private final JPanel pnlChatArea = new JPanel();private final ImageIcon imageSetting =ImageManager.getIcon("setting.gif");private final JLabel lblSettingImage = newJLabel(imageSetting);private final JPanel pnlSetting = new JPanel();private final JPanel pnlInputArea = new JPanel();private final JButton bnClose = new JButton("关闭");private final JButton bnSend = new JButton("发送");private final JTextArea txtChatArea = new JTextArea(6,15);private final JTextArea txtInputArea = new JTextArea(2,15);private final Dimension minDimension = new Dimension(300, 413);public boolean isConnected() {return connected;}public void setConnected(boolean connected) {this.connected = connected;}public JTextArea getTxtChatArea() {return txtChatArea;}public JTextArea getTxtInputArea() {return txtInputArea;}public ClientFrame(String host,int port) throws IOException { this.host = host;this.port = port;s = new Socket(host,port);dos = new DataOutputStream(s.getOutputStream());dis = new DataInputStream(s.getInputStream());initComponents();}private void initComponents() {this.setTitle("大家聊天室");this.setSize(minDimension);this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CL OSE);getContentPane().setLayout(null);panel.setBounds(0, 0, 292, 379);getContentPane().setBackground(Color.LIGHT_GRAY);getContentPane().add(panel);panel.setLayout(null);pnlChatArea.setBounds(0, 0, 292, 226);JScrollPane jspChatArea = new JScrollPane(txtChatArea);jspChatArea.setAutoscrolls(false);pnlChatArea.add(jspChatArea);panel.add(pnlChatArea);pnlChatArea.setLayout(null);txtChatArea.setLineWrap(true);txtChatArea.setEditable(false);// pnlChatArea.setBounds(10, 10, 272, 206);jspChatArea.setBounds(10, 10, 272, 206);pnlSetting.setBounds(0, 235, 292, 45);pnlSetting.add(lblSettingImage);panel.add(pnlSetting);pnlInputArea.setBounds(0, 279, 292, 67);JScrollPane jspInputArea = new JScrollPane(txtInputArea);pnlInputArea.add(jspInputArea);panel.add(pnlInputArea);pnlInputArea.setLayout(null);txtInputArea.setLineWrap(true);// pnlInputArea.setBounds(10, 10, 272, 47);jspInputArea.setBounds(10, 10, 272, 47);bnClose.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {// 按下关闭按钮则直接退出聊天室exitSystem();}});bnClose.setBounds(99, 356, 74, 23);panel.add(bnClose);bnSend.addActionListener(new SendActionListener(this));bnSend.setBounds(197, 356, 74, 23);bnSend.setMnemonic(0);panel.add(bnSend);this.setMinimumSize(minDimension);this.addWindowListener(new ClientFrameAction(this));// this.getRootPane().setDefaultButton(bnSend);}public boolean login(String nickname){try {dos.writeUTF("login_" + nickname);int loginResult = dis.readInt();if(loginResult == 1){System.out.println("登陆成功,欢迎进入聊天室!");return true;}else if(loginResult == -1){System.out.println("登陆失败,没有以login_开头");return false;}else if(loginResult == 2){System.out.println("登陆失败,用户昵称已经存在!");return false;}} catch (IOException e) {e.printStackTrace();}return false;}private class SendActionListener implements ActionListener{ private ClientFrame frClientFrame;public SendActionListener(ClientFrame frClientFrame){ this.frClientFrame = frClientFrame;}public void actionPerformed(ActionEvent e) {String saying =frClientFrame.getTxtInputArea().getText();// System.out.println(saying);frClientFrame.getTxtInputArea().setText(null);try {frClientFrame.getDos().writeUTF(saying);frClientFrame.getDos().flush();} catch (IOException e1) {e1.printStackTrace();}}}public void exitSystem(){new ClientFrameAction(this).windowClosing(null); }public void disconnect() {try {this.setConnected(false);dos.close();dis.close();s.close();} catch (IOException e3) {e3.printStackTrace();}}public void receiveMessage(){new Thread(new ThreadreceiveMessage(this)).start();}private class ThreadreceiveMessage implements Runnable{ private ClientFrame frClientFrame;public ThreadreceiveMessage(ClientFrame frClientFrame){ this.frClientFrame = frClientFrame;}String message = "";public void run() {try {while(isConnected()){message = dis.readUTF();System.out.println(message);frClientFrame.txtChatArea.append(message + "\n");Thread.sleep(100);}}catch (IOException e) {e.printStackTrace();} catch (InterruptedException e) {Thread.interrupted();}}}}package TCP_chat_room.gui;import javax.swing.JOptionPane;public class MessageBox {public static void showWarningMessage (String message) { // confirmdialog是可选是或否的对话框// JOptionPane.showConfirmDialog(null, message, "温馨提示", JOptionPane.WARNING_MESSAGE);JOptionPane.showMessageDialog(null, message, "温馨提示", JOptionPane.WARNING_MESSAGE);// JOptionPane.showMessageDialog(null, message);}public static void showErrorMessage(String message){ JOptionPane.showMessageDialog(null, message, "错误提示", JOptionPane.ERROR_MESSAGE);}public static int showConfirmMessage(String message){ return JOptionPane.showConfirmDialog(null, message, "温馨提示",JOptionPane.YES_NO_OPTION,JOptionPane.ERROR_MESS AGE);}}package TCP_chat_room.gui;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import .ServerSocket;import .Socket;import .SocketException;import java.util.Collection;import java.util.Collections;import java.util.Hashtable;import java.util.Iterator;import java.util.Map;public class Server {public static final int CHAT_ROOM_PORT = 44444;private int port;private ServerSocket ss;private Socket socket;private DataInputStream dis;private DataOutputStream dos;private Map<Socket, String> clients = Collections.synchronizedMap(new Hashtable<Socket, String>());public Server(int port) throws IOException {ss = new ServerSocket(port);}public boolean containedInClients(String tempName) { Collection<String> names = clients.values();Iterator<String> it = names.iterator();while (it.hasNext()) {String existedName = it.next();if (existedName == tempName) {return true;}}return false;}// public void validataLogin() throws IOException{//// }public void start() throws IOException {while (true) {socket = ss.accept();new Thread(new ClientThread(socket)).start();}}private class ClientThread implements Runnable { private Socket client;public ClientThread(Socket client) {this.client = client;}public void run() {{try {dis = newDataInputStream(client.getInputStream());dos = newDataOutputStream(client.getOutputStream());} catch (IOException e1) {e1.printStackTrace();}try {// 处理用户的登录信息String loginMessage = dis.readUTF();String nickname = loginMessage.substring(6);if (loginMessage.startsWith("login_")) {boolean existed =containedInClients(nickname);if (existed) {dos.writeInt(2);} else { // 用户昵称还不存在,故登陆成功dos.writeInt(1);clients.put(client, loginMessage);sendToAllMessage(nickname + "进入聊天室!");String message;try {while (true) {dis = newDataInputStream(client.getInputStream());dos = newDataOutputStream(client.getOutputStream());message = dis.readUTF();if(message != null){sendToAllMessage(nickname + "说:" + message);}// dos.flush();Thread.sleep(100);}} catch (SocketException e) {// 暂时什么也不做} catch (InterruptedException e) {Thread.interrupted();}}} else {dos.writeInt(-1);}}catch (IOException e) {e.printStackTrace();} finally {try {if (dos != null) {dos.close();}if (dis != null) {dis.close();}if (client != null) {client.close();}if (ss != null) {ss.close();}} catch (IOException e) {e.printStackTrace();}}}}}public void sendToAllMessage(String message) throws IOException {Collection<Socket> sockets = clients.keySet();Iterator<Socket> it = sockets.iterator();while (it.hasNext()) {Socket s = it.next();dos = new DataOutputStream(s.getOutputStream());dos.writeUTF(message);}dos.flush();}}package TCP_chat_room.gui;import java.io.IOException;public class ServerApp {public static void main(String[] args) {try {Server server = newServer(Server.CHAT_ROOM_PORT);System.out.println("端口号为" +Server.CHAT_ROOM_PORT+ "服务器启动成功");//启动server,而server会首先验证昵称是否正确,即调用validataLogin()方法server.start();} catch (IOException e) {// System.out.println("端口正在使用中......");// System.out.println("请关闭相关程序或重新设置端口号");e.printStackTrace();}}}试验截图:首先启动服务器端:在启动客户端:启动多个客户端就可以实现聊天了:四、实验结果实现了基本的点对点的聊天,并附带一些小功能,如关闭窗口时弹出警告窗口:最小化到托盘:对最小化的图标进行操作:按exit可退出,restore可还原成用户界面五、实验心得由于时间比较紧迫,这个聊天室是比较简化的。

相关文档
最新文档