以PHP作为服务端进行TCP服务通讯

本文展示了如何使用PHP的Socket扩展进行TCP/IP通信,包括创建套接字、设置阻塞模式、绑定端口、监听连接、读写数据等操作。服务端代码创建了一个监听7228端口的服务器,接收并响应客户端消息,而客户端代码则演示了如何连接服务端并交互数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关键词 TCP/IP、PHP Socket扩展.
相关资料
知乎-PHP 下的 Socket 编程
php中连接tcp服务的三种方式
为什么socket叫套接字
PHP+Socket系列之实现客户端与服务端数据传输

相关函数
socket_create 创建套接字
socket_set_block 设置套接字为阻塞模式
socket_bind 给套接字绑定名字
socket_listen 监听套接字的连接
socket_accept 接受套接字上的连接
socket_read 从套接字中读取最大长度的数据
socket_write 向套接字写数据
socket_close 关闭 Socket 实例

因为项目需求,需要将硬件传递过来的信息整理并记录。而硬件是通过TCP/IP协议进行信息传输,所以需要以PHP作为服务端,接收信息。

服务端代码

<?php
set_time_limit(0);

if(($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === FALSE){
	echo '初始化socket失败: ' . socket_strerror(socket_last_error($socket));
	exit;
}
 
socket_set_nonblock($socket);
 
// socket_bind(): 将socket资源绑定到指定地址
if(!socket_bind($socket, '127.0.0.1', 7228)){
	echo '绑定端口失败: ' . socket_strerror(socket_last_error($socket));
	exit;
}
 
// socket_listen(): 监听socket的连接请求
if(!socket_listen($socket)){
	echo '监听端口: ' . socket_strerror(socket_last_error($socket));
	exit;
}

while(1){
	if(($client = socket_accept($socket)) !== FALSE){
		while(1){
			//这里不循环的话,只能接收到一次消息
			$content = socket_read($client, 10240);
			$content = trim($content);
			
			if($content == 'shutdown'){
				socket_close($client);
				break 2;
			}
			
			if($content){
				echo $content . PHP_EOL;
				$response = '接收信息成功!';
				//如果不给返回,客户端无法再发送消息
				socket_write($client, $response);
			}
		}
	}
}                 
socket_close($socket);

客户端代码

<?php

// 创建套接字
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

// 连接服务端
socket_connect($socket, '127.0.0.1', 7228);

while (true) {
    // 让控制台输入内容
    fwrite(STDOUT, '请输入内容:');
    $in = fgets(STDIN);

    // 向服务端发送内容
    socket_write($socket, $in);

    // 读取服务端发送的消息
    $msg = socket_read($socket, 10240);
    echo $msg;
}

从代码上看还挺简单的,但是背后还有更复杂的工作原理需要去了解学习。
不了解原理拿来套用哪里出问题都不明白原因,太痛苦了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值