经常有朋友会对php的socket应用充满疑惑,本文就以实例代码作一讲解,希望能对初学php的朋友起到一点帮助作用

具体代码如下:

1.服务器端代码:

<?php
class SocketServer{
private $_port='9000';
private $_address='127.0.0.1';
private $_client_socket_list=array();
public function __set($name,$val){
$this--->$name=$val;
}
private function _showError($error){
exit($error);
}
/**
* 开始进行socket服务器端监听端口
*/
public function start(){
// 创建端口
if (($sock = socket_create ( AF_INET, SOCK_STREAM, SOL_TCP )) === false) {
$this->_showError("socket_create() failed :reason:" . socket_strerror ( socket_last_error () ));
}
// 绑定
if (socket_bind ( $sock, $this->_address, $this->_port ) === false) {
$this->_showError("socket_bind() failed :reason:" . socket_strerror ( socket_last_error ( $sock ) ));
}
// 监听
if (socket_listen ( $sock, 5 ) === false) {
$this->_showError("socket_bind() failed :reason:" . socket_strerror ( socket_last_error ( $sock ) ) );
}
do {
//当有一个客户端连接的时候
if ($client_socket=socket_accept ( $sock )) {
$count = count ( $this->_client_socket_list ) + 1;
//把新来的用户加入 客户端数组里
$this->_client_socket_list[]=$client_socket;
echo "new connection:\r\n";//服务器端输出当前正在连接的客户端数量
echo "current connection:{$count}\r\n";
//接受客户端传过来的字符串
$msg=$this->read($client_socket);
echo "client:{$msg}\r\n";
//服务器向客户端传值
$my_msg="I am fine,think you\r\n";
$this->send($client_socket,$my_msg);
}
/**
* 这段代码给你参考,用来判断是否有客户端主动失去连接
else{
foreach ( $this->_client_socket_list as $socket ) {
$len = socket_recv ($socket, $buffer, 2048, 0 ); // 接受一下客户端信息,如果为0代表断开连接
if ($len < 7) {
//这里写是去连接的客户端业务
}
}
}
*/
}while(true);
}
/**
* 发送数据给客户端
*/
public function send($client_socket,$str){
return socket_write ( $client_socket,$str, strlen ( $str ) );
}
/**
* 从客户端接受数据
*/
public function read($client_socket){
return socket_read ( $client_socket, 8192 );//8192实际代表的接受长度,我用819292表示长一点,这样长一点的字符串也可以接受到,不到8192也没关系,会自动识别
}
}
$socket_server =new SocketServer();
$socket_server->start();//开始监听

2.客户端代码:

<?php
class SocketServer{
private $_port='9000';
private $_address='127.0.0.1';
private $_client_socket_list=array();
public function __set($name,$val){
$this--->$name=$val;
}
private function _showError($error){
exit($error);
}
/**
* 开始进行socket服务器端监听端口
*/
public function start(){
// 创建端口
if (($sock = socket_create ( AF_INET, SOCK_STREAM, SOL_TCP )) === false) {
$this->_showError("socket_create() failed :reason:" . socket_strerror ( socket_last_error () ));
}
// 绑定
if (socket_bind ( $sock, $this->_address, $this->_port ) === false) {
$this->_showError("socket_bind() failed :reason:" . socket_strerror ( socket_last_error ( $sock ) ));
}
// 监听
if (socket_listen ( $sock, 5 ) === false) {
$this->_showError("socket_bind() failed :reason:" . socket_strerror ( socket_last_error ( $sock ) ) );
}
do {
//当有一个客户端连接的时候
if ($client_socket=socket_accept ( $sock )) {
$count = count ( $this->_client_socket_list ) + 1;
//把新来的用户加入 客户端数组里
$this->_client_socket_list[]=$client_socket;
echo "new connection:\r\n";//服务器端输出当前正在连接的客户端数量
echo "current connection:{$count}\r\n";
//接受客户端传过来的字符串
$msg=$this->read($client_socket);
echo "client:{$msg}\r\n";
//服务器向客户端传值
$my_msg="I am fine,think you\r\n";
$this->send($client_socket,$my_msg);
}
/**
* 这段代码给你参考,用来判断是否有客户端主动失去连接
else{
foreach ( $this->_client_socket_list as $socket ) {
$len = socket_recv ($socket, $buffer, 2048, 0 ); // 接受一下客户端信息,如果为0代表断开连接
if ($len < 7) {
//这里写是去连接的客户端业务
}
}
}
*/
}while(true);
}
/**
* 发送数据给客户端
*/
public function send($client_socket,$str){
return socket_write ( $client_socket,$str, strlen ( $str ) );
}
/**
* 从客户端接受数据
*/
public function read($client_socket){
return socket_read ( $client_socket, 8192 );//8192实际代表的接受长度,我用819292表示长一点,这样长一点的字符串也可以接受到,不到8192也没关系,会自动识别
}
}
$socket_server =new SocketServer();
$socket_server->start();//开始监听
注意事项:服务器端请用CLI模式运行,cgi模式会超时,这是新手常喜欢犯的错误。那么什么是CLI模式呢?简单的说就是用命令行去执行,而不要用游览器打开,否则会超时的!

