socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个socket,并绑定到一个端口上,不同的端口对应于不同的服务。

 
服务端的流程如下:
1、初始化信息并创建套接字(socket_create)
2、绑定IP地址和端口(socket_bind)
3、对端口进行监听(socket_listen)
4、调用accept阻塞,等待有客户端连接(socket_accept)
5、读取请求数据,并处理。(socket_read)
6、发送处理后的数据(socket_write)
7、关闭连接(socket_close)
客户端的流程如下:
1、初始化信息并创建套接字(socket_create)
2、连接服务端(socket_connect)
3、给服务端发送数据(socket_write)
4、获取服务端返回的数据(socket_read)
5、关闭连接(socket_close)
 
服务端代码server.php如下:
<?php
//设置脚本执行时间,0表示没有限制
set_time_limit(0); $ip = '127.0.0.1';
$port = 6666; //创建一个TCP的套接字
if(($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false ) {
//如果创建失败,获取错误信息
$errMsg = socket_strerror(socket_last_error($socket));
die("socket_create: {$errMsg}");
} //绑定套接字
if(socket_bind($socket, $ip, $port) === false) {
$errMsg = socket_strerror(socket_last_error($socket));
die("socket_bind: {$errMsg}");
} //监听
if(socket_listen($socket, 5) === false) {
$errMsg = socket_strerror(socket_last_error($socket));
die("socket_listen: {$errMsg}");
} //循环处理客户端连接
do {
if(($clientSocket = socket_accept($socket)) === false) {
$errMsg = socket_strerror(socket_last_error($socket));
die("socket_accept: {$errMsg}");
} else { //给客户端发送信息
$msg = 'connect success';
socket_write($clientSocket, $msg, strlen($msg)); //读取客户端发来的信息
$clientMsg = socket_read($clientSocket, 8192);
echo "client msg: {$clientMsg}";
}
socket_close($clientSocket);
} while (true); socket_close($socket);
客户端代码client.php如下:
<?php
//设置脚本执行时间,0表示没有限制
set_time_limit(0); $ip = '127.0.0.1';
$port = 6666; //创建一个TCP的套接字
if(($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false ) {
//如果创建失败,获取错误信息
$errMsg = socket_strerror(socket_last_error($socket));
die("socket_create: {$errMsg}");
} //套接字连接
if(socket_connect($socket, $ip, $port) === false) {
$errMsg = socket_strerror(socket_last_error($socket));
die("socket_connect: {$errMsg}");
} //发送信息给服务端
$msg = "client post msg\r\n";
if(socket_write($socket, $msg, strlen($msg))) {
echo "client post msg success\r\n";
} //循环接收服务端发来的信息
while($serverMsg = socket_read($socket, 8192)) {
echo "server msg: {$serverMsg} \r\n";
} //关闭套接字
socket_close($socket);

(*注意代码需运行在cli下,进入到server.php代码目录)

> php server.php

我们通过如下命令查看,套接字是否创建成功。

> netstat -ano
可以看到6666端口已处在监听状态
 
然后我们运行client.php程序
> php client.php

可以看到服务端接收到了客户端发送的数据

客户端也收到了服务端发送的数据

 
 

php socket 编程(一)的更多相关文章

  1. Linux下的C Socket编程 -- server端的继续研究

    Linux下的C Socket编程(四) 延长server的生命周期 在前面的一个个例子中,server在处理完一个连接后便会立即结束掉自己,然而这种server并不科学啊,server应该是能够一直 ...

  2. java socket编程(li)

    一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输.在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以 ...

  3. Python Socket 编程——聊天室示例程序

    上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...

  4. Linux下的C Socket编程 -- server端的简单示例

    Linux下的C Socket编程(三) server端的简单示例 经过前面的client端的学习,我们已经知道了如何创建socket,所以接下来就是去绑定他到具体的一个端口上面去. 绑定socket ...

  5. Linux下的C Socket编程 -- 获取对方IP地址

    Linux下的C Socket编程(二) 获取域名对应的IP地址 经过上面的讨论,如果我们想要连接到远程的服务器,我们需要知道对方的IP地址,系统函数gethostbyname便能够实现这个目的.它能 ...

  6. Linux下的C Socket编程 -- 简介与client端的处理

    Linux下的C Socket编程(一) 介绍 Socket是进程间通信的方式之一,是进程间的通信.这里说的进程并不一定是在同一台机器上也有可能是通过网络连接的不同机器上.只要他们之间建立起了sock ...

  7. python网络编程-socket编程

     一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...

  8. Socket编程实践(2) Socket API 与 简单例程

    在本篇文章中,先介绍一下Socket编程的一些API,然后利用这些API实现一个客户端-服务器模型的一个简单通信例程.该例子中,服务器接收到客户端的信息后,将信息重新发送给客户端. socket()函 ...

  9. Socket编程实践(1) 基本概念

    1. 什么是socket socket可以看成是用户进程与内核网络协议栈的编程接口.TCP/IP协议的底层部分已经被内核实现了,而应用层是用户需要实现的,这部分程序工作在用户空间.用户空间的程序需要通 ...

  10. [转]C语言SOCKET编程指南

    1.介绍 Socket编程让你沮丧吗?从man pages中很难得到有用的信息吗?你想跟上时代去编Internet相关的程序,但是为你在调用 connect() 前的bind() 的结构而不知所措?等 ...

随机推荐

  1. Immunity Debugger学习笔记

    图1::Immunity主界面 注意事项:最下方的PyCommands窗格既可以执行调试命令也可以执行python脚步文件. 1.PyCommands学习 在 Immunity 中执行 Python ...

  2. Microsoft Enterprise Library

    http://entlib.codeplex.com/ 微软企业库 现在已经到到6版本了 2013年更新的. https://www.microsoft.com/en-us/download/conf ...

  3. javascript节点操作appendChild()

    cloneNode(a)方法接受一个布尔值参数,表示是否深拷贝 true:表示执行深拷贝,复制本节点以及整个子节点树. false:浅拷贝.只复制节点本身. 复制后返回的节点副本属于文档所有,但是并没 ...

  4. 6.26-EL表达式,JSTL标签

    一.EL表达式 功能: 替代jsp中数据访问时的复杂java代码 语法: ${表达式} ${(5+9)*2} 访问顺序: page--->request--->session---> ...

  5. Spark分析之Dependency

    在Spark中,每一个RDD是对于数据集在某一状态下的表现形式,比如说:map.filter.group by等都算一次操作,这个状态有可能是从前一状态转换而来的: 因此换句话说一个RDD可能与之前的 ...

  6. PCB的初次窥探

    第一次画PCB经常用到的知识点 鼠标拖动+X      :左右转动(对称) +space:90度转动 +L      :顶层与底层的切换 Ctrl+M:测量 J + C:查找原件 交叉探针+原理图(P ...

  7. 24. Swap Nodes in Pairs + 25. Reverse Nodes in k-Group

    ▶ 问题:单链表中的元素进行交换或轮换. ▶ 24. 每两个元素进行翻转.如 [1 → 2 → 3 → 4 → 5] 变换为 [2 → 1 → 4 → 3 → 5] ● 初版代码,4 ms class ...

  8. 程序员必看:给你一份详细的Spring Boot知识清单

    在过去两三年的Spring生态圈,最让人兴奋的莫过于Spring Boot框架.或许从命名上就能看出这个框架的设计初衷:快速的启动Spring应用.因而Spring Boot应用本质上就是一个基于Sp ...

  9. Spring MVC 异常处理 - ResponseStatusExceptionResolver

    作用在类和方法上面 更改返回的代码和错误消息 类上 通过throw new UserName***Exception()抛出 @ResponseStatus(value=HttpStatus.FORB ...

  10. 将Ctrl+Alt+Delete键进行屏蔽,防止误操作重启服务器

    [root@bgw-t ~]# vi  /etc/init/control-alt-delete.conf #exec /sbin/shutdown -r now "Control-Alt- ...