zoukankan      html  css  js  c++  java
  • 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)."
    ";
    25 }
    26 
    27 if(($ret = socket_bind($sock,$ip,$port)) < 0) {
    28     echo "socket_bind() 失败的原因是:".socket_strerror($ret)."
    ";
    29 }
    30 
    31 if(($ret = socket_listen($sock,4)) < 0) {
    32     echo "socket_listen() 失败的原因是:".socket_strerror($ret)."
    ";
    33 }
    34 
    35 $count = 0;
    36 
    37 do {
    38     if (($msgsock = socket_accept($sock)) < 0) {
    39         echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "
    ";
    40         break;
    41     } else {
    42         
    43         //发到客户端
    44         $msg ="测试成功!
    ";
    45         socket_write($msgsock, $msg, strlen($msg));
    46         
    47         echo "测试成功了啊
    ";
    48         $buf = socket_read($msgsock,8192);
    49         
    50         
    51         $talkback = "收到的信息:$buf
    ";
    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 } 
    View Code

    例子也是别人的,改改就用过了。

    使用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;
    }
  • 相关阅读:
    Linux 网络编程六(socket通信UDP版)
    Redis 集群方案介绍
    华为交换机STP 根ID优先级设置
    Pacemaker+Corosync搭建PostgreSQL集群
    SpookyOTP
    世界级的开源项目:TiDB 如何重新定义下一代关系型数据库
    TiDB
    Fiddler显示响应时间 显示服务器IP
    DNS记录类型名单
    Django models中关于blank与null
  • 原文地址:https://www.cnblogs.com/lobsterIT/p/4610501.html
Copyright © 2011-2022 走看看