导航:首页 > 编程语言 > php向socket

php向socket

发布时间:2024-04-21 23:53:59

① 请教php大神,php如何实现点击页面上的一个按钮发送socket的tcp数据

1.参考资料

socket_create()函数需要三个参数:一个协议、一个socket类型、一个公共协议。socket_create()函数运行成功返回一个

包含socket的资源类型,如果没有成功则返回false。

Socket函数
函数名 描述
函数名 描述
socket_accept() 接受一个Socket连接
socket_bind() 把socket绑定在一个IP地址和端口上
socket_clear_error() 清除socket的错误或最后的错误代码
socket_close() 关闭一个socket资源
socket_connect() 开始一个socket连接
socket_create_listen() 在指定端口打开一个socket监听
socket_create_pair() 产生一对没有差别的socket到一个数组里
socket_create() 产生一个socket,相当于产生一个socket的数据结构
socket_get_option() 获取socket选项
socket_getpeername() 获取远程类似主机的ip地址
socket_getsockname() 获取本地socket的ip地址
socket_iovec_add() 添加一个新的向量到一个分散/聚合的数组
socket_iovec_alloc() 这个函数创建一个能够发送接收读写的iovec数据结构
socket_iovec_delete() 删除一个已分配的iovec
socket_iovec_fetch() 返回指定的iovec资源的数据
socket_iovec_free() 释放一个iovec资源
socket_iovec_set() 设置iovec的数据新值
socket_last_error() 获取当前socket的最后错误代码
socket_listen() 监听由指定socket的所有连接
socket_read() 读取指定长度的数据
socket_readv() 读取从分散/聚合数组过来的数据
socket_recv() 从socket里结束数据到缓存
socket_recvfrom() 接受数据从指定的socket,如果没有指定则默认当前socket
socket_recvmsg() 从iovec里接受消息
socket_select() 多路选择
socket_send() 这个函数发送数据到已连接的socket
socket_sendmsg() 发送消息到socket
socket_sendto() 发送消息到指定地址的socket
socket_set_block() 在socket里设置为块模式
socket_set_nonblock() socket里设置为非块模式
socket_set_option() 设置socket选项
socket_shutdown() 这个函数允许你关闭读、写、或指定的socket
socket_strerror() 返回指定错误号的周详错误
socket_write() 写数据到socket缓存
socket_writev() 写数据到分散/聚合数组

2.代码:

<?php
$sendStr='30323034033033';//16进制数据
$sendStrArray=str_split(str_replace('','',$sendStr),2);//将16进制数据转换成两个一组的数组
$socket=socket_create(AF_INET,SOCK_STREAM,getprotobyname("tcp"));//创建Socket
if(socket_connect($socket,"192.168.1.100",8080)){//连接
for($j=0;$j<count($sendStrArray);$j++){
socket_write($socket,chr(hexdec($sendStrArray[$j])));//逐组数据发送
}
$receiveStr="";
$receiveStr=socket_read($socket,1024,PHP_BINARY_READ);//采用2进制方式接收数据
$receiveStrHex=bin2hex($receiveStr);//将2进制数据转换成16进制
echo"client:".$receiveStrHex;
}
socket_close($socket);//关闭Socket
?>

② php用socket获得客户端的ip和端口

socket_getpeername() 获取远程类似主机的ip地址
socket_getsockname() 获取本地socket的ip地址
怎么感觉你用的实际上是对的,难道用nginx一类的负载均衡服务器了

③ php可不可以socket通信长连接,不断开,然后实现多次通讯

理论上是可以的,使用PHP提供的socket相关API,主要问题是脚本执行时间。

PHP运行模式分为非命令行模式及命令行模式。
非命令行模式一般是用于B/S交互,max_execution_time默认为非零,也就是限制脚本执行时间。即使你设置max_execution_time为0也面临用户浏览器请求的超时问题。
命令行模式下set_limit_time默认为0,做为本地脚本执行,所以没有上述的问题。

PHP SOCKET相关文档:
http://cn2.php.net/manual/zh/book.sockets.php

④ 想问下php的socket的工作流程是什么

PHP 使用Berkley的socket库来创建它的连接。你可以知道socket只不过是一个数据结构。你使用这个socket数据结构去开始一个客户端和服务器之间的会话。这个服务器是一直在监听准备产生一个新的会话。当一个客户端连接服务器,它就打开服务器正在进行监听的一个端口进行会话。这时,服务器端接受客户端的连接请求,那么就进行一次循环。现在这个客户端就能够发送信息到服务器,服务器也能发送信息给客户端。
产生一个Socket,你需要三个变量:一个协议、一个socket类型和一个公共协议类型。产生一个socket有三种协议供选择,继续看下面的内容来获取详细的协议内容。
定义一个公共的协议类型是进行连接一个必不可少的元素。下面的表我们看看有那些公共的协议类型。

表一:协议
名字/常量 描述
AF_INET 这是大多数用来产生socket的协议,使用TCP或UDP来传输,用在IPv4的地址
AF_INET6 与上面类似,不过是来用在IPv6的地址
AF_UNIX 本地协议,使用在Unix和linux系统上,它很少使用,一般都是当客户端和服务器在同一台及其上的时候使用
表二:Socket类型
名字/常量 描述
SOCK_STREAM 这个协议是按照顺序的、可靠的、数据完整的基于字节流的连接。这是一个使用最多的socket类型,这个socket是使用TCP来进行传输。
SOCK_DGRAM 这个协议是无连接的、固定长度的传输调用。该协议是不可靠的,使用UDP来进行它的连接。
SOCK_SEQPACKET 这个协议是双线路的、可靠的连接,发送固定长度的数据包进行传输。必须把这个包完整的接受才能进行读取。
SOCK_RAW 这个socket类型提供单一的网络访问,这个socket类型使用ICMP公共协议。(ping、traceroute使用该协议)
SOCK_RDM 这个类型是很少使用的,在大部分的操作系统上没有实现,它是提供给数据链路层使用,不保证数据包的顺序

