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. Lua语言中的__index,__newindex,rawget和rawset

    转自:http://blog.csdn.net/wangbin_jxust/article/details/12108189 在谈及Lua中的__index,__newindex,rawget和raw ...

  2. Koa 框架整理

    学习交流 Koa使用了ES6规范的generator和异步编程是一个更轻量级Web开发的框架,Koa 的先天优势在于 generator.由于是我个人的分享交流,所以Node基础.ES6标准.Web开 ...

  3. OpenGL 多线程共享纹理

    1:opengl 多线程共享纹理纹理: //解码时候使用opengl进行绘制,需要构建队列和两个线程,分别用于解码数据并且填充纹理和渲染. 主线程常见两个共享上下文: main() { ⋯⋯⋯⋯ gH ...

  4. 图解http pdf

    扫加公众号,回复“图解HTTP”,免费获取此书.

  5. 在IDEA下使用Spring Boot的热加载(Hotswap)

    你是否遇到过这样的困扰: 当你写完一段代码后,要看到效果,必须点击IDEA的停止按钮,然后再次重启启动项目,你是否觉得这样很烦呢? 如果你觉得很烦,本文就是用来解决你的问题的. 所谓热加载,就是让我们 ...

  6. cplexJava源码---计算结果

    public static class CplexStatus implements Serializable { static final long serialVersionUID = -7367 ...

  7. 代码: 日期和时间 datepicker

    bootstrap 的相关的时间插件 http://www.bootcss.com/p/bootstrap-datetimepicker/ jquery ui的日期插件 http://www.w3cs ...

  8. json和java bean的相互转换(使用fastjson)

    <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifac ...

  9. J2SE 8的输入输出--缓冲

    FileChannel带缓冲 //1. read the point location FileChannel channelRead = FileChannel.open(Paths.get(&qu ...

  10. 可视化库-seaborn-单变量绘图(第五天)

    1. sns.distplot 画直方图 import numpy as np import pandas as pd from scipy import stats, integrate impor ...