您的位置:首页 > 理论基础 > 计算机网络

C/S 类型网络编程练习 猜数游戏

2015-10-16 08:57 666 查看
题目三:猜数游戏软件名:猜数游戏(分服务器端和客户端两部分)功能:游戏后台运行一个服务器软件,游戏者通过客户端程序登陆后,服务器随机产生一个1—100之间的随机数供游戏者猜,游戏者从客户端输入一个数值,如果该数比设定的数大,软件提示:“大了”,如果小,软件提示“小了”,若相等返回“猜对了,你共猜了*次”。服务器同时记录并维护一个游戏玩家的TOP10排行榜,供玩家查询。编程语言及工具:自选(如VB、JAVA、C#、Delphi、VC)描述:服务器端:接收客户端的命令请求并提供相应的服务。客户端:完成游戏人机界界面的设计,以命令的方式向服务器请求服务,并显示相应的提示。主要的命令有:1.CONNECT  IP地址  端口号指定游戏服务器的IP地址和端口号,连接到服务器。响应:连接成功/失败。2.LOGIN 用户名用户登录,报告服务器玩家的名字。响应:成功/失败。3.GUESS 数字猜数。响应:大了/小了/对了。4.LISTTOP10请求显示TOP10排行榜。响应:显示TOP10排行榜。5.EXIT退出游戏。Client:
#include<iostream>#include<winsock2.h>/*  interfAcer  *//*欢迎访问我的csdn blog  http://blog.csdn.net/nibiru_holmes*/ #pragma comment (lib,"ws2_32")using namespace std;int main(int argc, char * argv[]){while (TRUE) {WSADATA wsaData;WSAStartup(MAKEWORD(2, 2), &wsaData);SOCKET s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);                 //创建套接字sockaddr_in sockAddr;sockAddr.sin_family = PF_INET;sockAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");sockAddr.sin_port = htons(827);char szBufferAccpect[MAXBYTE] = { "NULL" };                             //接收服务器端发来的消息储存变量char szBuffer[MAXBYTE] = { "NULL" };char szBuffer1[65595] = { "NULL" };char usercheck[10] = { "login" };printf("I'm Client\r\n");connect(s, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));                    //给服务器端发送TCP链接请求cout << "connected to server" << endl;while (TRUE) {cout << "Client:";memset(szBuffer, 0, sizeof(szBuffer));                              //清理缓冲区cin >> szBuffer;                                                   //读入用户输入if (!strcmp(szBuffer, usercheck)) {                                 //判断用户是否要loginsend(s, szBuffer, strlen(szBuffer) + sizeof(char), NULL);printf("yourname:"); \memset(szBuffer, 0, sizeof(szBuffer));cin >> szBuffer;send(s, szBuffer, strlen(szBuffer) + sizeof(char), NULL);continue;}else if (!strcmp(szBuffer, "exit")) {cout << "exciting..\r\n";break;}send(s, szBuffer, strlen(szBuffer) + sizeof(char), NULL);memset(szBufferAccpect, 0, sizeof(szBufferAccpect));recv(s, szBufferAccpect, MAXBYTE, NULL);cout << "Server:";cout << szBufferAccpect << endl;}closesocket(s);                                                                     //关闭套接字 sWSACleanup();}return 0;}
Server:
<pre name="code" class="cpp">#include<winsock2.h>/*  interfAcer  *//*欢迎访问我的csdn blog  http://blog.csdn.net/nibiru_holmes*/ #include <windows.h>#include <tchar.h>#include <stdio.h>#include<iostream>#include <VersionHelpers.h>#include <string.h>#pragma comment (lib,"ws2_32")using namespace std;int check = 5;void rands() {                                            //产生随机数int nl = 0;int nj = 10;nl = rand() % nj;check = nl;}int main() {char top[MAXBYTE*2] = {NULL};WSADATA wsaData;WSAStartup(MAKEWORD(2, 2), &wsaData);                                                //初始化SOCKET s = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);                                //套接字s用于监听sockaddr_in sockaddr;sockaddr.sin_family = PF_INET;sockaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");sockaddr.sin_port = htons(827);sockaddr_in clientAddr = { NULL };int nSize = sizeof(SOCKADDR);SOCKET clientSock;bind(s, (SOCKADDR*)&sockaddr, sizeof(sockaddr));                                     //绑定套接字 ip,端口号char szBuffer[MAXBYTE] = {NULL};char szBufferAccpet[MAXBYTE] = { NULL };char RecvBuf[1024] = {NULL};char SendBuf[MAXBYTE] = { "hi" };char Usercheck[6] = {"login"};char User[MAXBYTE] = {"User"};char gettop[3] = { "-1" };char top10[10][30] = {NULL};char toptest[10][2] = {NULL};int usersum = 0;int read = 0;/// int check = 5;int Recv = 0;listen(s, 1);    //进行监听while (TRUE) {clientSock = accept(s, (SOCKADDR*)&clientAddr, &nSize);        //接受客户端的TCP请求printf(" 接受到一个连接 From:%s:%d \r\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port));rands();                                                        //产生随机数printf("the answer: %d", check);char sum[2] = "1";                                               //尝试次数while (true) {read = recv(clientSock, RecvBuf, 1024, 0);                   //接收客户端消息if (read <= 0) {break;}printf(RecvBuf);                                                //打印接收的消息memset(SendBuf, 0, sizeof(SendBuf));                          //清理缓存区Recv = atoi(RecvBuf);                                          //将char转换为intif (!strcmp(RecvBuf,gettop)) {                                 //判断客户端发送的消息是否为 get top 10memset(top,0,MAXBYTE);printf("get top\r\n");for (int j = 0; j < 10; j++) {strcat(top, top10[j]);printf(" top10  %s", top10[j]);}send(clientSock, top, MAXBYTE, 0);                        //给客户端发送top10 信息}else if (!strcmp(RecvBuf, Usercheck)) {                           //判断客户端发送的消息是否为 loginmemset(User,0,MAXBYTE);printf("login \r\n");recv(clientSock, RecvBuf, 1024, 0);printf("login new user:%s\r\n",RecvBuf);strcat(User,RecvBuf);                                       //将用户名存入 user表strcat(User, "  ");}else if (Recv > check) {                                     //猜解的数字 是否太大strcat(SendBuf, "too big:");strcat(SendBuf, sum);printf("too big\r\n");sum[0]++;send(clientSock, SendBuf, MAXBYTE, 0);}else if (Recv == check) {                                         //是否猜解正确strcat(SendBuf, "you are right!! test:");strcat(SendBuf, sum);//strcat(top, inet_ntoa(clientAddr.sin_addr));  //获取客户端ip 并记录在top10printf("suersum:%d !!!\r\n",usersum);int i = usersum-1;//if (i < 0) { i = 0; }printf("sum:%s  toptest:%s!!!\r\n", sum,toptest[i]);for ( i ; (i >=0) && (strcmp(sum,toptest[i])<0); i--) {             //寻找本次猜解在top10中的位置printf(" for i=:%d !!!\r\n", i);strcat(top10[i + 1], top10[i]);memset(top10[i], 0, 30);strcat(toptest[i + 1], toptest[i]);memset(toptest[i], 0, 2);//strcpy(top10[i]," ");}i++;if (i < 11) {                                                           //将本次用户名写入top10printf("write to top10 !!!\r\n");printf("i= %d\r\n",i);memset(top10[i], 0, 30);strcat(top10[i], "  UserName:");strcat(top10[i], User);strcat(top10[i], " test:");strcat(top10[i], sum);strcat(top10[i], "\r\n");strcat(toptest[i], sum);usersum++;}else { printf("isn't top10 !!!\r\n"); }printf("right! %s\r\n", sum);send(clientSock, SendBuf, MAXBYTE, 0);strcpy(sum,"1");}else {strcat(SendBuf, "too small:");strcat(SendBuf, sum);printf("too small\r\n");sum[0]++;send(clientSock, SendBuf, MAXBYTE, 0);}}}closesocket(clientSock);closesocket(s);WSACleanup();return 0;}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: