解析:通过php socket并借助telnet实现简单的聊天程序

以下是通过php的socket扩展模块实现的一个简单的消息处理服务器端:绑定在一个本机的端口,监听客户端的连接,接收数据并转发给发送者之外的所有客户端
socket_server.php


代码如下:

#!/usr/bin/env php
<?php
//author:zhxia
if(!extension_loaded('sockets')){
    die('the sockets extension is not loaded!');
}
const PORT=9981;
$socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP) or die('socket create error!');
#通过设置这个选项,进行端口的重用
socket_set_option($socket,SOL_SOCKET,SO_REUSEADDR,1);
socket_bind($socket,0,PORT);
socket_listen($socket);
#使用非阻塞模式
socket_set_nonblock($socket);
echo 'listen on port '.PORT.'...'.PHP_EOL;
$clients=array($socket);
while(TRUE){
    $read=$clients;
    $write=$except=array();
    //通过select系统调用,检测socket的状态是否改变
    if(socket_select($read,$write,$except,0)<1){
        continue;
    }
    //检测是否有客户端来进行连接
    if(in_array($socket,$read)){
        $clients[]=$newsocket=socket_accept($socket);
        socket_write($newsocket,"welcome!\nthere are ".(count($clients)-1)." client here\n");
        socket_getpeername($newsocket,$ip);
        echo "new client connected:$ip\n";
        $key=array_search($newsocket,$read);
        unset($read[$key]);
    }

foreach($read as $read_socket){
        $data=@socket_read($read_socket,1024,PHP_NORMAL_READ);
        if($data===false){
            //如果没有取到数据,说明该客户端已经断开
            $key=array_search($read_socket,$clients);
            unset($clients[$key]);
            echo "client disconnectd.\n";
            continue;
        }
        $data=trim($data);
        if(!empty($data)){
            foreach($clients as $write_socket){
                //排除服务器端和自身,然后将数据发送给所有的其他客户端
                if($write_socket==$socket||$write_socket==$read_socket){
                    continue;
                }
                socket_write($write_socket,"$data\n");
            }
        }
    }
}
socket_close($socket);

启动服务端:
zhxia@zhxia-pc:~/sh/php$ ./socket_server.php
listen on port 9981...

通过telnet进行连接:
zhxia@haozudb:~$ telnet 192.168.187.16 9981
Trying 192.168.187.16...
Connected to 192.168.187.16.
Escape character is '^]'.
welcome!
there are 1 client here

(0)

相关推荐

  • Python socket C/S结构的聊天室应用实现

    Python socket C/S结构的聊天室应用 服务端: #!/usr/bin/env python #coding:utf8 import socket,select def broadcast_data (sock,message): for socket in conn_list: if socket != server_socket and socket != sock : try : socket.send(message) except : socket.close() conn

  • php socket实现的聊天室代码分享

    /** * patServer * PHP socket server base class * Events that can be handled: * * onStart * * onConnect * * onConnectionRefused * * onClose * * onShutdown * * onReceiveData * * @version 1.1 * @author Stephan Schmidt <schst@php-tools.de> * @package pa

  • java实现一个简单TCPSocket聊天室功能分享

    本文实例为大家分享了java实现TCPSocket聊天室功能的相关代码,供大家参考,具体内容如下 1.TCPserver.java import java.net.*; import java.io.*; import java.util.*; import java.util.concurrent.*; public class TCPserver{ private static final int SERVERPORT = 8888; private ServerSocket MyServe

  • WebSocket+node.js创建即时通信的Web聊天服务器

    本文实例node.js创建即时通信的Web聊天服务器,供大家参考,具体内容如下 1.使用nodejs-websocket  nodejs-websocket是基于node.js编写的一个后端实现websocket协议的库,  连接:https://github.com/sitegui/nodejs-websocket.  (1)安装  在项目目录下通过npm安装:npm install nodejs-websocket  (2)创建服务器 //引入nodejs-websocket var ws

  • Java基于socket实现简易聊天室实例

    本文实例讲述了Java基于socket实现简易聊天室的方法.分享给大家供大家参考.具体实现方法如下: chatroomdemo.java package com.socket.demo; import java.io.IOException; import java.net.DatagramSocket; public class ChatRoomDemo { /** * @param args * @throws IOException */ public static void main(S

  • 网页版在线聊天java Socket实现

    本文为大家分享了一个满足在线网页交流需求的实例,由于java Socket实现的网页版在线聊天功能,供大家参考,具体内容如下 实现步骤: 1.使用awt组件和socket实现简单的单客户端向服务端持续发送消息: 2.结合线程,实现多客户端连接服务端发送消息: 3.实现服务端转发客户端消息至所有客户端,同时在客户端显示: 4.把awt组件生成的窗口界面改成前端jsp或者html展示的界面,java socket实现的客户端改为前端技术实现. 这里首先实现第一步的简单功能,难点在于: 1.没有用过a

  • php+html5基于websocket实现聊天室的方法

    本文实例讲述了php+html5基于websocket实现聊天室的方法.分享给大家供大家参考.具体如下: html5的websocket 实现了双向通信,折腾了几天弄了个聊天室,分享给大家 <?php error_reporting(E_ALL); ob_implicit_flush(); $sk=new Sock('127.0.0.1',8000); $sk->run(); class Sock{ public $sockets; public $users; public $master;

  • socket多人聊天程序C语言版(二)

    socket多人聊天程序C语言版(一)地址: http://www.jb51.net/article/94938.htm 1V1实现了,1V多也就容易了.不过相对于1V1的程序,我经过大改,采用链表来动态管理.这样效率真的提升不少,至少CPU使用率稳稳的在20以下,不会飙到100了.用C语言写这个还是挺费时间的,因为什么功能函数都要自己写,不像C++有STL库可以用,MFC写就更简单了,接下来我还会更新MFC版本的多人聊天程序.好了,废话少说,进入主题. 这个程序要解决的问题如下: 1.CPU使

  • 使用Angular和Nodejs、socket.io搭建聊天室及多人聊天室

    一,利用Node搭建静态服务器 这个是这个项目的底层支撑部分.用来支持静态资源文件像html, css, gif, jpg, png, javascript, json, plain text等等静态资源的访问.这里面是有一个mime类型的文件映射. mime.js /** * mime类型的 map * @ author Cheng Liufeng * @ date 2014/8/30 * 当请求静态服务器文件的类型 html, css, gif, jpg, png, javascript,

  • JavaEE7+Websockets+GlassFish4打造聊天室

    在客户机和服务器之间建立单一的双向连接,这就意味着客户只需要发送一个请求到服务端,那么服务端则会进行处理,处理好后则将其返回给客户端,客户端则可以在等待这个时间继续去做其他工作,整个过程是异步的.在本系列教程中,将指导用户如何在JAVA EE 7的容器GlassFish 4中,使用JAVA EE 7中的全新的解析Json API(JSR-353),以及综合运用jQuery和Bootstrap.本文要求读者有一定的HTML 5 Websocket的基础原理知识. 效果图 我们先来看下在完成这个教程

随机推荐