简单聊天程序的设计与实现实验报告

  • 格式:doc
  • 大小:24.00 KB
  • 文档页数:8

下载文档原格式

  / 12
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验2.7 简单聊天程序的设计与实现

班级:计科1301 学号:201350080105 姓名:张蓉

一、实验目的

1,掌握Socket 程序设计方法

2,掌握基于Socket 的聊天程序设计方法

3,进一步熟悉C语言或其他程序设计语言

二、实验设备

硬件:运行Windows操作系统的计算机

软件:C语言或其他程序设计语言开发环境

三、实验内容

1,使用基于Socket 的程序设计方法设计聊天客户端和服务器客户端程序

2,程序应能实现传输文字信息和聊天功能

四、基本原理

聊天程序是指能提供两人或多人聊天的应用程序,QQ程序采用的是C/S通信模式,服务器跟客户之间主要有一对多和多对多模式,一对多模式是在服务器和客户端之间用客户端程序登录,验证用户密码,获取在线好友等信息,多对多模式则是在客户端与客户端之间,在线好友直接通信聊天,每个客户端上有实现服务端和客户端两个功能的部分,前者用于接收聊天数据,后者用于发送聊天数

据。

用C/S模式进行通信时,作为客户端在请求与服务器连接时需要知道服务器端的IP地址和端口号,腾讯公司的服务器有固定公用网址,客户能很容易的回去服务器的相关信息,在客户端与客户端之间通信时,可以通过登录QQ,让QQ服务器端获得该用户的IP地址和端口号信息,然后通知其他要与该用户进行通信的用户,其他用户就可以连接该用户并与之通信。

五、程序实现

本程序采用基于面向无连接的UDP协议。

需要用到的函数有bind()、sendto()、recvfrom()等

设计一个基本的网络服务器有以下几个步骤:

1、初始化Windows Socket

2、创建一个监听的Socket

3、设置服务器地址信息,并将监听端口绑定到这个地址上

4、开始监听

5、接受客户端连接

6、和客户端通信

7、结束服务并清理Windows Socket和相关数据,或者返回第4步客户端程序框架类似

程序源代码:

(1)服务器端代码:

#include

#include

void main()

{

WORD wVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested = MAKEWORD(1, 1);

err = WSAStartup(wVersionRequested, &wsaData );

if (err != 0 )

{

return;

}

if (LOBYTE(wsaData.wVersion) != 1 ||

HIBYTE(wsaData.wVersion) != 1)

{

WSACleanup();

return;

}

SOCKET sockSrv = socket(AF_INET, SOCK_DGRAM, 0);

SOCKADDR_IN addrSrv;

addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

addrSrv.sin_family = AF_INET;

addrSrv.sin_port = htons(6666); //设置端口号为6666 bind(sockSrv, (sockaddr*)&addrSrv, sizeof(sockaddr));

char sendBuf[100];

char recvBuf[100];

char tempBuf[200];

int len = sizeof(sockaddr);

SOCKADDR_IN addrClient;

while(1)

{

recvfrom(sockSrv, tempBuf, strlen(tempBuf), 0,

(sockaddr*)&addrClient, &len);

if('q' != tempBuf[0])

{

sprintf(recvBuf, "%s say: %s", inet_ntoa (addrClient.sin_addr), tempBuf);

printf("%s\n", recvBuf);

printf("please input your data: ");

gets(sendBuf);

sendto(sockSrv, sendBuf, strlen(sendBuf) + 1, 0, (sockaddr*) &addrClient, len);

}

else // 若接收到'q',则退出聊天

{

printf("%s request to quit the chat platform.\n",

inet_ntoa(addrClient.sin_addr));

sendto(sockSrv, "q", strlen("q") + 1, 0, (sockaddr*)

&addrClient, len);

break;

}

}

closesocket(sockSrv);

WSACleanup();

}

(2)客户端代码:

#include

#include

void main()

{

WORD wVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested = MAKEWORD(1, 1);

err = WSAStartup(wVersionRequested, &wsaData);

if (err != 0)

{

return;

}

if(LOBYTE(wsaData.wVersion) != 1 ||

HIBYTE(wsaData.wVersion) != 1 )

{

WSACleanup();

return;

}

SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, 0);

SOCKADDR_IN addrSrv;