表三:公共协议
名字/常量 描述
ICMP 互联网控制消息协议,主要使用在网关和主机上,用来检查网络状况和报告错误信息
UDP 用户数据报文协议,它是一个无连接,不可靠的传输协议
TCP 传输控制协议,这是一个使用最多的可靠的公共协议,它能保证数据包能够到达接受者那儿,如果在传输过程中发生错误,那么它将重新发送出错数据包。

现在你知道了产生一个socket的三个元素,那么我们就在php中使用socket_create()函数来产生一个socket。这个 socket_create()函数需要三个参数:一个协议、一个socket类型、一个公共协议。socket_create()函数运行成功返回一个包含socket的资源类型,如果没有成功则返回false。
Resourece socket_create(int protocol, int socketType, int commonProtocol);

现在你产生一个socket,然后呢?php提供了几个操纵socket的函数。你能够绑定socket到一个IP,监听一个socket的通信,接受一个socket;现在我们来看一个例子,了解函数是如何产生、接受和监听一个socket。

<?php
$commonProtocol = getprotobyname(“tcp”);
$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);
socket_bind($socket, ‘localhost’, 1337);
socket_listen($socket);
// More socket functionality to come
?>

上面这个例子产生一个你自己的服务器端。例子第一行,
$commonProtocol = getprotobyname(“tcp”);
使用公共协议名字来获取一个协议类型。在这里使用的是TCP公共协议,如果你想使用UDP或者ICMP协议,那么你应该把getprotobyname() 函数的参数改为“udp”或“icmp”。还有一个可选的办法是不使用getprotobyname()函数而是指定SOL_TCP或SOL_UDP在 socket_create()函数中。
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
例子的第二行是产生一个socket并且返回一个socket资源的实例。在你有了一个socket资源的实例以后,你就必须把socket绑定到一个IP地址和某一个端口上。

⑤ 关于php中socket的问题:

这是socket的服务端的代码,监听的ip地址是192.168.168.121,端口号为8528


请检查以下几点

  1. 这个ip是不是代码所在服务器的ip,一般监测内网ip,如127.0.0.1

  2. 端口号是否被使用,可以使用cmd命令 netstat -ano|findstr 8528 查找端口号为8528的端口使用情况

  3. 如果要给在公网上使用,请使用公网ip,这样可以外网使用

  4. 如果代码不报错可以试下telnet下你的端口号,看是否可以使用

    如 telnet 127.0.0.1 8528

解决方案

查看你电脑的ip地址,把上面代码里“$address = '192.168.168.121';”这个ip地址换成“$address = '127.0.0.1';”或者你电脑的ip地址,再试试。

(ip地址改成127.0.0.1后,这段代码在我电脑上可以使用)

⑥ PHP如何开启socket

如果你是windows系统,请进入安装目录,找到php.ini这个文件,找到下面一行。
找到extension=php_sockets.dll一句,将前面的;去掉
;是注释的意思。

如果你的Linux系统,重新编译,./configure --help,自己看去,相信你懂的,你也必须学着看这个了。想看看自己的php是否有这个拓展,使用php -m命令来看,如果有,就不用重新编译了。
--enable-sockets

⑦ 想用PHP做Socket服务器,不知道如何实现同时和多个不同客户端数据交互

因为只有调用了accept客户端才能连上,你如果accept下面接一个循环,那么第二个用户不是说能不能进这个循环,而是连不进……此时只有第一个用户break出了循环,然后程序回头再调用accept,第二个用户才能连上。
用多进程来处理如何?因为accept一个客户端以后,应该是马上准备accept下一个客户端才对,而不是处理完现在这个客户端才accept下一个客户端。
socket_accept以后,直接调用
pcntl_fork(),此时进程会分裂为两个,其中一个的pnctl_fork返回值是0,另一个不是0。不是0的那个直接继续调用socket_accept即可,是0的那个处理客户端请求。
pnctl_fork不知道在windows下能不能用。
不过返回不是0的那个进程并不是这样就完事了,还要调用pcntl_wait防止子进程卡在那边没有完全结束。你可以在主进程里时不时就调用这个,配上WNOHANG作为option参数防止没有子进程需要wait的时候卡在那边。
这都是linux下常用的处理手段。说实话本来我想让你用多线程的,不过看了一圈不知道php里怎么用线程,倒是找到了用进程的方式,所以就

阅读全文

与php向socket相关的资料

热点内容
格力空调压缩机阻值 浏览:552
喷码机的单片机原理 浏览:842
如何评估一个算法的效益率 浏览:205
线性代数辅导pdf 浏览:991
贵州戴尔服务器创新服务云主机 浏览:559
如何在小米电视上安装电视家app 浏览:182
苹果手机如何隐藏单个app软件 浏览:963
多路服务器有什么用 浏览:859
如何找培训班app 浏览:580
临时文件夹怎么转到其他盘 浏览:179
android布局按比例 浏览:602
安卓模拟器怎么能当手机用 浏览:885
手机怎样查看服务器ip地址冲突 浏览:812
程序员有没有必要找家教 浏览:783
什么编译器可以带c11函数 浏览:18
如何理解程序员对自己电脑的感情 浏览:525
什么是短信app 浏览:752
我的世界服务器启动器下载地址 浏览:790
云服务器公ip和内ip 浏览:948
手机淘宝app授权在哪里 浏览:472