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. Python 常用PEP8规范

    目录 目录 代码布局 缩进 最大行宽 空行 模块导入 字符串 表达式和语句中的空格 注释 命名规则 编程建议 代码布局 缩进 每级缩进用4个空格. 括号中使用垂直隐式缩进或使用悬挂缩进. EXAMPL ...

  2. PHP mysqli_free_result()与mysqli_fetch_array()函数

    mysql_free_result() 仅需要在考虑到返回很大的结果集时会占用多少内存时调用.在脚本结束后所有关联的内存都会被自动释放. 在我们执行完SELECT语句后,释放游标内存是一个很好的习惯. ...

  3. 报错:ORA-02264

    创建表时报错ORA-02264:名称已被一个现有约束条件占用 查询约束名称“PK_DATASOUCE”,然后删除. SELECT a.* FROM user_constraints a where c ...

  4. 同步锁源码分析(一)AbstractQueuedSynchronizer原理

    文章转载自 AbstractQueuedSynchronizer的介绍和原理分析 建议去看一下原文的评论,会有不少收获. 简介 AbstractQueuedSynchronizer 提供了一个基于FI ...

  5. Bogart gFunction.vb

    Module gFunction '其它不是常用的方法及函數 #Region " 將指定的數據格式轉換為英文格式" Public Function EnglishFormat(By ...

  6. Json中相同或者重复记录的值相加组成新的Json

    var data = [ {"Networking": "WiFi", "count_value": "2000"}, ...

  7. 机器学习入门-线性判别分析(LDA)1.LabelEncoder(进行标签的数字映射) 2.LinearDiscriminantAnalysis (sklearn的LDA模块)

    1.from sklearn.processing import LabelEncoder 进行标签的代码编译 首先需要通过model.fit 进行预编译,然后使用transform进行实际编译 2. ...

  8. 泛型集合与DataSet相互转换

    一.泛型转DataSet /// <summary> /// 泛型集合转换DataSet /// </summary> /// <typeparam name=" ...

  9. 使用sqldeveloper连接服务器端数据库

  10. 【OpenPose-Windows】OpenPose+VS2015+Windows+CUDA8+cuDNN5.1 官方配置教程(转载)

    [我的电脑配置] 操作系统:Windows 10 CUDA版本:cuda_8.0.61_win10 cuDNN版本:cudnn-8.0-windows10-x64-v5.1 GPU model:Nvi ...