php语言实现tcpip协议

php主要是实现http协议的,最近我和我同学在做一个网络的项目需要用到底层的tcp协议和http协议两种协议,php自然是实现http协议的良好语言,但是它也可以不怎么完美的实现tcp协议,所以最终使用php作为我们的工具。

首先我找到了两个描写使用php语言来实现tcp协议的代码:

代码地址:

http://www.hdj.me/php-listen-as-socket-server     

这段代码很有启发意味,

1)如果你运行的话会发现,他使用了php的stdin,这个很难用,即使会使用了,也会发现server和client的界面都是死在那里的,因为php是解释性语言,代码里有个while(true)自然无法跳出,所以代码有点错误。

2) 由于网口的port只能被绑定一次,所以页面刷新的话会出现warning。

我更改的代码如下:(代码基本上没有变)

server部分:

<?php
 
// Server
// 设置错误处理
error_reporting(E_ALL);
// 设置运行时间
set_time_limit(0);
// 起用缓冲
ob_implicit_flush();
$ip = "127.0.0.1"; // IP地址
$port = 4443; // 端口号
 
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); // 创建一个SOCKET
if ($socket)
    echo "socket_create() successed!\n";
else
    echo "socket_create() failed:".socket_strerror($socket)."\n";
 
$bind = socket_bind($socket, $ip, $port); // 绑定一个SOCKET
if ($bind)
    echo "socket_bind() successed!\n";
else
    echo "socket_bind() failed:".socket_strerror($bind)."\n";
 
$listen = socket_listen($socket); // 间听SOCKET
if ($listen)
    echo "socket_listen() successed!\n";
else
    echo "socket_listen() failed:".socket_strerror($listen)."\n";
exit(); 
while (true) {
    $msg = socket_accept($socket); // 接受一个SOCKET
    if (!$msg) {
        echo "socket_accept() failed:".socket_strerror($msg)."\n";
        break;
    }
    $welcome = "Welcome to PHP Server!\n";
    socket_write($msg, $welcome, strlen($welcome));
    while (true) {
        $command = strtoupper(trim(socket_read($msg, 1024)));
        if (!$command)
            break;
        switch ($command) {
            case "HELLO":
                $writer = "Hello Everybody!";
                break;
            case "QUIT":
                $writer = "Bye-Bye";
                break;
            case "HELP":
                $writer = "HELLO\tQUIT\tHELP";
                break;
            default:
                $writer = "Error Command!";
        }
        socket_write($msg, $writer, strlen($writer));
        if ($command == "QUIT")
            break;
    }
    socket_close($msg);
}
socket_close($socket); // 关闭SOCKET
?>

client部分:

<?php
 
// Client
// 设置错误处理
error_reporting(E_ALL);
// 设置处理时间
set_time_limit(0);
 
$ip = "127.0.0.1"; // IP 地址
$port = 4443; // 端口号
echo "hello";
//exit();
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); // 创建一个SOCKET
if ($socket)
    echo "socket_create() successed!\n";
else
    echo "socket_create() failed:".socket_strerror($socket)."\n";

$conn = socket_connect($socket, $ip, $port); // 建立SOCKET的连接
if ($conn)
    echo "Success to connection![".$ip.":".$port."]\n";
else
    echo "socket_connect() failed:".socket_strerror($conn)."\n";
//exit();  
echo socket_read($socket, 1024);
//exit(); 
//$stdin = fopen('php://stdin', 'r');
echo "tt";
//exit();
//while (true) {
    $command = 'HELLO';
    socket_write($socket, $command, strlen($command));
    $msg = trim(socket_read($socket, 1024));
    echo $msg."\n";
    if ($msg == "Bye-Bye"){
    	echo "byebye\n";
        break;
    }
//}
//fclose($stdin);
socket_close($socket);
?>

代码运行的时候,server端依然是没有任何反映,但是client端运行会出反映。(你总不能把server的while(true)去掉吧?)




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值