php的socket通信

TCP/IP:传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的
UDP:用户数据报协议,是与tcp相对应的协议。他是属于TCP/IP协议的一种

1.socket是什么?

socket是应用层和TCP/IP协议族通信的中间软件抽象层
它是一组接口
在设计模式中,Socket其实就是一个门面模式。是一组接口,把复杂的TCP/IP协议族隐藏在Socket接口后面
对用户来说,一组简单的就口就是全部,让socket去组织数据,以符合指定的协议
在这里插入图片描述

2.代码:

server.php

<?php

set_time_limit(0);
$ip = '127.0.0.1';
$port = 8888;

//1.初始化socket
$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);//创建服务端的socket套接流,net协议为IPv4,protocol协议为TCP

//2.端口绑定
if (socket_bind($socket,$ip,$port) == false)/*绑定接收的套接流主机和端口,与客户端相对应*/
{
    echo "server bind fail:".socket_strerror(socket_last_error());
}

//3.对端口进行监听
if (socket_listen($socket,4) == false)
{
    echo "server listen fail:".socket_strerror(socket_last_error());
}

//4.调用accept阻塞,等待客户端连接
do{
    $accept_resource = socket_accept($socket);
    /*socket_accept的作用就是接受socket_bind()所绑定的主机发过来的套接流*/
    if ($accept_resource!==false)
    {
        //5.接受客户端请求数据
        $string = socket_read($accept_resource,1024);
        /*socket_read的作用就是读出socket_accept()的资源并把它转化为字符串*/
        echo "Receive:".$string.PHP_EOL;
        if ($string!==false){
            $return_client = "消息已经接收:".date("Y-m-d H:i:s").PHP_EOL;
            //6.回应数据发送给客户端
            socket_write($accept_resource,$return_client,strlen($string));
            /*socket_write的作用是向socket_create的套接流写入信息,或者向socket_accept的套接流写入信息*/
        }else{
            echo "socket_read is fail";
        }

    }
}while(true);
socket_close($socket);

client.php

<?php
//初始化一个Socket 创建一个socket套接流
$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
//接收套接流的最大超时时间1秒,后面是微秒单位超时时间,设置为零,表示不管它
socket_set_option($socket,SOL_SOCKET,SO_RCVTIMEO,array("sec"=>1,"usec"=>0));
//发送套接流的最大超时时间为6秒
socket_set_option($socket,SOL_SOCKET,SO_SNDTIMEO,array("sec"=>6,"usec"=>0));
//连接服务端的套接流,这一步就是使客户端与服务器端的套接流建立联系
if (socket_connect($socket,'127.0.0.1',8888) == false)
{
    echo "connect fail message:".socket_strerror(socket_last_error());
}else{
    $message = "hello,server";
    $message = mb_convert_encoding($message,'GBK','UTF-8');
    //向服务端写入字符串信息
    if (socket_write($socket,$message,strlen($message)) == false)
    {
        echo 'fail to write'.socket_strerror(socket_last_error());
    }
    //读取服务端返回来的套接流信息
    while ($callback = socket_read($socket,1024))
    {
        echo 'server return message is:'.$callback.PHP_EOL;
    }
}

socket_close($socket);



3.运行结果:

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值