PHP TcpServer和Client 收发十六进制和字符串 超时及等待用户输入

使用方法:

cd C:\phpStudy\php53

php C:\Users\Administrator\Desktop\chenhao\TcpServer.php

 

TcpServer收发十六进制和字符串 

<?php

//创建socket套接字
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
//设置阻塞模式
socket_set_block($socket);
//为套接字绑定ip和端口
socket_bind($socket,'192.168.100.1',18899);
//监听socket
socket_listen($socket,4);
echo "tcp server listen port: 18899 \n";
while(true)
{

    //接收客户端请求
    if(($msgsocket = socket_accept($socket)) !== false)
    {
    	 	//$str = "this is a service message";
        //向连接的客户端发送数据
        //socket_write($msgsocket, $str,strlen($str));
        
        $sendStr = '01 03 00 20 00 02 C5 C1';  // 16进制数据
        echo "TcpServer:".$sendStr."\n";
				$sendStrArray = str_split(str_replace(' ', '', $sendStr), 2);  // 将16进制数据转换成两个一组的数组
        //向连接的客户端发送数据 
				for ($j = 0; $j < count($sendStrArray); $j++) {

					socket_write($msgsocket, chr(hexdec($sendStrArray[$j])));  // 逐组数据发送
				}
				
        //读取请求内容
        //$buf = socket_read($msgsocket, 8192,PHP_BINARY_READ);
        //echo "Received msg: $buf \n";
        
        $receiveStr = "";
				$receiveStr = socket_read($msgsocket, 1024, PHP_BINARY_READ);  // 采用2进制方式接收数据
				$receiveStrHex = bin2hex($receiveStr);  // 将2进制数据转换成16进制
				echo "Client:" . $receiveStrHex ."\n";
  
        //操作完之后需要关闭该连接否则 feof() 函数无法正确识别打开的句柄是否读取完成
        socket_close($msgsocket);
    }
}

Client 收发十六进制和字符串

<?php
$sendStr = '01 03 00 20 00 02 C5 C1';  // 16进制数据
$sendStrArray = str_split(str_replace(' ', '', $sendStr), 2);  // 将16进制数据转换成两个一组的数组
$socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname("tcp"));  // 创建Socket
echo "正在连接:\n"
if (socket_connect($socket, "192.168.100.1", 18899)) {  //连接
for ($j = 0; $j < count($sendStrArray); $j++) {

	socket_write($socket, chr(hexdec($sendStrArray[$j])));  // 逐组数据发送
}

//向打开的套集字写入数据(发送数据)
//$st="socket send message";
//$length = strlen($st);
//$s = socket_write($socket, $st, $length);
//从套接字中获取服务器发送来的数据
//$msg = socket_read($socket,8190);
//echo $msg;
$receiveStr = "";
$receiveStr = socket_read($socket, 1024, PHP_BINARY_READ);  // 采用2进制方式接收数据
$receiveStrHex = bin2hex($receiveStr);  // 将2进制数据转换成16进制
echo "client:" . $receiveStrHex;
}
socket_close($socket);  // 关闭Socket
?>

超时及等待用户输入

<?php

