今天总结一下Socket的使用方法吧,有在百度。。上面找到的(下面有百度的链接,写的不全的地方,大家可以看一下链接,)。。。如果哪位大神有更换的demo,求分享!!!
Cocos2d-x中有关网络请求的:get post put delete(后两者我在开发中很少用),还有就是 Socket(用于及时通讯,网络游戏中的队友通话)。
在vs下面新建一个一个工程(记住不是Cocos项目!!!)C++文件。作为Server
百度上面的相关解释:http://baike.baidu.com/view/2355183.htm?fr=aladdin
ServerDemo.cpp:
// WebSocketDemo.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <WinSock2.h> #include <iostream> #include "windows.h" #pragma comment(lib,"ws2_32.lib") int _tmain(int argc,_TCHAR* argv[]) { //Windows下面的网络编程 WORD wVersionRequested; WSADATA wsaData; //用于接受Windows Socket 的结构信息 int err; wVersionRequested = MAKEWORD(1,1); //请求1.1版本的windows 库 err = WSAStartup(wVersionRequested,&wsaData); if (err !=0) { return -1; //返回值为 0 表示 成功申请 WSAStartup } if (LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1){ //检测低字节是不是 1 高字节是不是 1 ,确定是不是我们请求的 1.1版本 WSACleanup(); // 否则用这个函数清除信息,结束 return -1; } /************************************************************************/ /* 以上是windows需要添加的内容,Mac下面不用添加,直接抄写就行,每次都一样,以下才是服务器端需要写的代码 */ /************************************************************************/ // 1. 创建Socket //类型 、流式Socket 、协议 int socket_fd = socket(AF_INET,SOCK_STREAM,PF_UNSPEC); if (socket_fd == -1){//如果socket返回 -1就 返回,防止崩。。。。 printf("Server Socket Err"); return -1; } // 2. bind 绑定 sockaddr_in serverAddress; serverAddress.sin_family = AF_INET; //一般来说AF_INET(地址族)PF_INET(协议族) serverAddress.sin_addr.S_un.S_addr = htonl(ADDR_ANY); serverAddress.sin_port = htons(7777); //必须 加上 htons int bind_fd = bind(socket_fd,(sockaddr*)(&serverAddress),sizeof(serverAddress)); if (bind_fd == -1){ printf("bind fiald"); return -1; } // 3 .Listen 监听 if (listen(socket_fd,2) == -1){ printf("listen faild"); return -1; } // 4 .accept int client_fd; sockaddr_in clientAddress; int s = sizeof(clientAddress); client_fd = accept(socket_fd,(sockaddr *)&clientAddress,&s); if (client_fd == -1){ printf("accept falid"); return -1; } // 5 . receive while (true) { char buf[100]; int recv_data = recv(client_fd,buf,100,0); if (recv_data == -1){ printf("receive falid\n"); continue; }else if(recv_data == 0){ closesocket(socket_fd); }else{ // 6 .send 发送数据 printf("%s\n",buf); //打印客户端发来的数据 char sentData[100]; std::cin.getline(sentData,'\n'); //获取一行数据,以‘\n’结束 int sendLenght = send(client_fd,sentData,0); if (sendLenght == -1){ printf("send falid"); continue; } } } // 7 . close closesocket(client_fd); return 0; }
注意在开头引入的头文件,NotOneLess!!!
下面是客户端:
ClientDemo.cpp
// ClientSocketDemo.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <winsock.h> #include <iostream> #include "windows.h" #pragma comment(lib,_TCHAR* argv[]) { WORD wVersionRequested; WSADATA wsaData; //用于接受Windows Socket 的结构信息 int err; wVersionRequested = MAKEWORD(1,&wsaData); if (err !=0) { return -1; //返回值为 0 表示 成功申请 WSAStartup } if (LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1){ //检测低字节是不是 1 高字节是不是 1 ,确定是不是我们请求的 1.1版本 WSACleanup(); // 否则用这个函数清除信息,结束 return -1; } // 1 . socket,int socket_fd = socket(AF_INET,PF_UNSPEC); if (-1 == socket_fd){ printf("client socket falid"); return -1; } // 2 . contect sockaddr_in setverAddress; //服务器的地址 setverAddress.sin_port = htons(2223); //iP setverAddress.sin_family = AF_INET; setverAddress.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); int connect_fd = connect(socket_fd,(sockaddr *)&setverAddress,sizeof(setverAddress)); if (connect_fd == -1){ printf("contect falid "); return -1; } // 3 send while (true) { char sendData[100]; std::cin.getline(sendData,'\n'); if (send(socket_fd,sendData,0) == -1){ printf("send faild"); continue; } // 4 . receive char receData[100]; int receLen = recv(socket_fd,receData,0); if (receLen == -1){ printf("received faild "); continue; } printf("%s\n",receData); // 输出服务器传过来的 } // 5. close closesocket(socket_fd); getchar(); return 0; }
运行界面如图:
先启动Server ,在启动 client