Heim >Backend-Entwicklung >PHP-Tutorial >Beispielhafte Erläuterung der durch PHP-Programmierung implementierten TCP-Server- und Client-Funktionen

Beispielhafte Erläuterung der durch PHP-Programmierung implementierten TCP-Server- und Client-Funktionen

jacklove
jackloveOriginal
2018-06-27 17:51:231884Durchsuche

这篇文章主要介绍了PHP编程实现的TCP服务端和客户端功能,结合实例形式分析了php基于socket实现TCP服务器端与客户端通信功能的相关配置、定义与使用技巧,需要的朋友可以参考下

本文实例讲述了PHP编程实现的TCP服务端和客户端功能。分享给大家供大家参考,具体如下:

1、修改php.ini,打开extension=php_sockets.dll

2、服务端程序SocketServer.php

<?php
//确保在连接客户端时不会超时
set_time_limit(0);
//设置IP和端口号
$address = "127.0.0.1";
$port = 3046;
/**
 * 创建一个SOCKET
 * AF_INET=是ipv4 如果用ipv6,则参数为 AF_INET6
 * SOCK_STREAM为socket的tcp类型,如果是UDP则使用SOCK_DGRAM
*/
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("socket_create() fail:" . socket_strerror(socket_last_error()) . "/n");
//阻塞模式
socket_set_block($sock) or die("socket_set_block() fail:" . socket_strerror(socket_last_error()) . "/n");
//绑定到socket端口
$result = socket_bind($sock, $address, $port) or die("socket_bind() fail:" . socket_strerror(socket_last_error()) . "/n");
//开始监听
$result = socket_listen($sock, 4) or die("socket_listen() fail:" . socket_strerror(socket_last_error()) . "/n");
echo "OK\nBinding the socket on $address:$port ... ";
echo "OK\nNow ready to accept connections.\nListening on the socket ... \n";
do { // never stop the daemon
  //它接收连接请求并调用一个子连接Socket来处理客户端和服务器间的信息
  $msgsock = socket_accept($sock) or die("socket_accept() failed: reason: " . socket_strerror(socket_last_error()) . "/n");
  while(1){
    //读取客户端数据
    echo "Read client data \n";
    //socket_read函数会一直读取客户端数据,直到遇见\n,\t或者\0字符.PHP脚本把这写字符看做是输入的结束符.
    $buf = socket_read($msgsock, 8192);
    echo "Received msg: $buf  \n";
    if($buf == "bye"){
      //接收到结束消息,关闭连接,等待下一个连接
      socket_close($msgsock);
      continue;
    }
    //数据传送 向客户端写入返回结果
    $msg = "welcome \n";
    socket_write($msgsock, $msg, strlen($msg)) or die("socket_write() failed: reason: " . socket_strerror(socket_last_error()) ."/n");
  }
} while (true);
socket_close($sock);
?>

3、客户端程序SocketClient.php

<?php
set_time_limit(0);
$host = "127.0.0.1";
$port = 3046;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)or die("Could not create socket\n");
$connection = socket_connect($socket, $host, $port) or die("Could not connet server\n");
socket_write($socket, "hello socket") or die("Write failed\n");
while ($buff = socket_read($socket, 1024, PHP_NORMAL_READ)) {
  echo("Response was:" . $buff . "\n");
  echo("input what you want to say to the server:\n");
  $text = fgets(STDIN);
  socket_write($socket, $text);
}
socket_close($socket);
?>

4、测试

运行服务端程序:C:\wamp\bin\php\php5.4.16\php.exe C:\wamp\www\SocketServer.php

运行客户端程序: C:\wamp\bin\php\php5.4.16\php.exe C:\wamp\www\SocketClient.php

如果遇到

Fatal error: Call to undefined function socket_create()。

1. 找到php.ini,看 extension=php_gd2.dll   和  extension=php_sockets.dll 扩展是否打开;

2. 看phpInfo()显示的内容里,socket模块是否为enable;

我检查了一下,发现都是符合的。但错误仍然出现?怎么回事呢?

后来我才发现,原来是我在phpInfo()里看到的和在cmd窗口里使用的php不是同一个东西。

原因是我多次安装过php. 先前的php在系统的环境变量里面注册了path。所以在cmd窗口里使用的是以前的php. 而在phpInfo()里显示的是现在的php的设置。

解决的办法很简单了,就把系统环境变量里的path里,指向老的Php的路径改为指向正在使用的Php的路径。这样在cmd里的php和在浏览器里的php就是同一个东西了。

就是这样。

5、其流程与C语言很相似,实际上就是封装了C语言的socket

您可能感兴趣的文章:

PHP简单实现正则匹配省市区的方法讲解

PHP闭包定义与使用简单示例php技巧

php微信公众号开发之现金红包php实例

Das obige ist der detaillierte Inhalt vonBeispielhafte Erläuterung der durch PHP-Programmierung implementierten TCP-Server- und Client-Funktionen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn