四川师范大学成都学院计算机网络编程实训报告
与客户端建立连接,实现socket通信,对于服务器端是先接受数据流然后再发送数据流,客服端发送过来的信息经服务器端然后转发到其他所有的客户端,服务器端相当于中间的桥梁。
客户端要求主要实现的功能是建立一个图形的界面,用于显示聊天信息等,并且建立与服务器端的通信,主动的向服务器端发送连接请求,然后对输入文本框注册事件监听并且发送给客服端,不断的监听服务器端发来的信息,然后显示出来。
2.1 原理概述
采用UDP协议,通过服务器中转方式。因此,现在的IP侦探在你仅仅跟对方发送聊天消息的时候是无法获取到IP的。UDP 协议是不可靠协议,它只管发送,不管对方是否收到。但它的传输很高效,因为UDP协议排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使速度得到了保证。例如,腾讯采用了上层协议来保证可靠传输:如果客户端使用UDP协议发出消息后,服务器收到该包,需要使用UDP协议发回一个应答包。如此来保证消息可以无遗漏传输。 2.2 设计概述
2.2.1创建套接字
服务进程和客户进程在实现通信前必须创建各自的套接字,然后才能用相应的套接字进行发送接收操作,服务进程总是先于客户端进程启动,服务器端进程和客户端进程创建套接字。Socket()函数实现代码如下:
SOCKET serSocket=socket(AF_INET,SOCK_STREAM,0);//创建了可识别套接字
2.2.2 地址绑定
当调用socket()创建套接字后,服务器必须把套接字与自己的地址显式地建立联系,以便客户端向该IP地址和端口号的服务进程请求服务,这个过程是通过调用函数bind()实现的。bind()函数原型如下:int bind(SOCKET s ,const struct sockaddr FAR*name ,int namelen)
2.2.3 服务器套接字置为监听模式
将服务器设置为监听工作方式后,使用API调用listen():int listen(SOCKET s, int backlog);第一个参数指定套接字。第二个参数指定了正在等待连接的最大队列长度。若无错误发生,则listen()函数返回0。
6
四川师范大学成都学院计算机网络编程实训报告
2.2.4建立连接,进行文件传输
调用gets(path)获得传输文件的路径和存放文件路径,这个过程中还需调用send()函数和recv()函数,共同协调实现文件传送。
3 详细设计
3.1流程图
登陆窗口 是否拥有账号 N 注册账号 N 输入信息是否合格 Y 注册成功 用已注册账号登陆 N 登陆是否成功 Y 登陆成功 好友是否在线 Y N 传送文字 添加好友 退出系统 图3.1-1 工作流程图
客户端建立一个seversocket的类,并且创建一个vector用来管理客户端的线程,然后就开始检测,如果有客户端请求与服务器连接就与其建立socket连接,
7
四川师范大学成都学院计算机网络编程实训报告
创建进程设置ID,告诉其他的客户端有新的客户端接入,然后开始监听所有的客户端线程如果有信息通过端口进入就接受然后再发送给其他客户端,如果有客户端退出,就会告诉其他的客户端并且关闭与该客户端的socket连接,然后在vector里面删除相应的线程.
4界面设计与运行效果图
4.1用户登录界面
图4.1-1 聊天登陆界面
注意点:
1. 如果用户没有输入用户名,系统将显示一条错误消息,指出错误并提示用户输入用户名;
2. 如果用户没有输入密码,系统将显示一条错误消息,指出错误并提示用户输入密码;
3. 如果用户输入的用户名未被注册,系统提示用户输入的用户名不存在。 4.如果用户输入的用户名密码错误,系统将显示一条错误消息,指出错误并
8
四川师范大学成都学院计算机网络编程实训报告
提示用户输入正确的用户名和密码; 4.2用户运行界面
在MyChat和Server中输入地址127.0.0.1,端口号5558,以及用户名和密码后点击服务器的”OK”键。
图4.2-1 用户运行界面
如果在Server中按下Cancle键后。
图4.2-2 用户运行界面
如果点击MyChat的登陆键后。
图4.2-3 用户运行界面
如果重新输入密码和用户名后点击登陆键后,先前的用户就处于离线状态,
9
四川师范大学成都学院计算机网络编程实训报告
重新输入的用户处于在线状态。
图4.2-4 用户运行界面
在Server的头像上点击鼠标右键按删除键后就会删除MyChat和Server的头像。
图4.2-5 用户运行界面
双击头像后在输入框内输入要说的内容。
10