php socket 通信
1 <?php 2 //确保在连接客户端时不会超时 3 set_time_limit(0); 4 5 $ip = '139.129.15.159'; 6 $port = 1234; 7 8 /* 9 +------------------------------- 10 * @socket通信整个过程 11 +------------------------------- 12 * @socket_create 13 * @socket_bind 14 * @socket_listen 15 * @socket_accept 16 * @socket_read 17 * @socket_write 18 * @socket_close 19 +-------------------------------- 20 */ 21 22 /*---------------- 以下操作都是手册上的 -------------------*/ 23 if(($sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP)) < 0) { 24 echo "socket_create() 失败的原因是:".socket_strerror($sock)."\n"; 25 } 26 27 if(($ret = socket_bind($sock,$ip,$port)) < 0) { 28 echo "socket_bind() 失败的原因是:".socket_strerror($ret)."\n"; 29 } 30 31 if(($ret = socket_listen($sock,4)) < 0) { 32 echo "socket_listen() 失败的原因是:".socket_strerror($ret)."\n"; 33 } 34 35 $count = 0; 36 37 do { 38 if (($msgsock = socket_accept($sock)) < 0) { 39 echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n"; 40 break; 41 } else { 42 43 //发到客户端 44 $msg ="测试成功!\n"; 45 socket_write($msgsock, $msg, strlen($msg)); 46 47 echo "测试成功了啊\n"; 48 $buf = socket_read($msgsock,8192); 49 50 51 $talkback = "收到的信息:$buf\n"; 52 echo $talkback; 53 54 if(++$count >= 5){ 55 break; 56 }; 57 58 59 } 60 //echo $buf; 61 socket_close($msgsock); 62 63 } while (true); 64 65 socket_close($sock); 66 ?>
上面是server.php
服务器是php环境,但是需要用到socket通信,不得已去看看php socket如何通信,php 有自己封装的一系列socket 简单实用 这是简单的小实例。
客户端是用C++实现的。后面需要用到多线程通信,在慢慢研究。
client.cpp
1 #include "winsock2.h" 2 #include <iostream> 3 #pragma comment(lib, "ws2_32.lib") 4 5 using namespace std; 6 BOOL RecvLine(SOCKET s, char* buf); //读取一行数据 7 8 int main(int argc, char* argv[]) 9 { 10 const int BUF_SIZE = 64; 11 12 WSADATA wsd; //WSADATA变量 13 SOCKET sHost; //服务器套接字 14 SOCKADDR_IN servAddr; //服务器地址 15 char buf[BUF_SIZE]; //接收数据缓冲区 16 char bufRecv[BUF_SIZE]; 17 int retVal; //返回值 18 //初始化套结字动态库 19 if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) 20 { 21 cout << "WSAStartup failed!" << endl; 22 return -1; 23 } 24 //创建套接字 25 sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 26 27 if(INVALID_SOCKET == sHost) 28 { 29 cout << "socket failed!" << endl; 30 WSACleanup();//释放套接字资源 31 return -1; 32 } 33 34 //设置服务器地址 35 servAddr.sin_family =AF_INET; 36 servAddr.sin_addr.s_addr = inet_addr("139.129.15.159"); 37 servAddr.sin_port = htons((short)1234); 38 int nServAddlen = sizeof(servAddr); 39 40 //连接服务器 41 retVal=connect(sHost,(LPSOCKADDR)&servAddr, sizeof(servAddr)); 42 if(SOCKET_ERROR == retVal) 43 { 44 cout << "connect failed!" <<retVal<< endl; 45 closesocket(sHost); //关闭套接字 46 WSACleanup(); //释放套接字资源 47 return -1; 48 } 49 ZeroMemory(bufRecv, BUF_SIZE); 50 while(true){ 51 //向服务器发送数据 52 //ZeroMemory(buf, BUF_SIZE); 53 //cout << " 向服务器发送数据: "; 54 //cin >> buf; 55 //retVal = send(sHost, buf, strlen(buf), 0); 56 // if (SOCKET_ERROR == retVal) 57 // { 58 // cout << "send failed!" << endl; 59 // closesocket(sHost); //关闭套接字 60 // WSACleanup(); //释放套接字资源 61 // return -1; 62 // } 63 //RecvLine(sHost, bufRecv); 64 65 recv(sHost, bufRecv,BUF_SIZE , 0); // 接收服务器端的数据, 只接收5个字符 66 if(bufRecv[0] != '0') cout << endl <<"从服务器接收数据:" << bufRecv<< endl; 67 else break; 68 } 69 //退出 70 closesocket(sHost); //关闭套接字 71 WSACleanup(); //释放套接字资源 72 return 0; 73 }
例子也是别人的,改改就用过了。
使用socket通信 ,只要按照正常的协议来就行了,没必要纠结语言什么的。都是独立的部分。
如果socket连接失败的时候去查看下 是否开启的防火墙,我的就是把代码放到服务器上,防火墙开启了,同时端口没有被放行。
简单的方法就是 关掉防火墙。
如果不想关,就添加放行端口,控制面板=》防火墙=》高级设置=》入站规则=》新建规则=》端口=。。。。一步步来就成了。
下面是用c++实现的服务器端。
#include "winsock2.h" #pragma comment(lib, "ws2_32.lib") #include <iostream> using namespace std; int main(int argc, char* argv[]) { const int BUF_SIZE = 64; WSADATA wsd; //WSADATA变量 SOCKET sServer; //服务器套接字 SOCKET sClient; //客户端套接字 SOCKADDR_IN addrServ;; //服务器地址 char buf[BUF_SIZE]; //接收数据缓冲区 char sendBuf[BUF_SIZE];//返回给客户端得数据 int retVal; //返回值 //初始化套结字动态库 if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) { cout << "WSAStartup failed!" << endl; return 1; } //创建套接字 sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(INVALID_SOCKET == sServer) { cout << "socket failed!" << endl; WSACleanup();//释放套接字资源; return -1; } //服务器套接字地址 addrServ.sin_family = AF_INET; addrServ.sin_port = htons(1234); addrServ.sin_addr.s_addr = INADDR_ANY; //绑定套接字 retVal = bind(sServer, (LPSOCKADDR)&addrServ, sizeof(SOCKADDR_IN)); if(SOCKET_ERROR == retVal) { cout << "bind failed!" << endl; closesocket(sServer); //关闭套接字 WSACleanup(); //释放套接字资源; return -1; } //开始监听 retVal = listen(sServer, 1); if(SOCKET_ERROR == retVal) { cout << "listen failed!" << endl; closesocket(sServer); //关闭套接字 WSACleanup(); //释放套接字资源; return -1; } //接受客户端请求 sockaddr_in addrClient; int addrClientlen = sizeof(addrClient); sClient = accept(sServer,(sockaddr FAR*)&addrClient, &addrClientlen); if(INVALID_SOCKET == sClient) { cout << "accept failed!" << endl; closesocket(sServer); //关闭套接字 WSACleanup(); //释放套接字资源; return -1; } while(true){ //接收客户端数据 ZeroMemory(buf, BUF_SIZE); // retVal = recv(sClient, buf, BUF_SIZE, 0); // if (SOCKET_ERROR == retVal) // { // cout << "recv failed!" << endl; // closesocket(sServer); //关闭套接字 // closesocket(sClient); //关闭套接字 // WSACleanup(); //释放套接字资源; // return -1; // } // if(buf[0] == '0') // break; // cout << "客户端发送的数据: " << buf <<endl; cout << "向客户端发送数据: " ; cin >> sendBuf; send(sClient, sendBuf, strlen(sendBuf), 0); if(sendBuf[0]=='0') break; } //退出 closesocket(sServer); //关闭套接字 closesocket(sClient); //关闭套接字 WSACleanup(); //释放套接字资源; return 0; }