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