ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:163.79KB ,
资源ID:29408061      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/29408061.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(网络编程文档.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

网络编程文档.docx

1、网络编程文档网络应用编程文档 项目名称:简单的聊天软件 姓名: 学号: (下载源码就到新兴网络:www.NewX) 2009年4月26日 目录一. 需求分析 31.1 开发背景 31.2 功能要求 31.3 运行环境 31.4 功能实现 4二项目设计 52.1程序流图 522 概要设计 62.3功能设计 624 详细设计 82.4.1界面设计 8客户端 92.4.2程序结构设计 103.1、客户端 103.2服务器端 16四 项目测试 18五、总结: 18 一. 需求分析1.1 开发背景在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,类似QQ、

2、网络聊天时一类的聊天系统的发展日新月异。但是,QQ等现有的聊天程序也存在着很大的问题。比如,我在使用QQ的时候,就对他发的各种“广告”深恶痛绝。对于登陆后时不时弹出的打扰窗口,很是厌烦。因此我在本次作业的激励下,产生了一个制作类似QQ的网络聊天工具并且“无垃圾信息”洁净聊天工具的想法,而且希望通过制作该程序还能更好的学习网络软件编程知识。1.2 功能要求(1)登录功能。(2)客户可以通过服务器转发,实现一对一、一对多和多对多聊天。(3)实现抖动和声音提醒。(4)服务器端和客户端程序都能实时显示在线用户数目。(5)应该具有友好、易用、美观的图形界面。(6)无垃圾打扰信息(7)保存和删除聊天信息。

3、1.3 运行环境 本系统基于WINDOWS socket接口设计,适用于WINDOWS XP等系统。 1.4 功能实现1登录验证功能。对于账号重复等异常,需要提示给用户。2. 客户通过服务器转发,实现一对一、一对多和多对多聊天。3. 实时显示目前其它用户的状态,能够提示在线用户数目、状态等。4. 保存并能察看聊天纪录。5申请新的用户号码。6. 易用、美观的图形界面,实现系统托盘。7.收到信息时,能够收到声音等提示信息,发送端还能通过发送抖动,提示聊天的对方。二项目设计2.1程序流图22 概要设计 通过C#,实现网络聊天的功能,采用Windows Socket编程,服务器与客户端采用了TCP/I

4、P连接方式,在设计聊天方案时,实行将所有信息发往服务器端,再由服务器进行分别处理的思路,服务器端是所有信息的中心。由于服务器端要保存用户信息,我们利用数据库来实现这一功能,因此首先需要建立用户信息数据库。在客户端保存聊天纪录和用户号码这一功能的实现中,采用了文件系统设计。在信息到来及好友上线时,通过闪动托盘图标和播放不同的音乐进行提示。建立消息链表来保存用户接收的各种消息。2.3功能设计客户端:1) 登陆功能:建立与服务器的连接并登陆,能显示登陆错误信息。2) 界面显示:将在线好友显示在好友列表中,并实现系统托盘,加入工具栏便于操作。3) 聊天功能:与好友聊天。4) 聊天纪录:能保存聊天纪录,

5、并能察看聊天纪录。5) 信息提示:闪动托盘图标提示到来信息,并播放不同音乐来提示。6) 发送窗口抖动,发送端提示聊天的对方。 服务器端:向各个客户端发布系统消息。接受来自客户端的各种信息并分别处理。1) 登陆信息:检查登陆信息是否正确,并向客户端返回登陆信息,如信息正确。就将在线用户发给该用户,并将该用户的状态发给各在线用户。同时在服务器端显示出来。2) 聊天信息:转发给消息指定的用户。3) 申请信息:自动分配8位用户号码,并保存该用户,同时将信息返回给客户端。4) 用户下线:将此用户下线消息发给各客户端,并改写用户在服务器端的状态。程序中主要变量及函数的功能说明如下:客户端: private

6、 void login_btn_Click(object sender, EventArgs e) - 登陆到服务器 private void svrip_tb_TextChanged(object sender,EventArgs e)设置要连接的服务器的地址端口 private void chatrcd_rtb_TextChanged(object sender, EventArgs e)- 显示好友发送的信息 private void send_btn_Click(object sender, EventArgs e) - 给好友发送信息 private void user_tb_Tex

