socket具体是什么东西,小弟就不在这里啰嗦了,socket的概念和TCP/IP的关系网上有很多的资料,现在主要的教大家如何使用socket来完成一个简单的聊天室。
首先要想做一个聊天室方法有很都,html+ajax也可以实现一个简单的聊天室,但是要做就要做高大上的东西,(●’◡’●)。
做一个功能我们首先要了解他是如何一步一步走下来的,也就是流程。
服务器端:
1.首先创建一个socket(socket_create);
2.绑定IP和端口(socket_bind);
3.监听这个端口(socket_listen);
4.接收客户端发送过来的请求(socket_accept);
5.读取请求中的字符串(socket_recv);向客户端做出反应
6.关闭连接;
客户端
1.创建一个socket;
2.连接到指定socket的端口;
3.向socket发送信息;
4.关闭连接;
客户端运用的技术是通过websocket连接到服务器端;
下面是主要的代码片段。
服务器端主要配置
public function __construct($host, $port, $max) {
$this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);//创建一个socket
socket_set_option($this->socket, SOL_SOCKET, SO_REUSEADDR, TRUE);//设置socket选项
socket_bind($this->socket, $host, $port);//绑定IP和端口号
socket_listen($this->socket, $max);//监听制定socket得所有连接
}
public function start() {
while(true) {
$cycle = $this->accept;
$cycle[] = $this->socket;
socket_select($cycle, $write, $except, null);
foreach($cycle as $sock) {
if($sock === $this->socket) {
$client = socket_accept($this->socket);//接受一个socket连接
$this->accept[] = $client;
$key = array_keys($this->accept);
$key = end($key);
$this->isHand[$key] = false;
} else {
$length = socket_recv($sock, $buffer, 204800, 0);//从socket里结束到缓存
$key = array_search($sock, $this->accept);
if($length < 7) {
$this->close($sock);
continue;
}
if(!$this->isHand[$key]) {
$this->dohandshake($sock, $buffer, $key);
} else {
// 先解码,再编码
$data = $this->decode($buffer);
$data = $this->encode($data);
// 判断断开连接(断开连接时数据长度小于10)
if(strlen($data) > 10) {
foreach($this->accept as $client) {
socket_write($client, $data, strlen($data));//写数据到socket缓存里面
}
}
}
}
}
}
}
/**
* 解码过程
*/
public function decode($buffer) {
$len = $masks = $data = $decoded = null;
$len = ord($buffer[1]) & 127;
if ($len === 126) {
$masks = substr($buffer, 4, 4);
$data = substr($buffer, 8);
}
else if ($len === 127) {
$masks = substr($buffer, 10, 4);
$data = substr($buffer, 14);
}
else {
$masks = substr($buffer, 2, 4);
$data = substr($buffer, 6);
}
for ($index = 0; $index < strlen($data); $index++) {
$decoded .= $data[$index] ^ $masks[$index % 4];
}
return $decoded;
}
客户端的代码就不往上贴了 ,网上有很都。核心代码就那么几行
有兴趣的同学可以自己研究研究,例子仅供大家参考,有什么不足的地方希望大家多多见谅(●’◡’●)
socket服务器端代码篇地址:https://code.csdn.net/snippets/2517056
客户端代码篇地址:https://code.csdn.net/snippets/2517064