已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
广西大学计算机与电子信息学院课程设计报告( 20152016年度第一学期)名 称: 网络编程课程设计 题 目: C#聊天程序 院 系: 网络工程系 班 级: 网络131 学 号: 1307300313 学生姓名: 何 鑫 指导教师: 葛 志 辉 设计周数: 2 周 成 绩: 日期: 2016 年 1 月 12 日目 录1. 设计任务32. 设计思路32.1 程序概要设计32.2 主要算法说明43. 程序的源代码54.遇到的问题及相应解决办法105.个人体会及建议11参考文献111. 设计任务 用c#语言,编写一个包含界面的实现客户端与服务器双向通信的多线程聊天程序。2. 设计思路2.1 程序概要设计1. 原理 服务器:定义一个套接字用于监听客户端发来的信息,用int.Parse(txtPORT.Text.Trim()获取用户输入的IP地址和端口号,然后绑定IP地址和端口号。定义ServerSendMsg函数用于发送消息,定义ServerRecMsg函数用于接收消息。 客户端:定义一个客户端的套接字,获取文本框中输入的IP地址和端口号,用Connect方法连接到服务器的网络节点,定义ClientSendMsg函数用于发送消息,定义RecMsg函数用于接收函数。2.多线程解决I/0阻塞 单线程在使用recv()方法时,服务器和客户端进程都会因等待接收对方数据而被阻塞。因此,在服务器和客户端都设置两个线程,分别用来处理发送(send)和接受(recv)问题3. 客户端与客户端通信的原理 若干个客户端与服务器相连接后,服务器即可获得每个客户端的IP地址,并存储在列表中。服务器向客户端询问其他客户端的IP地址,服务器将列表中对应的IP地址返回给客户端。客户端知道塔下连接的客户端的IP地址,就可以实现连接了。2.2 主要算法说明服务器 /关闭对文本框的非法线程操作检查 TextBox.CheckForIllegalCrossThreadCalls = false; /定义一个套接字用于监听客户端发来的信息 s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); /监听绑定的网络节点 s.Bind(endpoint); /将套接字的监听队列长度限制为20 s.Listen(20); /将输入的字符串转换成 机器可以识别的字节数组 byte arrSendMsg = Encoding.UTF8.GetBytes(sendMsg); /向客户端发送字节数组信息 socConnection.Send(arrSendMsg); /将发送的字符串信息附加到文本框txtMsg上 txtMsg.AppendText(So-flash: + GetCurrentTime() + rn + sendMsg + rn); /将发送的字符串信息附加到文本框txtMsg上 txtMsg.AppendText(strSRecMsg + rn); /调用 ServerSendMsg方法 发送信息到客户端 ServerSendMsg(txtSendMsg.Text.Trim(); /如果用户按下了Enter键 if (e.KeyCode = Keys.Enter) /则调用 服务器向客户端发送信息的方法 ServerSendMsg(txtSendMsg.Text.Trim(); 客户端 /定义一个套字节监听 包含3个参数(IP4寻址协议,流式连接,TCP协议) socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); /需要获取文本框中的IP地址 IPAddress ipaddress = IPAddress.Parse(txtIP.Text.Trim(); /将获取的ip地址和端口号绑定到网络节点endpoint上 IPEndPoint endpoint = new IPEndPoint(ipaddress, int.Parse(txtPort.Text.Trim(); /这里客户端套接字连接到网络节点 socketClient.Connect(endpoint); /创建一个线程 用于监听服务端发来的消息 threadClient = new Thread(RecMsg); /将窗体线程设置为与后台同步 threadClient.IsBackground = true; /启动线程 threadClient.Start(); while (true) /持续监听服务端发来的消息 /定义一个1M的内存缓冲区 用于临时性存储接收到的信息 byte arrRecMsg = new byte1024 * 1024; /将客户端套接字接收到的数据存入内存缓冲区, 并获取其长度 int length = socketClient.Receive(arrRecMsg); /将套接字获取到的字节数组转换为人可以看懂的字符串 string strRecMsg = Encoding.UTF8.GetString(arrRecMsg, 0, length); /将发送的信息追加到聊天内容文本框中 txtMsg.AppendText(服务器: + GetCurrentTime() + rn + strRecMsg + rn);3.程序的源代码界面部分1. 新建一个空白窗体程序。使用工具箱中的标签、文本框、按钮功能,设计窗体如下图:2.在相应控件上点击右键,选择属性,在属性中text栏中修改控件名3. 双击控件输入代码代码部分/服务器public partial class FServer : Form public FServer() InitializeComponent(); /关闭对文本框的非法线程操作检查 TextBox.CheckForIllegalCrossThreadCalls = false; Thread threadWatch = null; /负责监听客户端的线程 Socket socketWatch = null; /负责监听客户端的套接字 private void btnServerConn_Click(object sender, EventArgs e) /定义一个套接字用于监听客户端发来的信息 包含3个参数(IP4寻址协议,流式连接,TCP协议) socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); /服务端发送信息 需要1个IP地址和端口号 IPAddress ipaddress = IPAddress.Parse(txtIP.Text.Trim(); /获取文本框输入的IP地址 /将IP地址和端口号绑定到网络节点endpoint上 IPEndPoint endpoint = new IPEndPoint(ipaddress, int.Parse(txtPORT.Text.Trim(); /获取文本框上输入的端口号 /监听绑定的网络节点 socketWatch.Bind(endpoint); /将套接字的监听队列长度限制为20 socketWatch.Listen(20); /创建一个监听线程 threadWatch = new Thread(WatchConnecting); /将窗体线程设置为与后台同步 threadWatch.IsBackground = true; /启动线程 threadWatch.Start(); /启动线程后 txtMsg文本框显示相应提示 txtMsg.AppendText(开始监听客户端传来的信息! + rn); /创建一个负责和客户端通信的套接字 Socket socConnection = null; / / 监听客户端发来的请求 / private void WatchConnecting() while (true) /持续不断监听客户端发来的请求 socConnection = socketWatch.Accept(); txtMsg.AppendText(客户端连接成功 + rn); /创建一个通信线程 ParameterizedThreadStart pts = new ParameterizedThreadStart(ServerRecMsg); Thread thr = new Thread(pts); thr.IsBackground = true; /启动线程 thr.Start(socConnection); / / 发送信息到客户端的方法 / / 发送的字符串信息 private void ServerSendMsg(string sendMsg) /将输入的字符串转换成 机器可以识别的字节数组 byte arrSendMsg = Encoding.UTF8.GetBytes(sendMsg); /向客户端发送字节数组信息 socConnection.Send(arrSendMsg); /将发送的字符串信息附加到文本框txtMsg上 txtMsg.AppendText(So-flash: + GetCurrentTime() + rn + sendMsg + rn); / / 接收客户端发来的信息 / / 客户端套接字对象 private void ServerRecMsg(object socketClientPara) Socket socketServer = socketClientPara as Socket; while (true) /创建一个内存缓冲区 其大小为1024*1024字节 即1M byte arrServerRecMsg = new byte1024 * 1024; /将接收到的信息存入到内存缓冲区,并返回其字节数组的长度 int length = socketServer.Receive(arrServerRecMsg); /将机器接受到的字节数组转换为人可以读懂的字符串 string strSRecMsg = Encoding.UTF8.GetString(arrServerRecMsg, 0, length); /将发送的字符串信息附加到文本框txtMsg上 txtMsg.AppendText(天之涯: + GetCurrentTime() + rn + strSRecMsg + rn); /发送信息到客户端 private void btnSendMsg_Click(object sender, EventArgs e) /调用 ServerSendMsg方法 发送信息到客户端 ServerSendMsg(txtSendMsg.Text.Trim(); /快捷键 Enter 发送信息 private void txtSendMsg_KeyDown(object sender, KeyEventArgs e) /如果用户按下了Enter键 if (e.KeyCode = Keys.Enter) /则调用 服务器向客户端发送信息的方法 ServerSendMsg(txtSendMsg.Text.Trim(); / / 获取当前系统时间的方法 / / 当前时间 private DateTime GetCurrentTime() DateTime currentTime = new DateTime(); currentTime = DateTime.Now; return currentTime; /客户端 public partial class FClient : Form public FClient() InitializeComponent(); /关闭对文本框的非法线程操作检查 TextBox.CheckForIllegalCrossThreadCalls = false; /创建 1个客户端套接字 和1个负责监听服务端请求的线程 Socket socketClient = null; Thread threadClient = null; private void btnBeginListen_Click(object sender, EventArgs e) /定义一个套字节监听 包含3个参数(IP4寻址协议,流式连接,TCP协议) socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); /需要获取文本框中的IP地址 IPAddress ipaddress = IPAddress.Parse(txtIP.Text.Trim(); /将获取的ip地址和端口号绑定到网络节点endpoint上 IPEndPoint endpoint = new IPEndPoint(ipaddress, int.Parse(txtPort.Text.Trim(); /这里客户端套接字连接到网络节点(服务端)用的方法是Connect 而不是Bind socketClient.Connect(endpoint); /创建一个线程 用于监听服务端发来的消息 threadClient = new Thread(RecMsg); /将窗体线程设置为与后台同步 threadClient.IsBackground = true; /启动线程 threadClient.Start(); / / 接收服务端发来信息的方法 / private void RecMsg() while (true) /持续监听服务端发来的消息 /定义一个1M的内存缓冲区 用于临时性存储接收到的信息 byte arrRecMsg = new byte1024 * 1024; /将客户端套接字接收到的数据存入内存缓冲区, 并获取其长度 int length = socketClient.Receive(arrRecMsg); /将套接字获取到的字节数组转换为人可以看懂的字符串 string strRecMsg = Encoding.UTF8.GetString(arrRecMsg, 0, length); /将发送的信息追加到聊天内容文本框中 txtMsg.AppendText(So-flash: + GetCurrentTime() + rn + strRecMsg + rn); / / 发送字符串信息到服务端的方法 / / 发送的字符串信息 private void ClientSendMsg(string sendMsg) /将输入的内容字符串转换为机器可以识别的字节数组 byte arrClientSendMsg = Encoding.UTF8.GetBytes(sendMsg); /调用客户端套接字发送字节数组 socketClient.Send(arrClientSendMsg); /将发送的信息追加到聊天内容文本框中 txtMsg.AppendText(天之涯: + GetCurrentTime() + rn + sendMsg + rn); /点击按钮btnSend 向服务端发送信息 private void btnSend_Click(object sender, EventArgs e) /调用ClientSendMsg方法 将文本框中输入的信息发送给服务端 ClientSendMsg(txtCMsg.Text.Trim(); /快捷键 Enter发送信息 private void txtCMsg_KeyDown(object sender, KeyEventArgs e) /当光标位于文本框时 如果用户按下了键盘上的Enter键 if (e.KeyCode = Keys.Enter) /则调用客户端向服务端发送信息的方法 ClientSendMsg(txtCMsg.Text.Trim(); / / 获取当前系统时间的方法 / / 当前时间 private D
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 浴室洗头防滑安全防护措施
- 多学科协作下的意识状态分级护理模式
- 医学职业卫生临终关怀护士防护案例教学课件
- 急诊绿色通道成本优化方案
- 读懂宝宝的“悄悄话”:新生儿情绪与心理解读
- 双J管冲管技术与引流系统维护
- 产科护理团队协作的母婴护理理论
- 双J管拔管前后的注意事项
- 卵巢年轻气色自然透亮
- 常见护理文书书写规范
- 2025河北邯郸市产业投资集团有限公司下属企业专业人才招聘78人笔试考试备考试题及答案解析
- 大跨度钢结构厂房吊装方案
- 2025年挖掘机驾驶员岗位招聘面试参考试题及参考答案
- 2025年中央八项规定精神学习教育题库及答案
- 福建省福州市【统招专升本】计算机真题(含答案)
- 统编版九年级上册语文期末复习:全册重点考点手册
- 慢性心力衰竭患者姑息治疗与安宁疗护方案
- 学堂在线 研究生素养课-积极心理与情绪智慧 章节测试答案
- 孤独的小螃蟹ppt
- 大连理工大学现代远程教育
- 薄膜干涉(课堂PPT)
评论
0/150
提交评论