7、tChanged(object sender, EventArgs e) - 申请新的用户 private void chatrcd_rtb_TextChanged(object sender, EventArgs e) - 显示服务器消息 private void msg_tb_TextChanged(object sender, EventArgs e) - 显示消息输入文本private void nudge_pb_Click(object sender, EventArgs e)-发送窗口抖动private void broadcast_rb_CheckedChanged(object

8、 sender, EventArgs e)-聊天模式的变更private void hide_cb_CheckedChanged(object sender, EventArgs e)-最小化到托盘服务器端:用户及发送信息结构体类型: public void StartUp()-服务器启动,并且实时更新用户在线信息 public void GetConfig()-配置服务器端口号等信息 private void ThreadFunc(object obj)-系统对于发送消息、发送抖动等的异常的处理 public void Close()-关闭服务器24 详细设计2.4.1界面设计客户端1) 登

9、陆界面2) 显示当前状态3) 最小化到托盘4) 发送抖动5) 聊天模式变更6) 发送接收消息 客户端1) 服务器启动配置端口号2) 实时更新在线用户信息2.4.2程序结构设计 如概要设计反映。三编码实现3.1、客户端a)登陆private void login_btn_Click(object sender, EventArgs e) /验证数据合法性 if (!ValidateInfo() return; int port = int.Parse(svrport_tb.Text); /向服务器发出连接请求 TCPConnection conn = new TCPConnection(_ipA

10、ddr, port); TcpClient _tcpc = conn.Connect(); if (_tcpc = null) MessageBox.Show(无法连接到服务器,请重试!, 错误, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); else NetworkStream netstream = _tcpc.GetStream(); /向服务器发送用户名以确认身份 netstream.Write(Encoding.Unicode.GetBytes(user_tb.Text), 0, Encoding.Unicode.GetByte

11、s(user_tb.Text).Length); /得到登录结果 byte buffer = new byte50; netstream.Read(buffer, 0, buffer.Length); string connResult = Encoding.Unicode.GetString(buffer).TrimEnd(0); if (connResult.Equals(cmd:Failed) MessageBox.Show(您的用户名已经被使用,请尝试其他用户名!, 提示, MessageBoxButtons.OK, MessageBoxIcon.Information); retur

12、n; else string svrskt = svrip_tb.Text + : + svrport_tb.Text; chat_frm chatFrm = new chat_frm(user_tb.Text, netstream, svrskt); chatFrm.Owner = this; this.Hide(); chatFrm.Show(); b)发送消息private void send_btn_Click(object sender, EventArgs e) string localTxt = null; string sendTxt = null; string msg =

13、msg_tb.Text.Trim(); if (msg = string.Empty) MessageBox.Show(不能发送空消息, 提示, MessageBoxButtons.OK, MessageBoxIcon.Information); return; /如果是聊天室模式则向服务器发送广播请求 if (broadcast_rb.Checked) localTxt = string.Format(广播您在 0 对所有人说:rn1rnrn, DateTime.Now, msg); sendTxt = string.Format(广播0 在 1 对所有人说:rn2rnrn, _userna

14、me, DateTime.Now, msg); /发送广播请求 _nws.Write(new byte 0, 5 , 0, 2); else string _receiver = online_cb.Text; if (_receiver = string.Empty) MessageBox.Show(请选择一个接收者!n如果没有接受者可选,表明当前只有您一个人在线t, 发送消息, MessageBoxButtons.OK, MessageBoxIcon.Information); return; localTxt = string.Format(私聊您在 0 对 1 说:rn2rnrn, D

15、ateTime.Now, _receiver, msg); sendTxt = string.Format(私聊0 在 1 对您说:rn2rnrn, _username, DateTime.Now, msg); /发送接受者用户名 _nws.Write(Encoding.Unicode.GetBytes(_receiver), 0, Encoding.Unicode.GetBytes(_receiver).Length); _nws.Write(Encoding.Unicode.GetBytes(sendTxt), 0, Encoding.Unicode.GetBytes(sendTxt).L

16、ength); chatrcd_rtb.AppendText(localTxt); msg_tb.Clear(); / / 有新消息来时闪烁任务栏并且保持聊天记录内容滚动到最底端,QQ就是这么玩滴 / / / DllImport(user32.dll) public static extern bool FlashWindow(IntPtr hWnd, bool bInvert); private void chatrcd_rtb_TextChanged(object sender, EventArgs e) chatrcd_rtb.ScrollToCaret(); if (this.Wind

17、owState = FormWindowState.Minimized) FlashWindow(this.Handle, true); / / 当窗口恢复后取消任务栏的闪烁效果 / 当窗口最小化时判断是否要隐藏到系统托盘 / / / private void chat_frm_SizeChanged(object sender, EventArgs e) switch (this.WindowState) case FormWindowState.Normal: FlashWindow(this.Handle, false); break; case FormWindowState.Mini

18、mized: if (_hideFlag) notifyIcon1.Visible = true; this.Visible = false; break; default: break; / / 在线列表下拉框显示之前向服务器发送请求在线列表的命令 / / / private void online_cb_DropDown(object sender, EventArgs e) _nws.Write(new byte 0, 2 , 0, 2); / / 聊天模式改变 / / / private void broadcast_rb_CheckedChanged(object sender, E

19、ventArgs e) if (private_rb.Checked) online_cb.Enabled = true; else online_cb.Enabled = false; / / 设置最小化到系统托盘的标记值 / / / private void hide_cb_CheckedChanged(object sender, EventArgs e) _hideFlag = hide_cb.Checked; / / 产生闪屏振动效果 / private void Nudge() if (notifyIcon1.Visible = true) return; if (this.Win

20、dowState = FormWindowState.Minimized) this.WindowState = FormWindowState.Normal; int i = 0; Point _old = this.Location; Point _new1 = new Point(_old.X + 2, _old.Y + 2); Point _new2 = new Point(_old.X - 2, _old.Y - 2); _sp2.Play(); while (i 4) this.Location = _new1; Thread.Sleep(60); this.Location =

21、_new2; Thread.Sleep(60); i+; this.Location = _old; c)发送抖动private void nudge_pb_Click(object sender, EventArgs e) string displayTxt = null; if (private_rb.Checked & online_cb.Text = string.Empty) MessageBox.Show(非聊天室模式下必须先选择一个接收者!, 发送闪屏振动, MessageBoxButtons.OK, MessageBoxIcon.Information); return; if