php socket客户端及服务器端应用实例的更多相关文章

  1. Python socket 客户端和服务器端

    connection, address = socket.accept() 调 用accept方法时,socket会时入“waiting”状态.客户请求连接时,方法建立连接并返回服务器.accept方 ...

  2. socket客户端和服务器端

    服务器端: #!/usr/bin/env python #-*- coding:utf-8 -*- import socket sk=socket.socket() sk.bind(('127.0.0 ...

  3. Socket客户端/服务端简单实例

    1.client端 package demo.socket; import java.io.BufferedReader;import java.io.IOException;import java. ...

  4. Socket编程——客户端,服务器端的读写操作

    URL网络编程,最大的特征就是一对一的响应! 1:客户端“写”,服务器端用于“读” package coreBookSocket2; import java.io.InputStreamReader; ...

  5. python--DenyHttp项目(1)--socket编程:客户端与服务器端

    查找了许多资料,实现了客户端与服务器端的连接,通过虚拟机进行测试 服务器端IP:192.168.37.129 端口1122 客户端IP: 192.168.37.1 端口1122 Server: #co ...

  6. 基于TCP的客户端、服务器端socket编程

    一.实验目的 理解tcp传输客户端服务器端通信流程 二.实验平台 MAC OS 三.实验内容 编写TCP服务器套接字程序,程序运行时服务器等待客户的连接,一旦连接成功,则显示客户的IP地址.端口号,并 ...

  7. Win Socket编程原理及简单实例

    [转]http://www.cnblogs.com/tornadomeet/archive/2012/04/11/2442140.html 使用Linux Socket做了小型的分布式,如Linux ...

  8. 架构师养成记--22.客户端与服务器端保持连接的解决方案,netty的ReadTimeoutHandler

    概述 保持客户端与服务器端连接的方案常用的有3种 1.长连接,也就是客户端与服务器端一直保持连接,适用于客户端比较少的情况. 2.定时段连接,比如在某一天的凌晨建立连接,适用于对实时性要求不高的情况. ...

  9. socket 客户端和服务端通信

    客户端要连接服务器:首先要知道服务器的IP地址.而服务器里有很多的应用程序,每一个应用程序对应一个端口号 所以客户端想要与服务器中的某个应用程序进行通信就必须要知道那个应用程序的所在服务器的IP地址, ...

随机推荐

  1. padding当高度用时出现的问题

    <div class="wrap"> <div class="sudoku"> <div class="sdk-wrap ...

  2. C++中##(两个井号)和#(一个井号)用法

    C(和C++)中的宏(Macro)属于编译器预处理的范畴,属于编译期概念(而非运行期概念).下面对常遇到的宏的使用问题做了简单总结.关 于#和##在C语言的宏中,#的功能是将其后面的宏参数进行字符串化 ...

  3. 《JavaScript高级程序设计》读书笔记 ---基本概念小结

     ECMAScript 中的基本数据类型包括Undefined.Null.Boolean.Number 和String. 与其他语言不同,ECMScript 没有为整数和浮点数值分别定义不同的数据 ...

  4. Python 2 中的编码

    在 Python 尤其是 Python2 中,编码问题是困扰开发者尤其初学者的一大问题.什么 Unicode/UTF-8/str ,又是 decode/encode 的,搞得人头都大了.其实不然,这有 ...

  5. Android 5.0之后屏幕截图的方法

    截图的几种方法 Android获取屏幕截图主要有以下三种方法 1.通过view.getDrawingCache()获取指定View的绘制缓存来实现截屏. 这种方式Android 5.0之前也可以,且不 ...

  6. bash color

    紫色:300A24 黄色:C4A000 Tango 紫色: 200213

  7. json格式数据,将数据库中查询的结果转换为json, 然后调用接口的方式返回json(方式一)

    调用接口,无非也就是打开链接 读取流 将结果以流的形式输出 将查询结果以json返回,无非就是将查询到的结果转换成jsonObject ================================ ...

  8. HDU1272 小希的迷宫 并查集

    参考网址:http://blog.sina.com.cn/s/blog_6827ac4a0100nyjy.html 解题思路: 由于这里出现的数字不一定连续的数字都会出现,所以设一个mark来标记数字 ...

  9. Linq第一讲

    在说LINQ之前必须先说说几个重要的C#语言特性 一:与LINQ有关的语言特性 1.隐式类型 (1)源起 在隐式类型出现之前,在声明一个变量的时候, 总是要为一个变量指定他的类型甚至在foreach一 ...

  10. JS原型和原型链

        1 var decimalDigits = 2, 2 tax = 5; 3 4 function add(x, y) { 5 return x + y; 6 } 7 8 function su ...