HUNAN CITY UNIVERSITY
网络协议编程课程设计
说明书
设计题目:基于多线程的网络聊天控制台软件的设计与实现专业:网络工程
学生姓名:朱江
班级学号: 1206102-21
分组成员:1206102-06郭辉超1206102-18曾涛1206102-21朱江
指导教师:黄雪华老师汪彦老师
2015 年 07月 03日
《网络协议编程课程设计》报告
学号:1206102-21 姓名:朱江
一、设计时间
2015年06月29日-----07月03日。
二、设计地点
湖南城市学院信息楼507机房。
三、设计目的
1、巩固《网络协议编程》课程涉及的基本知识,培养灵活运用知识进行独立设计的能力;
2、掌握TCP/IP网络程序框架、Winsock API、高级网络编程API的使用;
3、提高综合运用所学的理论知识独立分析和解决问题的能力;
4、进一步熟悉利用Visual C++6.0进行开发的能力;
5、培养查阅资料,独立思考问题的能力。
四、设计小组成员
1206102-06 郭辉超,1206102-18 曾涛,1206102-21 朱江。
五、指导老师
黄雪华老师、汪彦老师。
六、设计课题
经过小组大部分组员的讨论,决定选取选题(基于多线程的网络聊天控制台软件的设计与实现),编写一个基于局域网的多线程控制台聊天系统。
理由:
1、此系统要求采用C/S模式实现,有利于进一步深刻理解和掌握这种基本的网络编程模式。
2、该系统功能相对简单,易于实现,适于初学者。
3、该系统牵涉到Winsock编程,需要灵活运用这些知识解决实际问题,有利于培养网络系统开发的实际动手能力。
七、基本思路及关键问题的解决方法
设计思路
对于聊天程序,一般都是采用 C/S 模式,即服务器/客户端的模式来设计。这样的模式有利于用户的操作和更好的用户体念。而客户端的设计主要关注与用户的体念和操作方便,其网络设计比较简单;服务器则要完成大量的客户控制、数据转发等操作,设计起来相对更加复杂。
总体设计
聊天程序是一个典型的网络程序,而网络程序的设计大多是基于 TCP/IP协议来实现的, TCP/IP协议是一个4层协议族,如图1所示。
聊天程序主要是依赖于传输层来实现,在传输层中有两个重要的协议:TCP协议和UDP协议。其中TCP协议(传输控制协议)是一个面向连接的协议,本协议在进行网络传输过程中首先必须建立一个安全的连接(通常是采用3次握手来实现的),UDP(用户数据报协议)是一种无连接的协议,本协议在进行数据传输前不用建立点对点的连接,所传输的
数据不会进行安全检查,如果有丢包的现象也不会重发,本文所涉及的聊天程序采用TCP 协议来实现由于每个电脑可能会有多个服务,而每个服务都采用同一个IP地址来进行收发数据,所以就必须采用一种机制来实现对每个服务的区分这就是端口,对于同一IP地址的不同端口号就代表了不同的服务,所以对于网络聊天程序的服务器端必须设定一个端口号,而客户端则必须连接到服务器端的IP和其指定的端口,如图2所示。
在本文的聊天程序中,采用客户端发送数据->服务器接收数据->服务器转发数据->客户端接收数据的流程来完成。由于该程序是一个服务器和多个客户端进行聊天的,所以在这里就必须注意以下几个问题:
①服务器需要监控端口,以便客户的随时连接;
②服务器需要监控数据流,以便随时接受来自客户端发来的数据;
③为了实现客户点对点的聊天,则将为每个客户建立一个线程。
服务器设计
服务器设计主要难点是对多线程的设计,在这里主要涉及到三方面的内容:
一是对客户端接入的监控,需要一个线程来完成;
二是分别为每个客户端创建一个线程,用于收发数据,使客户端之间不会彼此干扰;
三是每个客户端产生的线程对数据输入流进行监控,随时准备接收数据。对于数据则应该采用数据包的形式来进行封装,分别由发送者的地址,接收者的地址和数据构成,其中地址由昵称、IP和端口构成。当服务器接收到该数据后,将这些数据向每个客户端都发送出去,由客户端来决定是否接收该数据。
所示:另外,当客户端连接到服务器时,将向服务器发送一个数据包,服务器从数据包里面提取出客户端的地址信息和昵称,并且根据这些信息生成一张地址信息和昵称的对照表,且将这张表群发给每个客户;当有客户退出连接时,服务器则从对照表中将该客户的信息删除,并且群发该表给所有客户,
该表的形式如下:
地址昵称
127.0.0.1 朱江
客户端设计
对于客户端的设计则比服务器简单得多,主要是从界面等方便用户操作的角度来考虑。客户端主要需要完成连接服务器、数据收发等功能。对于数据收发功能主要通过数据流来实现。
八、算法及流程图
九、调试过程中出现的问题及相应解决办法
1.一开始在客户端与服务器进行通信时,只有服务器能看见客户端的消息,而客户端看不见服务器发的消息,之后我们发现这是因为在客户端接受消息的代码少了,在补全之后,双方都能接收信息。
2.之后我们想给这个段代码多添加一些其他的功能,首先添加时间,在此过程中我们一开始准备使用CTime t=CTime.getCurrentTime();这个方法,可是除了一些我们没能解决问题,后来经过询问老师和查询资料,最终我们使用了源程序中的获取时间的代码。
十、课程设计心得体会
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程,通过实验学习和领悟,充分的熟悉了VC++的运用和操作,并顺利完成实验,增强自身团队协作意识。
十一、源程序
客户端
#include "stdafx.h"
#include
#include
#pragma comment(lib,"WS2_32.lib")
#include
#include
SOCKET sockclient;
sockaddr_in sockaddrclient;
char sendbuf[100];