zoukankan      html  css  js  c++  java
  • Socket介绍

    Socket介绍

      什么是socket 所谓socket通常也称作"套接字",用于描述IP地址和端口 , 是一个通信链的句柄。应用程序通常通过“套接字”先服务器发出请求或者应答网络请求。

      在Internet上的主机一般运行了多个服务软件 , 同时提供集中服务。每种服务都打开一个Socket , 并绑定一个端口山谷 , 不同的端口对应于不同的服务。

      tcp->http(可以用来做网站或者相关服务)

      udp

    Socket连接过程

    根据链接启动的方式以及本地套接字要连接的目标 , 套节字之间的连接过程可以分为三个步骤:

    1、服务器监听:是服务器端套接字并不定位具体的客户端套接字 , 而是处于等待连接的状态 ,实时监控网络状态。

    2、客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先面熟它要连接的服务器的套接字,指出服务器套接字的地址和端口号 , 然后就像服务器端套接字提出连接请求。

    3、连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,他就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端 , 一旦客户确认了此描述 , 连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端接字的链接请求。

    一、测试环境:

      服务器ip:xxx.xxx.xxx.1

      客户端ip: xxx.xxx.xxx.2

    二 测试过程:

      客户端服务器将在本机(xxx.xxx.xxx.1)通过socket发送数据到服务端(xxx.xxx.xxx.2)的socket服务器上,服务端收到客户端发送的数据后返回一些给客户端.

      <?php

      //获取tcp协议号吗.

      $tcp = getprotobyname("tcp");

      //建立server端socket , 创建并返回一个套接字,也称做一个通讯节点.一个典型的网络连接由2个套接字构成 , 一个运行在客户端 , 另一个运行在服务器端.

      $socket = socket_create(AF_INFT , SOCK_STREAM , $tcp);

      //绑定要监听的ip和端口 , 这里绑定的ip一定要写局域网ip , 写成127.0.0.1客户端将无法与服务器端建议连接.

      socket_bind($socket , 'xxx.xxx.xxx.1' , 10008);

      //监听端口

      socket_listen($socket);

      //初始化一个数据 , 和客户端通信

      $buffer = "connect";

      while(true){

        //接受客户端请求过来的yigesocket连接

        $connection = socket-accept($scoket);

        if(!connection){

          echo "connect faild";

        } else {

        echo "Socket connected ";

        //向客户传递一个信息数据

       if($buffer != ""){

        echo "send data to client ";

        socket_write($connection , $buffer , " ");

        echo "Wrote to socket ";    

    } else {

        echo "no data in the buffer ";

    }   

      //从客户端获取得的数据

      while($data = $socket_read($connection , 1024 , PHP_NORMAL_READ)){

      printf("Buffer:".$data.' ');

      //取得信息给客户端一个反馈 ,Thank you client , you data is Received success发给客户端的回应信息.

      socket-wirte($coennection , "Thank you client , you data is Received success ");

    }

    }

    //关闭sockket

    socket_close($connection);

    printf("Closed the socket ");

      

      }

    ?>

    四 客户端文件内容:

     <?php

      //建立客户端的socket连接

      $socket = se);

      //连接服务器端socket

      $connection = socket_connect($socket , 'xxx.xxx.xxx.1' , 10008);

      //要求发送到服务端的信息.

      $send_data = "This data will Send to server!";

      //客户端去连接服务端并接受服务端返回的数据 , 如果返回的数据保护not connect就提示不能连接.

      while($buffer = @socket_read($socket , 1024,PHP_NORMAL_READ)){

        if(preg_match("/not connect/" , $buffer)){

        echo "don't connect ";

        break;

      } else {

      //服务端传来的信息

      echo "Buffer Data: ".$buffer .' ';

      echo "Writing to Socket ";

      //将客户的信息写道通道中 , 传给服务器端

      if(!socket_write($socket , "$send_data ")){

         echo "Write failed ";

      }

      //服务器端收到信息后 , 客户端接受服务端传给客户端的回应信息.

      while($buffer = socket_read($socket , 1024 , PHP_NORMAL_READ)){

        echo "send to server: $send-data response from server was:".$buffer." ";

      }

      }

      }

    ?>

    五、在服务端socket服务启动进程。

    #/usr/local/php/bin/php -a/home/server.php

    Interactive mode enable 互动模式启动

    六、服务端启动后查看启动的进程及端口

    #netstat -tnlp |grep 10008

    tcp   0  0 192.168.13:10008  0.0.0.0:*  LISTEN

    28892/php

    七、在客户端(192.168.1.2)上执行传输

    #/usr/local/php/bin/php -a client.php

    Interactive mode enabled

    八、回到服务器端上查看接受到的信息。

    #/usr/local/php/bin/php -a /home/server.php

    Interactive mode enabled

    Socket connected

    send data client

    Wrote to socket

    Buffer:This data will Send to server!

    9、参考资料

    socket_create()函数需要三个参数:一个协议、一个socket类型、一个公共协议。socket_create()函数运行成功返回一个包含socket的资源类型 , 如果没有成功则返回false.

    Socket函数

    函数名  描述

    socket_accept()  接受一个Socket连接

    socket_bind()  basocket绑定在哟个IP地址和端口上

    socket_close()  关闭一个socket资源

    socket_connect()  开始一个socket连接

    socket_create()  产生一个socket , 相当于产生一个socket的数据结构

    socket_read()  读取指定长度的数据

    socket_readv()  读取从分散/聚合数组过来的数据

    socket_send()  这个函数发送数据到已连接的socket

    sockt_write()  写数据到socket缓存

    socket_write()  写数据到分散/聚合数组

  • 相关阅读:
    7年.NET面试Java的尴尬历程
    服务挂后Dump日志
    并发中如何保证缓存DB双写一致性(JAVA栗子)
    如何通过Visual Studio来管理我们的数据库项目
    无需Get更多技能,快速打造一个可持久化的任务调度
    Dapper Use For Net
    2014年——新的开始,新的人生
    途牛网站无线架构变迁实践
    windows 下解决 Time_Wait 和 CLOSE_WAIT 方法
    System.Data.DbType 与其它DbType的映射关系
  • 原文地址:https://www.cnblogs.com/whrTC/p/10134700.html
Copyright © 2011-2022 走看看