//创建socket套接字
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
//设置阻塞模式
socket_set_block($socket);
//为套接字绑定ip和端口
//socket_bind($socket,'192.168.254.191',18899);
socket_bind($socket,'192.168.100.1',18899);
//监听socket
socket_listen($socket,4);
echo "tcp server listen port: 18899 \n";
while(true)
{

    //接收客户端请求
    if(($msgsocket = socket_accept($socket)) !== false)
    {
	    		socket_set_option($msgsocket,SOL_SOCKET,SO_SNDTIMEO,array("sec"=>3, "usec"=>0 ) ); //发送超时
				  socket_set_option($msgsocket,SOL_SOCKET,SO_RCVTIMEO,array("sec"=>3, "usec"=>0 ) );//接收超时
			  
  			  $receiveStr = "";
					$receiveStr = socket_read($msgsocket, 1024, PHP_BINARY_READ);  // 采用2进制方式接收数据
					
					$receiveStrHex = bin2hex($receiveStr);  // 将2进制数据转换成16进制
					echo "Client:" . $receiveStrHex ."\n";

					
					
				while(true)
				{
						 fgets(STDIN); //等待用户输入回车
							$sendStr = '01 03 00 20 00 02 C5 C1';  // 16进制数据
			        echo "TcpServer:".$sendStr."\n";
							$sendStrArray = str_split(str_replace(' ', '', $sendStr), 2);  // 将16进制数据转换成两个一组的数组
			        //向连接的客户端发送数据
			        $str="";
							for ($j = 0; $j < count($sendStrArray); $j++) {
								$str=$str.chr(hexdec($sendStrArray[$j]));  // 逐组数据拼接
							}		
							socket_write($msgsocket,$str,strlen($str)); //一起发送
							
							fgets(STDIN); //等待用户输入回车
			
						  $receiveStr = "";
							$receiveStr = socket_read($msgsocket, 1024, PHP_BINARY_READ);  // 采用2进制方式接收数据
							$receiveStrHex = bin2hex($receiveStr);  // 将2进制数据转换成16进制
							if(strlen($receiveStrHex)>0)
							{
									echo "Client:" . $receiveStrHex ."\n";//010304 011d 0234 6b7e
									$sendStrArray = str_split(str_replace(' ', '', $receiveStrHex), 2);  // 将16进制数据转换成两个一组的数组
									for ($j = 0; $j < count($sendStrArray); $j++) {
											echo $sendStrArray[$j]." \n";  // 逐组数据发送
									}
									if(count($sendStrArray)==9)
									{
											echo "Client解析:\n温度:".( (hexdec($sendStrArray[3])*256+hexdec($sendStrArray[4]))/10 )."度,湿度:".(hexdec($sendStrArray[5])*256+hexdec($sendStrArray[6]))/10 ."%\n"; 
									}
							}

      }
        //操作完之后需要关闭该连接否则 feof() 函数无法正确识别打开的句柄是否读取完成
        socket_close($msgsocket);
    }
}

在C++中,可以使用socket编程来实现TCP网络通信,获取网络发送过来的16进制字符串可以按照以下步骤进行: 1. 创建socket对象并连接服务器: ```c++ #include <sys/socket.h> #include <arpa/inet.h> int sock = socket(AF_INET, SOCK_STREAM, 0); sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_port = htons(1234); server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); connect(sock, (struct sockaddr*)&server_addr, sizeof(server_addr)); ``` 其中,`127.0.0.1`为服务器的IP地址,`1234`为服务器的端口号,需要根据实际情况进行替换。 2. 接收网络发送的数据: ```c++ char buffer[1024]; int recv_len = recv(sock, buffer, sizeof(buffer), 0); ``` `recv`函数用于接收网络发送过来的数据,`buffer`为接收缓存区,`sizeof(buffer)`为缓存区大小,`recv_len`为实际接收到的数据长度。 3. 将接收到的数据转换为16进制字符串: ```c++ std::string hex_str = ""; for (int i = 0; i < recv_len; i++) { char hex[3]; sprintf(hex, "%02x", (unsigned char)buffer[i]); hex_str += hex; } ``` `sprintf`函数用于将每个字节转换为2位的16进制字符串,然后拼接起来形成完整的16进制字符串。 完整的代码示例: ```c++ #include <sys/socket.h> #include <arpa/inet.h> #include <string> #include <iostream> int main() { int sock = socket(AF_INET, SOCK_STREAM, 0); sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_port = htons(1234); server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); connect(sock, (struct sockaddr*)&server_addr, sizeof(server_addr)); char buffer[1024]; int recv_len = recv(sock, buffer, sizeof(buffer), 0); std::string hex_str = ""; for (int i = 0; i < recv_len; i++) { char hex[3]; sprintf(hex, "%02x", (unsigned char)buffer[i]); hex_str += hex; } std::cout << "Received hex string: " << hex_str << std::endl; close(sock); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小黄人软件

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值