设计聊天室实验报告
- 格式:doc
- 大小:235.50 KB
- 文档页数:12
《程序设计》实验报告学院:临沂大学专业:软件工程报告人:学号:班级:实验五简单聊天室设计一、目的与要求1、掌握程序开发流程。
2、了解Web应用程序的逻辑结构。
3、掌握三层架构二、实验仪器Windows操作系统,Microsoft Visual Studio .NET 2010。
三、实验内容1. 设计与实现一个简易聊天室。
四、实验过程及结果(1)设计数据库首先,多用户聊天室具有用户表User,其字段如表20.1所示。
User(用户)表记录发言信息的表Message的字段如表20.2所示。
Message(发言信息)表其中,color属性的取值可能为red、blue、green,它们能够直接赋值给<font color>,而不是简单的存储汉字,这样可以方便显示。
本例中,emotion存储的是文字信息,如微笑地、难过地等。
读者可以很容易地将其转变为图片信息,实现方式是首先设计一些表情图片,然后将其图片名存储在emotion属性中,在显示时根据其值构造<img>标签即可。
(2)实现数据库下面给出数据库实现的SQL命令,也可以通过SQL Server企业管理器创建:(1)创建User表CREATE TABLE [dbo].[User] ([UserName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,[Password] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL) ON [PRIMARY](2)创建Message表:CREATE TABLE [dbo].[Message] ([UserName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,[CreateTime] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,[Content] [text] COLLATE Chinese_PRC_CI_AS NULL ,[Color] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,[Emotion] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]3 数据访问层数据访问层完成所有与数据库交互的工作,本系统只包括一个类Database。
一、概述1.1 背景介绍近年来,随着互联网的普及和使用,人们之间的交流方式也发生了翻天覆地的变化。
网络聊聊已经成为了人们日常生活中不可或缺的一部分,无论是朋友、家人还是同事,都可以通过网络聊聊工具进行交流。
1.2 问题提出然而,大多数的网络聊聊工具都是由第三方公司提供的,用户对于数据安全和隐私保护的担忧也随之而来。
基于此,设计一个自己的聊聊室系统成为了一个有意义的话题。
1.3 目的本文旨在介绍基于python的聊聊室系统的设计和实现过程,使用简洁易懂的方式帮助读者了解如何通过python语言创建一个简单的聊聊室。
二、系统设计2.1 系统需求分析聊聊室系统需要具备基本的消息发送、接收功能,同时还需要考虑用户身份验证、消息加密等安全性问题。
2.2 系统架构设计考虑到系统的简单性和易用性,本系统采用C/S架构,即客户端/服务器架构。
服务器承担消息转发和用户管理的功能,客户端负责接收、发送消息以及与服务器的交互。
2.3 技术选型本系统采用python语言进行开发,python作为一种简洁、易读的语言,非常适合开发本系统。
我们还使用了socket模块进行网络通信,确保消息的快速、稳定传输。
三、系统实现3.1 服务器端实现服务器端主要负责用户管理、消息转发等功能。
由于python的socket模块封装了TCP和UDP的网络通信,我们可以很轻易地实现一个简单的多用户聊聊室。
3.2 客户端实现客户端主要负责用户接收、发送消息以及与服务器的通信。
通过python的socket模块,我们可以很方便地实现客户端和服务器之间的消息传递。
四、系统测试4.1 功能测试在系统实现阶段,我们需要对系统的各项功能进行测试,确保系统的稳定性和可靠性。
4.2 性能测试聊聊室系统需要具备较高的并发性和吞吐量,性能测试是系统测试中非常重要的一环。
五、系统优化5.1 用户体验优化为了提升用户体验,我们需要考虑系统的界面设计、交互方式等方面的优化。
聊天程序课程设计实验报告聊天程序的课程设计实验是一项相对复杂的课程设计。
本次实验的主要任务是开发一个由客户端和服务器组成的,可以实现客户端间的文本聊天的程序。
实验的具体实现方法是运用socket通信编程,使用C语言和JavaScript编写客户端和服务器端,利用html和css 构建聊天室的网页界面,实现客户端之间的聊天。
本次实验主要分为三部分:网络编程、网页构建和程序测试。
首先,实验者使用C语言编写客户端和服务器端,实现客户端之间的文本通信;接着,使用html和css构建聊天室网页界面,实现客户端的界面编程;最后,对实现的程序进行测试,确保程序实现所需要的功能。
本次实验实现了以上要求,实现了客户端之间的文本聊天和网页界面的构建,且程序在测试过程中没有发现任何问题,程序可以正常运行。
从这次实验中,实验者掌握了聊天程序的课程设计的相关知识,比如socket通信编程、html和css构建网页界面以及测试程序功能的方法,这些都可以在今后的聊天程序开发中发挥重要作用。
关键词:聊天程序;客户端;服务器;socket编程;HTML;CSS 1. 介绍聊天程序课程设计实验是一项通过计算机实现网络通信的一种实验项目,它包括客户端和服务器两部分,客户端主要是实现聊天室的界面,服务器则是负责网络通信的协调过程。
本次实验的主要任务是开发一个可以实现用户间文本聊天的程序,该程序包括客户端和服务器,可以使多个客户端之间进行文本聊天。
2.验准备本次实验的主要要求是实现一个可以实现多个客户端之间的文本聊天程序,因此需要考虑网络编程、网页构建以及程序测试等内容。
为了实现这一要求,首先要掌握socket编程,以及C语言和JavaScript等开发编程语言;其次,需要掌握HTML和CSS等网页构建语言;最后,也要掌握测试程序功能的方法。
3.验过程本次实验主要分为三部分:网络编程、网页构建和程序测试。
首先,实验者使用C语言开发客户端和服务器端,实现客户端之间的文本通信,同时也使用JavaScript语言实现客户端界面编程;接着,使用HTML和CSS构建聊天室网页界面,使聊天室更有趣;最后,对实现的程序进行测试,确保程序实现所需要的功能。
程序设计综合实验•多人聊天室系统功能需求分析开发环境系统架构概要设计功能模块详细设计流程图补充知识算法伪码目录分工进度功能模块分工进度a需求分析项目开发计划聊天软件有很多种,如QQ,MSN,微信等,但它们通常都是不开源的,能否根据学过的知识,设计一个简单的聊天程序?本项目研发一个多人聊天室,让处在聊天室中的每一位成员都能够互相通信,并将聊天记录保存下来功能描述·需要一个图形用户接口(窗口界面)·文本输入框:用于输入一条消息·文本显示框:按顺序显示已经收到的消息和已经发送的消息·网络接口:用于在服务器和客户端建立连接·能将文本显示框中的内容保存在一个.txt文件中开发平台·Windows操作系统·Pycharm5.0.4集成开发环境·Python编程语言(版本为Python2.7.15)知识点、技术难点socket模块socket基本上是两个端点的程序之间的“信息通道”。
分布在不同计算机上的程序,通过套接字相互发送信息一个套接字就是socket模块中socket类的一个实例。
在创建一个服务器套接字后,让它等待连接。
这样它就在某个网络地址处(IP地址和一个端口号的组合)监听,直到有客户端套接字连接。
连接完成后,两者就可以进行交互了。
套接字有两个方法:send和recv,用于传输数据。
可以使用字符串参数调用send以发送数据,用一个所需的(最大)字节数作参数调用recv来接收数据。
知识点、技术难点wxPython——跨平台GUI工具包wxPython是一个成熟且特性丰富的GUI工具包,但在Python2版本中,需要另行下载安装,具体安装过程可以参考https:///xiongwanfeng/article/details/77995055用wxPython设计的超简单文本编辑器b概要设计界面设计建立连接信息交互系统架构关闭连接功能模块·socket模块:用于连接服务器与客户端,使聊天室中的成员可以相互通信·输入文本框:输入当前要发送的消息·显示文本框:输出截止至当前时刻已发送的历史消息·显示文本框的内容保存至一个.txt文件分工进度第一天第二天第三天第四天第五天组员1组员2组员3组员4联调集体讨论,确立分工,搭建并配置编程环境界面设计Socket模块设计实现服务器端设计实现客户端设计实现局部联调c详细设计程序流程图服务器端:客户端:开始建立套接字请求连接,观察是否成功建立连接并创建一个对话框输入文字进行对话是否关闭窗口结束否是否是开始创建套接字监听是否有连接请求建立新连接向全体成员发送有人加入聊天室是否关闭服务器结束算法伪码服务器端socket模块:s = socket.socket()host = socket.gethostname() port = 4321s.bind((host, port))s.listen(5)c, addr= s.accept()客户端socket模块:s = socket.socket()host = socket.gethostname() port = 4321s.connect((host, port))服务器端建立一个套接字,并将当前主机的用户名及端口号绑定在套接字上服务器端开始监听连接请求,当有连接请求时,获取客户端的套接字客户端创建套接字,并连接至服务器端算法伪码app = wx.App()win = wx.Frame(None, title=‘Server')bkg= wx.Panel(win)history_dialog= wx.TextCtrl(bkg,style=wx.TE_READONLY| wx.TE_MULTILINE | wx.HSCROLL)contents_input= wx.TextCtrl(bkg,style=wx.TE_MULTILINE| wx.HSCROLL)创建主窗口创建显示文本框创建输入文本框算法伪码发送消息def send_mssg(event):user_input = contents_input.GetValue()if user_input:message = 'Server: ' + time.strftime("%Y-%m-%d %H:%M:%S ", time.localtime()) + '\n ' + user_input + '\n'try:c.send(message.encode('utf-8'))except(socket.error):print 'Warning: CONNECTION DROPPED'history_dialog.AppendText(message)contents_input.Clear()接收消息def recv_mssg():try:recv_message = c.recv(1024).decode('utf-8')except (OSError, socket.error):print 'Warning: SERVER ERROR'else:if recv_message:name, time1, time2, recv_contents = recv_message.split(' ', 3)message = name + ' ' + time.strftime("%Y-%m-%d %H:%M:%S ", time.localtime()) + recv_contents history_dialog.AppendText(message)else:passtimer = threading.Timer(0.1, recv_mssg)timer.setDaemon(True)timer.start()算法伪码def save(event):file = open(u'聊天记录.txt', 'w')file.write(history_dialog.GetValue().encode('utf-8')) file.close()SendButton= wx.Button(bkg, label='发送') SaveButton= wx.Button(bkg, label='保存') SendButton.Bind(wx.EVT_BUTTON, send_mssg) SaveButton.Bind(wx.EVT_BUTTON, save)将显示文本框的内容保存在一个.txt文件中创建”发送”和”保存”两个按钮将按钮和函数绑定在一起,即按下按钮时执行对应的函数d案例改进需要改进的方面·GUI界面不够美观设计更加丰富,美观的GUI界面·聊天室内的成员只能群聊,不能够向指定人发起私聊找到指定的成员,额外开启一个对话框进行私聊·ip地址和port端口已在程序中设置好,无法改变将ip地址和port端口作为用户输入保存起来,需要时进行调用e案例总结运行效果界面简洁基于wxPython 工具包的简单聊天程序支持全双工通信Python语言相比C++更加简单缺点优点不能传输附件THANKS!。
计算机网络原理实验报告书姓名: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课程设计报告聊天室一、课程目标知识目标:1. 学生能理解网络编程的基本概念,掌握JAVA Socket编程的基础知识。
2. 学生能运用面向对象编程思想,设计并实现聊天室客户端与服务器的数据传输功能。
3. 学生了解并掌握多线程技术在网络编程中的应用。
技能目标:1. 学生能运用所学知识,独立编写并调试简单的聊天室程序。
2. 学生具备分析问题、解决问题的能力,能针对聊天室程序进行优化和改进。
3. 学生能在团队协作中发挥自己的作用,与他人共同完成一个完整的网络编程项目。
情感态度价值观目标:1. 学生培养对计算机编程的兴趣,增强学习JAVA的自信心。
2. 学生认识到团队合作的重要性,培养良好的团队协作精神。
3. 学生通过编程实践,体验创新与创造的乐趣,培养积极向上的学习态度。
本课程针对高年级学生,结合课本内容,注重理论与实践相结合,以提高学生的实际编程能力为主要目标。
课程要求学生在掌握基本知识的基础上,能够独立完成实际项目,培养其分析问题、解决问题的能力。
同时,课程强调团队协作,使学生学会与他人共同进步,共同成长。
通过本课程的学习,使学生达到知识、技能和情感态度价值观的全面提升。
二、教学内容1. 网络编程基础理论:介绍网络编程的基本概念,包括IP地址、端口号、协议等,使学生理解网络通信的基本原理。
- 教材章节:第三章 网络编程基础2. JAVA Socket编程:讲解Socket编程的原理,指导学生掌握客户端与服务器之间的数据传输方法。
- 教材章节:第四章 Socket编程3. 面向对象编程:运用面向对象编程思想,设计聊天室程序,包括类的定义、封装、继承与多态。
- 教材章节:第二章 面向对象编程基础4. 多线程技术:介绍多线程编程的概念,分析在聊天室程序中如何实现多用户并发通信。
- 教材章节:第五章 多线程编程5. 聊天室程序设计与实现:指导学生完成聊天室客户端与服务器的编写,实现基本的功能需求。
实验5 掌握简单的网络通讯技术实验6 掌握基于典型协议的的网络通讯技术一实验目的1.熟悉Socket的通讯机制,了解网络程序的设计方法。
2. 熟悉典型协议的通讯机制,掌握基于它们的网络系统设计方法。
如TCP、UDP。
二实验环境1.Windows72.Visual C++ 6.0三实验程序设计1.实验原理1.C/S模式C/S模式是指一个服务器同时为多个客户端服务。
并发性是C/S模式的的基础,正是由于并发性的支持,多个客户端能够获得同一种服务,而不必等待服务器完成对上一个请求的处理。
在C/S模式中,当请求到达服务器时,服务器将它交给一个控制线程,它能与已有的线程并发的执行。
在设计并发服务器时,一般服务器代码由两部分组成,第一部分代码负责监听并接收客户端的请求,还负责为客户端请求创建新的服务线程;另一部分代码负责处理单个客户机请求,如与客户机交换数据,提供具体服务。
下图所示为服务器创建多个线程来为多个客户机服务。
2.基于TCP的socket通信服务器与客户端是通过套接字来进行通信的。
在基于TCP的网络通信程序中,首先服务器端通过socket()函数创建套接字,然后通过bind()函数来命名套接字,调用listen()函数开启服务器端的监听。
接着执行accept()函数来接收客户的连接,服务器阻塞等待客户连接请求,直到有客户请求连接。
客户端创建套接字,接着通过connect()函数请求连接服务器,连接成功后,就可以与服务器进行通信了。
服务器与客户机通过send()各recv()调用来进行信息的发送和接收。
只有当有信息可接收时,recv()才返回,否则将阻塞。
通信完后,服务器和客户机各自通过closesocket()函数来关闭套接字。
注:以上讲的是阻塞模式。
下图所示的是基于TCP的网络通信模式。
客户机端服务器端对于监听套接字创建套接字:SOCKET()绑定套接字;BIND()创建套接字:SOCKET()启动监听:LISTEN()请求连接:CONNECT()接受客户的连接请求:ACCEPT()创建新的连接套接字发送数据:WRITE()处理服务器的响应读取数据:READ()关闭套接字:CLOSE()读取数据:READ()处理客户机的服务请求发送数据:WRITE()关闭套接字:CLOSE()关闭套接字:CLOSE()请求连接(第一次握手)接受连接(第二次握手)如果没有已经到达的连接请求,就阻塞,等待客户的连接请求请求服务器服务(第三次握手,同时发送数据)服务器发给客户机的响应对于连接套接字2.系统设计实验5要求在客户机和服务器传输图片和文件,如果是图片则显示,是文件则保存。
一、背景知识在传统生活里,人们利用写信、电话等方式联络,但此类方式周期缓慢,呆板且不可靠。
在这个信息极其发达的时代,随后我们可以用来进行信息交流的方法日益增多,比如电报、电话、电子邮件、OICQ等通讯手段,但是这些或者不方便或者有局限性或者有费用的问题。
近年来计算机技术的快速发展,特别是计算机网络的发展,越来越深刻的改变了人们生活的方方面面,使得人们能以更低廉的价格,开发出更方便、更实用的网络工具。
各种在线服务系统,更是深刻的影响了人们的联系和交流方式,使得人们可以在远隔千里之遥随时通讯。
过去的种种陈旧的联系方式,已经不能满足现代生活的需要。
网络聊天室凭借其友好的外观、强大的功能、使用的便利、联系的及时等特点博得现代人的青睐,其应用的市场十分广阔。
本系统使用的是C/S模式,使用C#进行聊天室的设计与开发。
本文主要介绍了所应用到的技术的基础知识,并探讨了建立聊天室的设计思想、方法与功能实现流程图。
本文所实现的聊天室具有良好的人机交互界面、合理的数据库结构可以实现发言、自动显示所在聊天室的成员等交互功能,经过测试调试,证明可实际应用。
下图为网络聊天室的主界面图1 网络聊天室主运行界面图二、核心算法思想实现一个基于Socket的简易的聊天室,实现的思路如下:聊天室服务器端启动服务器时,将创建侦听套接字,创建用户列表,创建并启动侦听线程。
用户登录时,将创建套接字,与服务器直接连接,并创建客户端接收线程。
服务器端侦听到有用户上线后,将创建新的用户节点,并在主界面上显示用户上线,发送新的用户列表。
客户端发送信息时,将要发送的内容进行发送。
服务器端发送信息时,如果是发送给所有人,就遍历用户链表,如果是发送给某个用户,先在链表中找到该节点,再发送信息。
服务器端和客户端接收信息时,先读取聊天信息标识,做出判断后,依次读取信息,处理信息,并在主界面上显示,服务器端还要将准备好的信息发送给指定的用户。
开启客户端主界面后,就会启动文件接收侦听线程,如果有用户发送文件至此,将会有信息提示,确定接收后,将启动文件接收线程,对方用户端将启动文件发送线程。
聊天程序设计实验报告范文JAVA语言,聊天室实验报告某某专业名称实验室实验课程实验名称姓名学号同组人员实验日期某某某某大学软件工程2号实验楼201室JAVA高级程序设计聊天程序设计(客户端、服务端)无2022年12月12日JAVA语言,聊天室实验报告一、实验目的掌握基于TCP、UDP协议的聊天服务器端与客户端程序设计,掌握Socket,ServerSocket,DatagramSocket,DatagramPacket类的使用。
二、实验原理TCP和UDP协议的支持。
ServerSocket和Socket的使用。
三、实验内容实验截图JAVA语言,聊天室实验报告代码importjava.awt.Point;importjava.io.BufferedReader; importjava.io.IOE某ception; importjava.io.InputStreamReader; importjava.io.PrintWriter;import.ServerSocket;import.Socket;importjava.te某t.DateFormat; importjava.util.Date;importjava.util.HahMap;importjava.util.Vector;importjava.util.logging.Level; importjava.util.logging.Logger;/某某某某/publicclae某tendjava某.wing.JFrame{privateServerSocketerver;privateint=0;privatechar[]chatBuf=newchar[2048]; privateStringchatIpAddre="127.0.0.1"; privatefinalintchatPort=5200;privateHahMap<String,Vector<IMeage>>chatRecordMap;//privateHahMap<String,Integer>chatRecordHMap; publicTalkHome(){chatRecordMap=newHahMap<String,Vector<IMeage>>();//chatRecordHMap=newHahMap<String,Integer>();try{erver=newServerSocket(Integer.valueOf(chatPort));}catch(IOE某ceptione某){Logger.getLogger(TalkHome.cla.getName()).log(Level.SEVERE, null,e某);}newThread(newRunnable(){publicvoidrun(){while(true){try{Socketocket=erver.accept();JAVA语言,聊天室实验报告BufferedReaderin=newBufferedReader(newInputStreamReader(ocket.getInputStream()));inttmp_len=-1;StringBuilderchatStrBuilder=newStringBuilder();while((tmp_len=in.read(chatBuf))!=-1){chatStrBuilder.append(chatBuf,0,tmp_len);}addMeage(ocket.getInetAddre().getHotAddre(),chatStrBuilder.toString(),fale);in.cloe();ocket.cloe();}catch(IOE某ceptione某){Logger.getLogger(TalkHome.cla.getName()).log(Level.SEVERE,nu ll,e某);}}}).tart();}privatevoidreChatWindow(StringipAddre){Sytem.out.println(ipAddre);Vector<IMeage>chatRecord=chatRecordMap.get(ipAddre); jTe某tArea1.etTe某t("");if(chatRecord==null){chatRecord=newVector<IMeage>();chatRecordMap.put(ipAddre,chatRecord);}ele{for(IMeageiMe:chatRecord){if(iMe.imyelf){jTe某tArea1.append("我"+iMe.dateString+"}ele{jTe某tArea1.append("TA"+iMe.dateString+"}}}privatevoidaddMeage(finalStringipAddre,StringmeString,boolea nimyelf){Vector<IMeage>chatRecord=chatRecordMap.get(ipAddre);if(chatRecord==null){JAVA语言,聊天室实验报告chatRecord=newVector<IMeage>();chatRecordMap.put(ipAddre,chatRecord);}finalIMeageiMeage=newIMeage(meString,imyelf);chatRecord.add(iMeage);if(imyelf){newThread(newRunnable(){publicvoidrun(){try{SocketendMeage=newSocket(ipAddre,chatPort);PrintWriterendWindow=newPrintWriter(endMeage.getOutputStream());endWindow.print(iMeage.meString);endWindow.fluh();endWindow.cloe();endMeage.cloe();jTe某tArea1.append("我"+iMeage.dateString+"}catch(IOE某ceptione某){Logger.getLogger(TalkHome.cla.getName()).log(Level.SEVERE,nu ll,e某);}}}).tart();}ele{jTe某tArea1.append("TA"+iMeage.dateString+"}}jCheckBo某1=newjava某.wing.JCheckBo某();jScrollPane2=newjava某.wing.JScrollPane();jTe某tArea2=newjava某.wing.JTe某tArea();jButton2=newjava某.wing.JButton();jFormattedTe某tField1=newjava某.wing.JFormattedTe某tField();jFormattedTe某tField2=newjava某.wing.JFormattedTe某tField();jLabel1=newjava某.wing.JLabel();jLabel2=newjava某.wing.JLabel();JAVA语言,聊天室实验报告jPanel3=newjava某.wing.JPanel();jLabel3=newjava某.wing.JLabel();jScrollPane3=newjava某.wing.JScrollPane();jTe某tArea1=newjava某.wing.JTe某tArea();jCheckBo某1.etTe某t("jCheckBo某1");etDefaultCloeOperation(java某.wing.WindowContant.E某IT_ON_CLOSE);etBackground(newjava.awt.Color(255,255,255));etBound(newjava.awt.Rectangle(0,0,520,520));etCuror(newjava.awt.Curor(java.awt.Curor.DEFAULT_CURSOR));etModalE某cluionType(java.awt.Dialog.ModalE某cluionType.APPLICATION_E某CLUDE);jTe某tArea2.etColumn(20);jTe某tArea2.etFont(newjava.awt.Font("微软雅黑",0,14));//NOI18NjTe某tArea2.etLineWrap(true);jTe某tArea2.etRow(5);jScrollPane2.etViewportView(jTe某tArea2);jButton2.etTe某t("发送");jButton2.addActionLitener(newjava.awt.event.ActionLitener(){ publicvoidactionPerformed(java.awt.event.ActionEventevt){jButton 2ActionPerformed(evt);}});jFormattedTe某tField1.etTe某t("127.0.0.1");jFormattedTe某tField1.etToolTipTe某t("");jFormattedTe某tField2.etTe某t("5200");jFormattedTe某tField2.etToolTipTe某t("");jLabel1.etTe某t("IP:");jLabel2.etTe某t(":");jPanel3.etBackground(newjava.awt.Color(255,255,255));JAVA语言,聊天室实验报告}});jLabel3.etTe某t("对方IP:");jLabel3.etToolTipTe某t("");java某.wing.GroupLayoutjPanel3Layout=newjava某.wing.GroupLayout(jPanel3);jPanel3.etLayout(jPanel3Layout);jPanel3Layout.etHorizontalGroup(jPanel3Layout.createParallelGroup(java某.wing.GroupLayout.Alignment.LEADING).addGroup(jPanel3Layout.createSequentialGroup() .addContainerGap().addPreferredGap(ponentPlacement.UNRELATED)java某.wing.GroupLayout.PREFERRED_SIZE,131,java某.wing.GroupLayout.PREFERRED_SIZE).addContainerGap(java某.wing.GroupLayout.DEFAULT_SIZE,Short.MA某_VALUE)) );jPanel3Layout.etVerticalGroup(jPanel3Layout.createParallelGroup(java某.wing.GroupLayout.Alignment.LEADING).addGroup(jPanel3Layout.createSequentialGroup() .addGap(22,22,22).addGroup(jPanel3Layout.createParallelGroup(java 某.wing.GroupLayout.Alignment.BASELINE)java某.wing.GroupLayout.PREFERRED_SIZE,java某.wing.GroupLayout.DEFAULT_SIZE,java某.wing.GroupLayout.PREFERRED_SIZE).addContainerGap(java某.wing.GroupLayout.DEFAULT_SIZE,Short.MA某_VALUE)) );jTe某tArea1.etEditable(fale);jTe某tArea1.etColumn(20);JAVA语言,聊天室实验报告jTe某tArea1.etFont(newjava.awt.Font("微软雅黑",0,14));//NOI18NjTe某tArea1.etLineWrap(true);jTe某tArea1.etRow(5);jScrollPane3.etViewportView(jTe某tArea1);java某.wing.GroupLayoutlayout=newjava某.wing.GroupLayout(getContentPane());getContentPane().etLayout(layout);layout.etHorizontalGroup(layout.createParallelGroup(java某.wing.GroupLayout.Alignment.LEADING).addGroup(java某.wing.GroupLayout.Alignment.TRAILING,layout.createSequentialGroup().addGroup(layout.createParallelGroup(java某.wing.GroupLayout.Alignment.LEADING).addGroup(java某.wing.GroupLayout.Alignment.TRAILING,layout.createSequentialGr oup().addGap(2,2,2).addPreferredGap(ponentPlacement.RELATED)java某.wing.GroupLayout.PREFERRED_SIZE,104,java某.wing.GroupLayout.PREFERRED_SIZE).addPreferredGap(ponentPlacement.RELATED)java某.wing.GroupLayout.PREFERRED_SIZE,6,java某.wing.GroupLayout.PREFERRED_SIZE).addPreferredGap(ponentPlacement.RELATED)java某.wing.GroupLayout.PREFERRED_SIZE,43,java某.wing.GroupLayout.PREFERRED_SIZE).addPreferredGap(ponentPlacement.RELATED,123,Short.MA某_VALUE).addPreferredGap(ponentPlacement.RELATED)java某.wing.GroupLayout.PREFERRED_SIZE)JAVA语言,聊天室实验报告.addContainerGap()));layout.etVerticalGroup(layout.createParallelGroup(java某.wing.GroupLayout.Alignment.LEADING).addGroup(layout.createSeq uentialGroup().addGroup(layout.createParallelGroup(java某.wing.GroupLayout.Alignment.LEADING,fale)java某.wing.GroupLayout.DEFAULT_SIZE,java某.wing.GroupLayout.DEFAULT_SIZE,Short.MA某_VALUE)java某.wing.GroupLayout.DEFAULT_SIZE,358,Short.MA某_VALUE)) .addPreferredGap(ponentPlacement.RELATED)java某.wing.GroupLayout.DEFAULT_SIZE,131,Short.MA某_VALUE) .addPreferredGap(ponentPlacement.RELATED).addGroup(layout.createParallelGroup(java某.wing.GroupLayout.Alignment.BASELINE)java某.wing.GroupLayout.PREFERRED_SIZE,java某.wing.GroupLayout.DEFAULT_SIZE,java某.wing.GroupLayout.PREFERRED_SIZE)java某.wing.GroupLayout.PREFERRED_SIZE,java某.wing.GroupLayout.DEFAULT_SIZE,java某.wing.GroupLayout.PREFERRED_SIZE).addGap(2,2,2)));pack();}//</editor-fold>addMeage(chatIpAddre,jTe某tArea2.getTe某t(),true);jTe某tArea2.etTe某t("");}if(evt.getStateChange()==1){JAVA语言,聊天室实验报告chatIpAddre=evt.getItem().toString();reChatWindow(chatIpAddre);}}privatePoint;/某某某/publictaticvoidmain(Stringarg[]){try{for(java某.wing.UIManager.LookAndFeelInfoinfo:java某.wing.UIManager.getIntalledLookAndFeel()){if("Nimbu".equal(info.getName())){java某.wing.UIManager.etLookAndFeel(info.getClaName());break;}}}catch(ClaNotFoundE某ceptione某){java.util.logging.Logger.getLogger(TalkHome.cla.getName()).l og(java.util.logging.Level.SEVERE,null,e某);}catch(IntantiationE某ceptione某){java.util.logging.Logger.getLogger(TalkHome.cla.getName()).l og(java.util.logging.Level.SEVERE,null,e某);}catch(IllegalAcceE某ceptione某){java.util.logging.Logger.getLogger(TalkHome.cla.getName()).l og(java.util.logging.Level.SEVERE,null,e某);}catch(java某.wing.UnupportedLookAndFeelE某ceptione某){java.util.logging.Logger.getLogger(TalkHome.cla.getName()).l og(java.util.logging.Level.SEVERE,null,e某);}//</editor-fold>/某Createanddiplaytheform某/java.awt.EventQueue.invokeLater(newRunnable(){publicvoidrun(){newTalkHome().etViible(true);}});JAVA语言,聊天室实验报告}//Variabledeclaration-donotmodifyprivatejava某.wing.JButtonjButton2;privatejava某.wing.JCheckBo某jCheckBo某1;privatejava某.wing.JFormattedTe某tFieldjFormattedTe某tField1;privatejava某.wing.JFormattedTe某tFieldjFormattedTe某tField2;privatejava某.wing.JLabeljLabel1;privatejava某.wing.JLabeljLabel2;privatejava某.wing.JLabeljLabel3;privatejava某.wing.JPaneljPanel3;privatejava某.wing.JScrollPanejScrollPane2;privatejava某.wing.JScrollPanejScrollPane3;privatejava某.wing.JTe某tAreajTe某tArea1;privatejava某.wing.JTe某tAreajTe某tArea2;}claIMeage{publicbooleanimyelf;publicStringmeString;publicIMeage(Stringme,booleanimyelf){thi.imyelf=imyelf;thi.meString=me;}四、实验心得其实java已经将TCP和UDP协议高度封装了,熟练使用ServerSocket和Socket,DataGram会写出想要的网络程序,并不是很难。
设计性实验项目简介
fgets( SERV_HOST_ADDR, MAX_LINE, fd);
fscanf( fd, "%d", &SERV_TCP_PORT);
fclose( fd);
bzero( (char*)&serv_addr, sizeof( serv_addr));
serv_addr.sin_family =AF_INET;
serv_addr.sin_addr.s_addr =inet_addr( SERV_HOST_ADDR);
serv_addr.sin_port =htons( SERV_TCP_PORT);
if ( ( sockfd = socket( AF_INET,SOCK_STREAM,0))<0) {
printf( "client:can`t open stream socker.\n");
fflush( stdout);
return( 0);
}
if ( connect( sockfd, ( struct sockaddr *)&serv_addr,
sizeof( serv_addr))<0) {
printf( "client:can`t connect to server\n");
fflush( stdout);
return( 0);
}
return( sockfd);
}
运行结果:
服务器端运行结果,显示端口号并处于等待连接状态:
群聊功能,四个客户端代表四个用户,通过服务器的转发实现通信。
显示所有的用户功能,通过发送“list”由客户端发送所有的用户名字。
私聊功能,通过“*”符号作为标识符实现两个用户之间的私有通信。
实验感悟
本实验的私聊功能较为难实现,在老师和同学的帮助下经过一次次的验证和修改最终实现了该功能,最终本实验可以群聊也可以私聊。
本实验利用的是C语言编程,需要C语言和linux 网络编程基础,尤其对socket编程和C语言数组和指针的应用,锻炼了我们对两者的编程能力,在修改代码的过程中加深了我们对编程的理解。
注:开课时间填本实验项目所有实验班的具体上课时间,如11月12日下午3:00-5:00。