PHP与Java进行socket通信的一点理解

本文介绍了一种解决PHP与Java进行Socket通信时,因结束符缺失导致数据无法正确读取的问题。通过预设数据包长度,实现了双方高效稳定的数据交换,避免了因结束符依赖socket_close函数产生的不确定性。

背景:

这段时间刚忙完了一个项目,涉及到PHP与Java进行socket通信的问题,应用场景是PHP端向Java端发送数据,并等待Java的响应结果,数据格式为JSON。

遇到的问题:

PHP端发送数据后,Java端从socket里读取数据,但是一直读不到结束符。

原因:

PHP需要调用socket_close函数才会向socket里面写入结束符。

改进方法:

PHP端与Java端之间确定每次发送数据包的长度,用4个字节表示数据长度,PHP端先发送数据包长度,再发送数据包,Java端先接收4个字节长度的数据包长度,再根据数据包长度接收数据包。PHP端代码如下:

<?php
    $socket = socket_create ( AF_INET, SOCK_STREAM, SOL_TCP  ) or die ( 'could not create socket'  );  
    $connect = socket_connect ( $socket, 'xxx.xxx.xxx.xxx', xxxx);  
    //服务端发送数据 
    $arr = array("data" => "dadadada");
    $strlen = pack('i', strlen(json_encode($arr)));
    var_dump($strlen);
    socket_write ($socket, $strlen);
    socket_write ($socket, json_encode($arr), strlen(json_encode($arr)));
    $response = socket_read($socket, 4); 
    $res = unpack('i', $response);
    var_dump($res);
    $response = socket_read($socket, $res[1]);
    var_dump($response);
    socket_close($socket);
?>

pack与unpack函数使用说明见PHP官方文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值