22、 (private_rb.Checked) _nws.Write(new byte 0, 4 , 0, 2); string _receiver = online_cb.Text; _nws.Write(Encoding.Unicode.GetBytes(_receiver), 0, Encoding.Unicode.GetBytes(_receiver).Length); displayTxt = string.Format(系统提示您向 0 发送了一个闪屏振动。rnrn, _receiver); else _nws.Write(new byte 0, 3 , 0, 2); displayT

23、xt = 系统提示您向所有人发送了一个闪屏振动。rnrn; chatrcd_rtb.AppendText(displayTxt); Nudge(); d)关闭,断开连结private void close_btn_Click(object sender, EventArgs e) DialogResult ret; ret = MessageBox.Show(确定与服务器断开连接吗?, 退出, MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2); if (ret = Dial

24、ogResult.OK) /向服务器发送离线请求 _nws.Write(new byte 0, 1 , 0, 2); /结束接受消息的线程 if (_receiveThread != null) _receiveThread.Abort(); /关闭网络流 _nws.Close(); /关闭父窗口及自身 this.Owner.Close(); this.Close(); 3.2服务器端1) 配置端口号 public void GetConfig() string portParam; Console.Write(请输入监听端口,直接回车则接受默认端口8888: ); portParam = C

25、onsole.ReadLine(); if (portParam != string.Empty) if (!int.TryParse(portParam, out _port) | _port 65535) _port = 8888; Console.WriteLine(端口号不合法,默认端口号被接受!); 2) 启动服务器,监听客户端状态,实时变更 public void StartUp() IPAddress _ip = Dns.GetHostAddresses(Dns.GetHostName()0; _tcpl = new TcpListener(_ip, _port); _tcpl.

26、Start(); Console.WriteLine(服务器已启动,正在监听.n); Console.WriteLine(string.Format(服务器IP:0t端口号:1n, _ip, _port); while (true) byte packetBuff = new byte_maxPacket; Socket newClient = _tcpl.AcceptSocket(); newClient.Receive(packetBuff); string userName = Encoding.Unicode.GetString(packetBuff).TrimEnd(0); /验证是

27、否为唯一用户 if (_transmit_tb.Count != 0 & _transmit_tb.ContainsKey(userName) newClient.Send(Encoding.Unicode.GetBytes(cmd:Failed); continue; else newClient.Send(Encoding.Unicode.GetBytes(cmd:Successful); /将新连接加入转发表并创建线程为其服务 _transmit_tb.Add(userName, newClient); string svrlog = string.Format(系统消息新用户 0 在 1 已连接. 当前在线人数: 2rnrn, userName, DateTime.Now, _transmit_tb.Count); Console.WriteLine(svrlog); Thread clientThread = new Thread(new Parameteri

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1