PHP Socket Server端例子
一个简单的Socket通信Demo
⼀个简单的Socket通信Demo服务器端Demo:Server.java(服务器端运⾏主程序,直接运⾏):package cn.wjs;import .InetAddress;import .ServerSocket;import .Socket;public class Server {private static final int port = 9999;private static final int backlog = 100;private static final String bindAddr = "127.0.0.1";public static void main(String[] args) throws Exception {System.out.println("正在启动Socket服务器");ServerSocket server = new ServerSocket(9998, 100, InetAddress.getByName("127.0.0.1"));System.out.println("启动完成\n正在监听客户端连接");while (true) {Socket socket = server.accept();System.out.println("产⽣了⼀个新的会话,来⾃:" + socket.getInetAddress() + "\n=================================="); new ServerMessageReceiver(socket).start();new ServerMessageSender(socket).start();System.out.println("服务器端已启动");}}}ServerMessageReceiver.java:package cn.wjs;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.UnsupportedEncodingException;import .Socket;public class ServerMessageReceiver extends Thread{private Socket socket;public ServerMessageReceiver(Socket socket){this.socket = socket;}public void run() {try {BufferedReader reader = new BufferedReader(new InputStreamReader(this.socket.getInputStream(), "UTF-8"));String content = null;while (true) {if (this.socket.isClosed()) {System.out.println("Socket已经关闭");reader.close();this.socket.close();break;}content = reader.readLine();if (content.equals("bye")) {System.out.println("对⽅请求关闭连接,⽆法继续进⾏聊天");reader.close();this.socket.close();break;}System.out.println("【对⽅】" + content + "\n");}reader.close();this.socket.close();}catch (UnsupportedEncodingException e){e.printStackTrace();}catch (IOException e) {e.printStackTrace();}}}ServerMessageSender.java:package cn.wjs;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.UnsupportedEncodingException;import .Socket;public class ServerMessageSender extends Thread{private Socket socket;public ServerMessageSender(Socket socket){this.socket = socket;}public void run() {try {BufferedWriter outwriter = new BufferedWriter(new OutputStreamWriter(this.socket.getOutputStream(), "UTF-8")); BufferedReader inputReader = new BufferedReader(new InputStreamReader(System.in));String msg = null;while (true) {msg = inputReader.readLine();if (msg.toLowerCase().equals("exit")) {System.exit(0);}if (this.socket.isClosed()) {System.out.println("Socket已经关闭");outwriter.close();inputReader.close();this.socket.close();break;}outwriter.write(msg);outwriter.newLine();outwriter.flush();}}catch (UnsupportedEncodingException e){e.printStackTrace();}catch (IOException e) {e.printStackTrace();}}}ClientDemo:Client.java(客户端主程序,直接运⾏):package cn.wjs;import java.io.IOException;import .InetAddress;import .Socket;import .UnknownHostException;public class Client{private static final int port = 9999;private static final String bindAddr = "127.0.0.1";public static void main(String[] args){System.out.println("正在连接Socket服务器");try {Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9998);System.out.println("已连接\n================");new ClientMessageSender(socket).start();new ClientMessageReceiver(socket).start();System.out.println("已启动");}catch (UnknownHostException e) {e.printStackTrace();}catch (IOException e) {e.printStackTrace();}}}ClientMessageReceiver.java:package cn.wjs;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.UnsupportedEncodingException;import .Socket;public class ClientMessageReceiver extends Thread{private Socket socket;public ClientMessageReceiver(Socket socket){this.socket = socket;}public void run(){try {BufferedReader reader = new BufferedReader(new InputStreamReader(this.socket.getInputStream(), "UTF-8")); String content = null;while (true) {if (this.socket.isClosed()) {System.out.println("Socket已经关闭");reader.close();this.socket.close();break;}content = reader.readLine();if (content.equals("bye")) {System.out.println("对⽅请求关闭连接,⽆法继续进⾏聊天");reader.close();this.socket.close();break;}System.out.println("【对⽅】" + content + "\n");}}catch (UnsupportedEncodingException e){e.printStackTrace();}catch (IOException e) {e.printStackTrace();}}}ClientMessageSender.java:package cn.wjs;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.UnsupportedEncodingException;import .Socket;public class ClientMessageSender extends Thread{private Socket socket;public ClientMessageSender(Socket socket){this.socket = socket;}public void run(){try {BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(this.socket.getOutputStream(), "UTF-8"));BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));String msg = null;while (true) {msg = reader.readLine();if (msg.toLowerCase().equals("exit")) {System.exit(0);}if (this.socket.isClosed()) {System.out.println("Socket已经关闭");writer.close();this.socket.close();break;}writer.write(msg);writer.newLine();writer.flush();}}catch (UnsupportedEncodingException e){e.printStackTrace();}catch (IOException e) {e.printStackTrace();}}}通过elicpse导出jar包直接运⾏,服务器端导出jar设置main.class为Server.java,客户端导出jar设置main.class为Client.java------这是传统的TCP/BIO模式.如果多个客户端向服务器发送请求,通常采⽤连接池的⽅式来维护,这和数据库的连接池⼀个道理。
linux socket编程案例
linux socket编程案例如何使用Linux Socket编程案例实现网络通信?一、介绍Socket编程是Linux操作系统中用于实现网络通信的一种编程接口。
通过Socket编程,我们可以在不同的主机之间建立网络连接,并进行数据传输。
本文将通过一个案例,一步一步介绍如何使用Linux Socket编程实现一个简单的网络通信应用。
二、准备工作在开始编写Socket程序之前,我们需要确保已经安装了Linux操作系统,并且具备一定的编程基础。
以下是本文案例所使用的环境和工具:- 操作系统:Ubuntu 20.04 LTS- 编程语言:C++- 编译器:g++三、案例背景我们打算实现一个简单的客户端-服务器模型。
客户端将向服务器发送一段文本,并在服务器端进行反转后返回给客户端。
四、服务器端代码实现1. 首先,我们创建一个服务器端的Socket,用于接收客户端连接:cpp#include <iostream>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>int main() {创建Socketint serverSocket = socket(AF_INET, SOCK_STREAM, 0);if (serverSocket == -1) {std::cerr << "Failed to create socket." << std::endl;return -1;}设置监听地址struct sockaddr_in serverAddress;serverAddress.sin_family = AF_INET;serverAddress.sin_port = htons(8888);serverAddress.sin_addr.s_addr = INADDR_ANY;绑定Socket和地址if (bind(serverSocket, (struct sockaddr*)&serverAddress,sizeof(serverAddress)) == -1) {std::cerr << "Failed to bind socket." << std::endl;return -1;}开始监听if (listen(serverSocket, 5) == -1) {std::cerr << "Failed to listen on socket." << std::endl;return -1;}std::cout << "Server started, listening on port 8888." << std::endl;接受客户端连接struct sockaddr_in clientAddress;socklen_t clientAddressLength = sizeof(clientAddress);int clientSocket = accept(serverSocket, (structsockaddr*)&clientAddress, &clientAddressLength);处理客户端请求...关闭Socketclose(serverSocket);return 0;}以上代码中,我们先创建一个Socket对象,然后设置服务器的监听地址,接着绑定Socket和地址,最后开始监听客户端连接。
socket 编程入门教程
socket 编程入门教程(一)TCP server 端:1、建模作者:龙飞绝大部分关于socket编程的教程总是从socket的概念开始讲起的。
要知道,socket的初衷是个庞大的体系,TCP/IP只是这个庞大体系下一个很小的子集,而我们真正能用上的更是这个子集中的一小部分:运输层(Host-to-Host Transport Layer)的TCP和UDP协议,以及使用这两个协议进行应用层(Application Layer)的开发。
即使是socket的核心部分,网络层(Internet Layer)的IP协议,在编程的时候我们也很少会感觉到它的存在——因为已经被封装好了,我们唯一需要做的事情就是传入一个宏。
第一节我想介绍的概念就这么多,当然,既然我们已经说了3个层了,我想最好还是把最后一个层也说出来,即所谓链路层(Network Access Layer),它包括了物理硬件和驱动程序。
这四个层从底到高的顺序是:链路层--网络层--运输层--应用层。
好,说实话我们现在并不清楚所谓TCP到底是什么东东,不过我们知道这东东名气很大。
或许你早就知道,另外一个声名狼藉建立在TCP协议基础上的应用程序,它曾经几乎是统治了一个时代,即使是今天,我们依然无法消除他的影响力的——恩,是的,就是telnet。
在这个教程中,我使用的环境是Debian GNU/Linux 4.0 etch。
传说中的stable -_-!!!,恩,我是很保守的人。
如果你不是自己DIY出来的系统,相信默认安装里面就应该有telnet (/usr/bin/telnet,要是没装就自己aptitude install吧)。
telnet可以与所有遵循TCP协议的服务器端进行通讯。
通常,socket编程总是Client/Server形式的,因为有了telnet,我们可以先不考虑client的程序,我们先写一个支持TCP协议的server端,然后用telnet作为client 验证我们的程序就好了。
实用的PHP实例代码20个2篇
实用的PHP实例代码20个2篇PHP是一种广泛应用于Web开发的脚本语言,具有简单、灵活、易学的特点。
它不仅可以用来开发网站,还可以用来编写各种实用的应用程序。
在本文中,我们将为您介绍20个实用的PHP实例代码和使用场景。
第一篇:1-10个实例1. 文件上传文件上传是Web开发中常用的功能之一。
使用PHP,您可以很容易地实现文件上传功能,从而让用户能够向您的网站或应用程序上传文件。
2. 邮件发送PHP提供了发送电子邮件的功能,您可以使用PHP编写代码来发送电子邮件,例如发送注册确认邮件、找回密码邮件等。
3. 图片缩放PHP提供了强大的图像处理功能,您可以使用PHP来缩放图片,为您的网站或应用程序提供更好的用户体验。
4. 数据库连接在许多Web应用程序中,需要与数据库进行交互。
PHP提供了各种数据库连接操作,您可以使用PHP来连接各种类型的数据库,如MySQL、Oracle等。
5. 表单验证表单验证是保证用户输入数据有效和安全的重要环节。
PHP提供了丰富的表单验证函数,您可以使用PHP来验证用户提交的表单数据,例如检查邮箱格式、密码强度等。
6. 分页功能在处理大量数据时,分页功能非常有用。
使用PHP,您可以轻松地实现分页功能,让用户能够浏览和导航数据的不同页面。
7. 登录认证登录认证是保护网站或应用程序安全的重要步骤。
使用PHP,您可以编写代码来实现用户登录认证功能,例如检查用户名和密码是否匹配等。
8. 数据加密在处理敏感信息时,数据加密是非常重要的。
PHP提供了各种数据加密函数,您可以使用PHP来对敏感数据进行加密和解密。
9. 生成验证码验证码是防止机器人和恶意攻击的有效手段。
使用PHP,您可以生成随机验证码,并将其嵌入到表单中,确保只有人类用户能够提交表单。
10. 数据备份定期数据备份是保证数据安全的重要环节。
使用PHP,您可以编写脚本来自动备份数据库,确保数据的安全可靠。
第二篇:11-20个实例11. 数据导出有时候,需要将数据库中的数据导出为Excel、CSV等格式,以方便进行数据分析或其他用途。
基于C++的socket通信实例
刚刚学windows编程,所以想写学习笔记,这是一个简单的Socket 程序例子,开发环境是vc6:首先是TCPserver端:[cpp]view plaincopy1.#include "stdafx.h"2.#include <stdio.h>3.#include <winsock2.h>4.5.#pragma comment(lib,"ws2_32.lib")6.7.int main(int argc, char* argv[])8.{9.//初始化WSA10.WORD sockVersion = MAKEWORD(2,2);11. WSADATA wsaData;12.if(WSAStartup(sockVersion, &wsaData)!=0)13. {14.return 0;15. }16.17.//创建套接字18. SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);19.if(slisten == INVALID_SOCKET)20. {21. printf("socket error !");22.return 0;23. }24.25.//绑定IP和端口26. sockaddr_in sin;27. sin.sin_family = AF_INET;28. sin.sin_port = htons(8888);29. sin.sin_addr.S_un.S_addr = INADDR_ANY;30.if(bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)31. {32. printf("bind error !");33. }34.35.//开始监听36.if(listen(slisten, 5) == SOCKET_ERROR)37. {38. printf("listen error !");39.return 0;40. }41.42.//循环接收数据43. SOCKET sClient;44. sockaddr_in remoteAddr;45.int nAddrlen = sizeof(remoteAddr);46.char revData[255];47.while (true)48. {49. printf("等待连接...\n");50. sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);51.if(sClient == INVALID_SOCKET)52. {53. printf("accept error !");54.continue;55. }56. printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));57.58.//接收数据59.int ret = recv(sClient, revData, 255, 0);60.if(ret > 0)61. {62. revData[ret] = 0x00;63. printf(revData);64. }65.66.//发送数据67.char * sendData = "你好,TCP客户端!\n";68. send(sClient, sendData, strlen(sendData), 0);69. closesocket(sClient);70. }71.72. closesocket(slisten);73. WSACleanup();74.return 0;75.}client端:[cpp]view plaincopy1.#include "stdafx.h"2.#include <WINSOCK2.H>3.#include <STDIO.H>4.5.#pragma comment(lib,"ws2_32.lib")6.7.8.int main(int argc, char* argv[])9.{10.WORD sockVersion = MAKEWORD(2,2);11. WSADATA data;12.if(WSAStartup(sockVersion, &data) != 0)13. {14.return 0;15. }16.17. SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);18.if(sclient == INVALID_SOCKET)19. {20. printf("invalid socket !");21.return 0;22. }23.24. sockaddr_in serAddr;25. serAddr.sin_family = AF_INET;26. serAddr.sin_port = htons(8888);27. serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");28.if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)29. {30. printf("connect error !");31. closesocket(sclient);32.return 0;33. }34.char * sendData = "你好,TCP服务端,我是客户端!\n";35. send(sclient, sendData, strlen(sendData), 0);36.37.char recData[255];38.int ret = recv(sclient, recData, 255, 0);39.if(ret > 0)40. {41. recData[ret] = 0x00;42. printf(recData);43. }44. closesocket(sclient);45. WSACleanup();46.return 0;47.}然后是UDPserver端:[cpp]view plaincopy1.#include "stdafx.h"2.#include <stdio.h>3.#include <winsock2.h>4.5.#pragma comment(lib, "ws2_32.lib")6.7.int main(int argc, char* argv[])8.{9. WSADATA wsaData;10.WORD sockVersion = MAKEWORD(2,2);11.if(WSAStartup(sockVersion, &wsaData) != 0)12. {13.return 0;14. }15.16. SOCKET serSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);17.if(serSocket == INVALID_SOCKET)18. {19. printf("socket error !");20.return 0;21. }22.23. sockaddr_in serAddr;24. serAddr.sin_family = AF_INET;25. serAddr.sin_port = htons(8888);26. serAddr.sin_addr.S_un.S_addr = INADDR_ANY;27.if(bind(serSocket, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)28. {29. printf("bind error !");30. closesocket(serSocket);31.return 0;32. }33.34. sockaddr_in remoteAddr;35.int nAddrLen = sizeof(remoteAddr);36.while (true)37. {38.char recvData[255];39.int ret = recvfrom(serSocket, recvData, 255, 0, (sockaddr *)&remoteAddr, &nAddrLen);40.if (ret > 0)41. {42. recvData[ret] = 0x00;43. printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));44. printf(recvData);45. }46.47.char * sendData = "一个来自服务端的UDP数据包\n";48. sendto(serSocket, sendData, strlen(sendData), 0, (sockaddr *)&remoteAddr, nAddrLen);49.50. }51. closesocket(serSocket);52. WSACleanup();53.return 0;54.}client端:[cpp]view plaincopy1.#include "stdafx.h"2.#include <stdio.h>3.#include <winsock2.h>4.5.#pragma comment(lib, "ws2_32.lib")6.7.int main(int argc, char* argv[])8.{9.WORD socketVersion = MAKEWORD(2,2);10. WSADATA wsaData;11.if(WSAStartup(socketVersion, &wsaData) != 0)12. {13.return 0;14. }15. SOCKET sclient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);16.17. sockaddr_in sin;18. sin.sin_family = AF_INET;19. sin.sin_port = htons(8888);20. sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");21.int len = sizeof(sin);22.23.char * sendData = "来自客户端的数据包.\n";24. sendto(sclient, sendData, strlen(sendData), 0, (sockaddr *)&sin, len);25.26.char recvData[255];27.int ret = recvfrom(sclient, recvData, 255, 0, (sockaddr *)&sin, &len);28.if(ret > 0)29. {30. recvData[ret] = 0x00;31. printf(recvData);32. }33.34. closesocket(sclient);35. WSACleanup();36.return 0;37.}。
117个php实例
117个php实例以下是一些常见的 PHP 实例,共计 117 个: 1. Hello World 程序。
php.<?php.echo "Hello World!";>。
2. 变量的使用。
php.<?php.$name = "John";$age = 25;echo "My name is " . $name . " and I am " . $age . " years old.";>。
3. 数组的使用。
php.<?php.$fruits = array("apple", "banana", "orange");echo "I like " . $fruits[0] . ", " . $fruits[1] . " and " . $fruits[2] . ".";>。
4. 循环的使用。
php.<?php.for ($i = 1; $i <= 10; $i++) {。
echo $i . " ";}。
>。
5. 条件语句的使用。
php.<?php.$age = 18;if ($age >= 18) {。
echo "You are an adult.";} else {。
echo "You are a minor.";}。
>。
6. 函数的使用。
php.<?php.function sayHello($name) {。
echo "Hello, " . $name . "!"; }。
sayHello("Alice");>。
streamsocket用法
`stream_socket` 是 PHP 中用于操作网络套接字的一系列函数。
这些函数提供了一种相对低级别的网络编程接口,允许开发者创建和操作网络连接,包括TCP、UDP 连接等。
使用 `stream_socket` 系列函数,可以实现服务器和客户端之间的数据通信。
### 基本用法#### 创建服务器 (TCP)```php// 创建一个服务器端套接字$server = stream_socket_server(");if ($server === false) {throw new UnexpectedValueException("Could not bind to socket: $errorMessage");}while ($client = @stream_socket_accept($server)) {fwrite($client, 'Hello World!' . PHP_EOL);fclose($client);}fclose($server);```这段代码创建了一个监听在本机 8000 端口的 TCP 服务器。
当客户端连接时,它发送"Hello World!" 给客户端,然后关闭连接。
#### 创建客户端 (TCP)```php// 连接到服务器$client = stream_socket_client(");if ($client === false) {throw new UnexpectedValueException("Failed to connect: $errorMessage");}echo stream_get_contents($client);fclose($client);```这段代码尝试连接到本机的 8000 端口上的服务器,并读取从服务器接收到的数据。
PHPSocket实现websocket(四)Select函数
PHPSocket实现websocket(四)Select函数int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout);/*参数列表int maxfdp是⼀个整数值,是指集合中所有⽂件描述符的范围,即所有⽂件描述符的最⼤值加1,不能错!在Windows中这个参数的值⽆所谓,可以设置不正确。
fd_set *readfds是指向fd_set结构的指针,这个集合中应该包括⽂件描述符,我们是要监视这些⽂件描述符的读变化的,即我们关⼼是否可以从这些⽂件中读取数据了,如果这个集合中有⼀个⽂件可读,select就会返回⼀个⼤于0的值,表⽰有⽂件可读,如果没有可读的⽂件,则根据timeout参数再判断是否超时,若超出timeout的时间,select返回0,若发⽣错误返回负值。
可以传⼊NULL值,表⽰不关⼼任何⽂件的读变化。
fd_set *writefds是指向fd_set结构的指针,这个集合中应该包括⽂件描述符,我们是要监视这些⽂件描述符的写变化的,即我们关⼼是否可以向这些⽂件中写⼊数据了,如果这个集合中有⼀个⽂件可写,select就会返回⼀个⼤于0的值,表⽰有⽂件可写,如果没有可写的⽂件,则根据timeout参数再判断是否超时,若超出timeout的时间,select返回0,若发⽣错误返回负值。
可以传⼊NULL值,表⽰不关⼼任何⽂件的写变化。
fd_set *errorfds同上⾯两个参数的意图,⽤来监视⽂件错误异常。
struct timeval* timeout是select的超时时间,这个参数⾄关重要,它可以使select处于三种状态:第⼀,若将NULL以形参传⼊,即不传⼊时间结构,就是将select置于阻塞状态,⼀定等到监视⽂件描述符集合中某个⽂件描述符发⽣变化为⽌;第⼆,若将时间值设为0秒0毫秒,就变成⼀个纯粹的⾮阻塞函数,不管⽂件描述符是否有变化,都⽴刻返回继续执⾏,⽂件⽆变化返回0,有变化返回⼀个正值;第三,timeout的值⼤于0,这就是等待的超时时间,即 select在timeout时间内阻塞,超时时间之内有事件到来就返回了,否则在超时后不管怎样⼀定返回,返回值同上述。
socket编程——一个简单的例子
socket编程——⼀个简单的例⼦1、⽹络中进程之间如何通信?本地的进程间通信(IPC)有很多种⽅式,但可以总结为下⾯4类:消息传递(管道、FIFO、消息队列)同步(互斥量、条件变量、读写锁、⽂件和写记录锁、信号量)共享内存(匿名的和具名的)远程过程调⽤(Solaris门和Sun RPC)但这些都不是本⽂的主题!我们要讨论的是⽹络中进程之间如何通信?⾸要解决的问题是如何唯⼀标识⼀个进程,否则通信⽆从谈起!在本地可以通过进程PID来唯⼀标识⼀个进程,但是在⽹络中这是⾏不通的。
其实TCP/IP协议族已经帮我们解决了这个问题,⽹络层的“ip地址”可以唯⼀标识⽹络中的主机,⽽传输层的“协议+端⼝”可以唯⼀标识主机中的应⽤程序(进程)。
这样利⽤三元组(ip地址,协议,端⼝)就可以标识⽹络的进程了,⽹络中的进程通信就可以利⽤这个标志与其它进程进⾏交互。
使⽤TCP/IP协议的应⽤程序通常采⽤应⽤编程接⼝:UNIX BSD的套接字(socket)和UNIX System V的TLI(已经被淘汰),来实现⽹络进程之间的通信。
就⽬前⽽⾔,⼏乎所有的应⽤程序都是采⽤socket,⽽现在⼜是⽹络时代,⽹络中进程通信是⽆处不在,这就是我为什么说“⼀切皆socket”。
2、什么是Socket?上⾯我们已经知道⽹络中的进程是通过socket来通信的,那什么是socket呢?socket起源于Unix,⽽Unix/Linux基本哲学之⼀就是“⼀切皆⽂件”,都可以⽤“打开open –> 读写write/read –> 关闭close”模式来操作。
我的理解就是Socket就是该模式的⼀个实现,socket即是⼀种特殊的⽂件,⼀些socket函数就是对其进⾏的操作(读/写IO、打开、关闭),这些函数我们在后⾯进⾏介绍。
socket⼀词的起源在组⽹领域的⾸次使⽤是在1970年2⽉12⽇发布的⽂献中发现的,撰写者为Stephen Carr、Steve Crocker和Vint Cerf。
网页实时聊天之PHP实现websocket
⽹页实时聊天之PHP实现websocket前⾔websocket 作为 HTML5 ⾥⼀个新的特性⼀直很受⼈关注,因为它真的⾮常酷,打破了 http “请求-响应”的常规思维,实现了服务器向客户端主动推送消息,本⽂介绍如何使⽤ PHP 和 JS 应⽤ websocket 实现⼀个⽹页实时聊天室;以前写过⼀篇⽂章讲述如何使⽤ajax长轮询实现⽹页实时聊天,见链接:,但是轮询和服务器的 pending 都是⽆谓的消耗,websocket 才是新的趋势。
最近艰难地“挤”出了⼀点时间,完善了很早之前做的 websocket “请求-原样返回”服务器,⽤js完善了下客户端功能,把过程和思路分享给⼤家,顺便也普及⼀下websocket 相关的知识,当然现在讨论 websocket 的⽂章也特别多,有些理论性的东西我也就略过了,给出参考⽂章供⼤家选择阅读。
正⽂开始前,先贴⼀张聊天室的效果图(请不要在意CSS渣的页⾯):然后当然是源码:websocket简介WebSocket 不是⼀门技术,⽽是⼀种全新的协议。
它应⽤ TCP 的 Socket(套接字),为⽹络应⽤定义了⼀个新的重要的能⼒:客户端和服务器端的双全⼯传输和双向通信。
是继 Java applets、 XMLHttpRequest、 Adobe Flash,、ActiveXObject、各类 Comet 技术之后,服务器推送客户端消息的新趋势。
与http的关系在⽹络分层上,websocket 与 http 协议都是应⽤层的协议,它们都是基于 tcp 传输层的,但是 websocket 在建⽴连接时,是借⽤ http 的 101 switch protocol 来达到协议转换(Upgrade)的,从 HTTP 协议切换成 WebSocket 通信协议,这个动作协议中称“握⼿”;握⼿成功后,websocket 就使⽤⾃⼰的协议规定的⽅式进⾏通讯,跟 http 就没有关系了。
hpsocket c语言例子
hpsocket c语言例子HP-Socket是一个基于IOCP(IO Completion Port)的高性能网络通信框架,提供了TCP和UDP的客户端和服务器端实现,支持IPv4和IPv6,适用于Windows操作系统。
下面将列举10个HP-Socket C语言例子,以便更好地理解和使用该框架。
1. 简单的TCP服务器和客户端示例这个例子演示了如何使用HP-Socket框架创建一个简单的TCP服务器和客户端,服务器接收客户端的连接和数据,并将其原样返回给客户端。
2. 异步TCP服务器和客户端示例这个例子展示了如何使用HP-Socket框架创建一个异步的TCP服务器和客户端,服务器和客户端之间的通信是非阻塞的,提高了系统的并发处理能力。
3. UDP服务器和客户端示例这个例子展示了如何使用HP-Socket框架创建一个UDP服务器和客户端,服务器接收客户端发送的数据包,并将其原样返回给客户端。
4. 大文件传输示例这个例子演示了如何使用HP-Socket框架实现大文件的传输,通过分片传输和MD5校验,确保文件传输的可靠性和完整性。
5. SSL加密通信示例这个例子演示了如何使用HP-Socket框架实现SSL加密通信,保护数据在网络传输过程中的安全性。
6. 自定义协议示例这个例子展示了如何使用HP-Socket框架实现自定义协议的通信,通过自定义协议头部和数据格式,实现更灵活的数据交互。
7. 多线程服务器示例这个例子演示了如何使用多线程来处理客户端的连接和数据,提高服务器的并发处理能力。
8. 定时器示例这个例子展示了如何使用HP-Socket框架实现定时器功能,定时执行某些操作,例如定时发送心跳包。
9. 数据压缩和解压缩示例这个例子展示了如何使用HP-Socket框架实现数据的压缩和解压缩,减少数据在网络传输中的带宽占用。
10. 代理服务器示例这个例子演示了如何使用HP-Socket框架实现代理服务器,实现客户端和目标服务器之间的数据转发。
Socket心跳机制-JS+PHP实现
Socket⼼跳机制-JS+PHP实现本⽂是我在实际⼯作中⽤到的Socket通信,关于⼼跳机制的维护⽅式,特意总结了⼀下,希望对朋友们有所帮助。
Socket应⽤:⾸先Socket 封装了tcp协议的,通过长连接的⽅式来与服务器通信,是由服务器和客户端两部分组成的,当客户端成功连接之后,服务器会记录这个⽤户,并为它分配资源,当客户端断开连接后,服务器会⾃动释放资源。
但在实际的⽹络环境中会有很多因素的导致服务器不知道客户端断开,或者客户端不知道服务器宕机,等等,⽐如⽹络中使⽤了路由器、交换机等等;这就带来⼀个问题:此时此刻服务器如何知道能否同客户端正常通信?解决这个问题的办法就是采⽤⼼跳。
简单的说就是:在客户端和服务器连接成功后,隔⼀段时间服务器询问⼀下客户端是否还在,客户端收到后应答服务器"我还在",如果服务器超出⼀定时间(⼀般40-50秒)未收到客户端的应答,就判定它已经⽆法通信了,这时候需要释放资源,断开这个客户端⽤户。
客户端JS代码:<!DOCTYPE html><html><head lang="en"><meta charset="utf-8"><title></title></head><body><h3>WebSocket协议的客户端程序</h3><button id="btConnect">连接到WS服务器</button><button id="btSendAndReceive">向WS服务器发消息并接收消息</button><button id="btClose">断开与WS服务器的连接</button><div id="val"></div><script type="text/javascript">var wsClient=null;var lastHealthTime = 0; //记录最近⼀次⼼跳更新时间var heartbeatTimer = null;//⼼跳执⾏timervar checkTime = 10000; //⼼跳检查时间间隔-毫秒 10秒var healthTimeOut = 20000;//⼼跳时间间隔-毫秒 20秒var reconnectTimer = null;//重连接timervar reconnectTime = 10000;//重连接时间10秒后var uid = "20";var connectStatus = 3; //状态function connect(){if (connectStatus == 3){wsClient=new WebSocket('ws://127.0.0.1:8000'); //这个端⼝号和容器监听的端⼝号⼀致console.log("连接中...");console.log("readyState:"+wsClient.readyState);if (reconnectTimer){clearTimeout(reconnectTimer);}//连接成功wsClient.onopen = function(){connectStatus = wsClient.readyState;// 表名⾃⼰是uid1var data = uid; //1标识连接wsClient.send(data);console.log('ws客户端已经成功连接到服务器上');msg.innerHTML="连接成功...";console.log("readyState:"+wsClient.readyState);var time = new Date();lastHealthTime = time.getTime();if(heartbeatTimer){clearInterval(heartbeatTimer);}heartbeatTimer = setInterval(function(){keepalive(wsClient)}, checkTime);};//收到消息wsClient.onmessage = function(e){console.log('ws客户端收到⼀个服务器消息:'+e.data);console.log("readyState:"+wsClient.readyState);val.innerHTML=e.data;var data = e.data;if (data){var msg_type = data.substr(0,1);var uid = data.substr(1);var time = new Date();lastHealthTime = time.getTime();//更新客户端的最后⼀次⼼跳时间}}//错误wsClient.onerror = function(e){connectStatus = wsClient.readyState;console.log("error");console.log("readyState:"+wsClient.readyState);msg.innerHTML="连接错误...";};//关闭wsClient.onclose = function(){connectStatus = wsClient.readyState;console.log('到服务器的连接已经断开');msg.innerHTML="连接断开...";console.log("readyState:"+wsClient.readyState);//n秒后重连接reconnectTimer = setTimeout(function(){connect();},reconnectTime);}}}btConnect.onclick = function(){connect();}btSendAndReceive.onclick = function(){wsClient.send('Hello Server');}btClose.onclick = function(){console.log("断开连接");console.log(wsClient.readyState);wsClient.close();}function keepalive(ws){var time = new Date();console.log(time.getTime()-lastHealthTime);if ((time.getTime()-lastHealthTime)>healthTimeOut){msg.innerHTML="⼼跳超时,请连接断开...";if (heartbeatTimer){clearInterval(heartbeatTimer);//n秒后重连接ws.close();reconnectTimer = setTimeout(function(){connect();},reconnectTime);}}else{msg.innerHTML="我依然在连接状态";ws.send(data);}}</script><div id="msg"></div></body></html>服务端代码:这⾥我采⽤的是PHP语⾔,使⽤workman来实现的socket服务器端<?phprequire_once __DIR__ .'/Autoloader.php';use Workerman\Worker;use Workerman\Lib\Timer;define('HEARTBEAT_TIME', 40);//⼼跳间隔时间define('CHECK_HEARTBEAT_TIME', 10); // 检查连接的间隔时间// 初始化⼀个worker容器,监听1234端⼝$worker = new Worker('websocket://0.0.0.0:8000');// 这⾥进程数必须设置为1$worker->count = 1;// worker进程启动后建⽴⼀个内部通讯端⼝$worker->onWorkerStart = function($worker){Timer::add(CHECK_HEARTBEAT_TIME, function()use($worker){$time_now = time();foreach($worker->connections as$connection) {// 有可能该connection还没收到过消息,则lastMessageTime设置为当前时间if (empty($connection->lastMessageTime)) {$connection->lastMessageTime = $time_now;continue;}// 上次通讯时间间隔⼤于⼼跳间隔,则认为客户端已经下线,关闭连接if ($time_now - $connection->lastMessageTime > HEARTBEAT_TIME) {$connection->close();}}});};// 新增加⼀个属性,⽤来保存uid到connection的映射$worker->uidConnections = array();// 当有客户端发来消息时执⾏的回调函数$worker->onMessage = function($connection, $data)use($worker){$uid = $data; //uid//echo 'connection...'.$uid.'\n';// 判断当前客户端是否已经验证,既是否设置了uidif(!isset($connection->uid)){if (intval($msg_type) === 1){ //连接//上次收到的⼼跳消息时间$connection->lastMessageTime = time();// 没验证的话把第⼀个包当做uid(这⾥为了⽅便演⽰,没做真正的验证)$connection->uid = $uid;/* 保存uid到connection的映射,这样可以⽅便的通过uid查找connection, * 实现针对特定uid推送数据*/$worker->uidConnections[$connection->uid] = $connection;echo 'MSG USER COUNT:'.count($worker->uidConnections);echo '\n';return;}}else{if ($connection->uid === $uid){//服务器收到⼼跳//echo 'U-heart:'.$connection->uid.'\n';$connection->lastMessageTime = time();echo 'back send:';$buffer = $uid;$ret = sendMessageByUid($uid, $buffer);$result = $ret ? 'ok' : 'fail';// echo $result;}}};// 当有客户端连接断开时$worker->onClose = function($connection)use($worker){global$worker;if(isset($connection->uid)){// 连接断开时删除映射unset($worker->uidConnections[$connection->uid]);echo 'CLOSE USER COUNT:'.count($worker->uidConnections);echo '-'.$connection->uid.' closed';echo '\n';}};// 向所有验证的⽤户推送数据function broadcast($message){global$worker;foreach($worker->uidConnections as$connection){$connection->send($message);}}// 针对uid推送数据function sendMessageByUid($uid, $message){global$worker;if(isset($worker->uidConnections[$uid])){$connection = $worker->uidConnections[$uid];$connection->send($message);return true;}return false;}// 运⾏所有的worker(其实当前只定义了⼀个)Worker::runAll();。
hpsocket用法
hpsocket用法
hpsocket是一个基于IOCP的高性能网络库,用于快速开发可
靠的高性能TCP/UDP/HTTP/WebSocket服务器和客户端。
它提供了一
套简单易用的接口,可以帮助开发者快速构建网络应用程序。
首先,你需要下载hpsocket库的最新版本,并将其集成到你的
项目中。
你可以从官方网站或者GitHub上找到hpsocket的最新版本,并按照官方文档中的说明进行安装和集成。
一旦集成完成,你可以开始使用hpsocket库来开发网络应用程序。
首先,你需要创建一个Server或Client对象,然后通过设置
一些回调函数来处理网络事件,比如连接建立、数据到达、连接断
开等。
在回调函数中,你可以编写具体的业务逻辑来处理这些事件。
除了基本的网络事件处理,hpsocket还提供了丰富的功能和工具,比如SSL支持、自定义协议支持、性能优化工具等。
你可以根
据自己的需求选择合适的功能和工具来完善你的网络应用程序。
在使用hpsocket的过程中,你可能会遇到一些常见的问题,比
如内存泄漏、性能瓶颈等。
在这种情况下,你可以查阅官方文档或
者在官方论坛上寻求帮助,也可以查看一些开源项目或者案例来学习其他开发者是如何使用hpsocket来解决类似的问题的。
总的来说,hpsocket是一个功能强大、易用性高的网络库,可以帮助开发者快速构建可靠的高性能网络应用程序。
通过学习官方文档和案例,以及参与开发者社区的讨论,你可以更好地掌握hpsocket的用法并发挥其最大的潜力。
易语言hpsocket例子
易语言hpsocket例子HP-Socket是一个基于IOCP的高性能网络通信框架,在易语言中的使用非常方便。
下面将列举出一些HP-Socket的例子,希望能帮助读者更好地理解和应用该框架。
1. TCP客户端示例我们可以使用HP-Socket框架编写一个简单的TCP客户端程序。
首先,我们需要创建一个TCP客户端对象,然后调用Connect方法连接到服务器。
连接成功后,我们可以使用Send方法发送数据,使用Recv方法接收服务器返回的数据。
最后,我们需要调用Disconnect 方法断开连接。
2. TCP服务器示例使用HP-Socket框架编写一个TCP服务器也非常简单。
首先,我们需要创建一个TCP服务器对象,并调用Start方法监听指定的端口。
当有客户端连接到服务器时,会触发OnAccept事件,我们可以在这个事件中处理连接的逻辑。
连接建立后,我们可以使用Send和Recv方法与客户端进行通信。
当客户端断开连接时,会触发OnClose事件,我们可以在这个事件中进行资源释放。
3. UDP客户端示例使用HP-Socket框架编写一个UDP客户端也非常简单。
首先,我们需要创建一个UDP客户端对象,并调用SetRemoteAddress方法设置服务器的IP地址和端口号。
然后,可以使用Send方法发送数据包到服务器。
当收到服务器返回的数据包时,会触发OnReceive事件,我们可以在这个事件中处理接收到的数据。
4. UDP服务器示例使用HP-Socket框架编写一个UDP服务器也非常简单。
首先,我们需要创建一个UDP服务器对象,并调用Start方法监听指定的端口。
当收到客户端发送的数据包时,会触发OnReceive事件,我们可以在这个事件中处理接收到的数据。
然后,可以使用SendTo方法将数据包发送给客户端。
5. WebSocket客户端示例HP-Socket框架也支持WebSocket协议。
我们可以使用WebSocket 客户端对象来连接到服务器,并发送和接收WebSocket消息。
civetweb websocket 例子
civetweb websocket 例子以下是一个使用civetweb实现简单的WebSocket服务器和客户端的例子:服务端(server.c):```c#include <stdlib.h>#include <stdio.h>#include "civetweb.h"static int websocket_connect_handler(const struct mg_connection *conn, void *cbdata){printf("WebSocket client connected\n");return MG_TRUE;}static int websocket_ready_handler(struct mg_connection *conn, void *cbdata){printf("WebSocket client ready\n");// 发送欢迎消息给客户端const char *welcome_msg = "Welcome to WebSocket server!"; mg_websocket_write(conn,MG_WEBSOCKET_OPCODE_TEXT, welcome_msg,strlen(welcome_msg));return MG_TRUE;}static int websocket_data_handler(struct mg_connection *conn, int flags, char *data, size_t len, void *cbdata){// 处理收到的消息printf("Received data: %.*s\n", (int) len, data);// 原封不动的将消息发送回客户端mg_websocket_write(conn,MG_WEBSOCKET_OPCODE_TEXT, data, len);return MG_TRUE;}int main(void){struct mg_context *ctx;// 初始化civetwebconst char *options[] = {"listening_ports", "8080", NULL};ctx = mg_start(&websocket_connect_handler, NULL, options);// 设置WebSocket事件处理器mg_set_protocol_http_websocket(ctx);// 设置WebSocket消息处理器mg_register_http_endpoint(ctx, "/websocket",websocket_ready_handler, websocket_data_handler, NULL);printf("WebSocket server started on port 8080\n");// 等待终止事件while (1) {mg_poll_server(ctx, 1000);}// 停止服务器mg_stop(ctx);return 0;}```客户端(client.html):```html<!DOCTYPE html><html><head><meta charset="UTF-8"><title>WebSocket Client</title><script type="text/javascript">var ws = new WebSocket("ws://localhost:8080/websocket"); ws.onopen = function() {console.log("WebSocket connected");};ws.onmessage = function(evt) {console.log("Received data: " + evt.data);};ws.onclose = function() {console.log("WebSocket closed");};function sendMsg() {var msg = document.getElementById("inputMsg").value; ws.send(msg);}</script></head><body><input type="text" id="inputMsg" placeholder="Type a message" /><button onclick="sendMsg()">Send</button></body></html>```运行方式:1. 在命令行中进入示例代码所在的目录2. 编译服务端代码:`gcc -o server server.c -lmongoose`3. 启动服务端:`./server`4. 在浏览器中打开client.html启动服务端后,控制台会输出"WebSocket server started on port8080",表示服务端已经成功启动了。
php socket拟POST
fsockopen以socket方式打开一个连接,最常用的是模拟post。
模拟get方式,直接用file_get_content 就行了.代码见后。
stream_socket_client, 代码见后。
这个和fsockopenfsockopen一样.以socket方式打开一个连接,只是参数不同stream_socket_server建立一个socket server端, 代码见后。
如果是建立的是tcp的server 就用stream_socket_accept进行通讯如果是建立的是udp的server 就用stream_socket_recvfrom和stream_socket_sendto进行通讯,而且stream_socket_server中需要加个参数STREAM_SERVER_BIND还有个socket扩展,这个是最基础的建立socket,但是从5.3.0开始就放到pecl中了.---------- stream_socket client-------------------〈?php/*** @author: DogWin* @Email&MSN&QQ:weblsfamily@* @Website: * @Office: 易路通* @Date: 2010-11-30*/$xport = "tcp";$port = "8001";$ip = "127.0.0.1";$address = "{$xport}://{$ip}:{$port}";$fp = stream_socket_client($address, $errno, $errstr, 1);if (!$fp) {echo "$errstr ($errno)〈br /〉\n";} else {fwrite($fp, "\n");echo fread($fp, 1024);fclose($fp);}?〉----------------- streamSocketServer------------------〈?php/*** @author: DogWin* @Email&MSN&QQ:weblsfamily@* @Website: * @Office: 易路通* @Date: 2010-11-30*/header("Content-type: text/html;charset=utf-8");//设置不超时.服务端当然不能超时set_time_limit(0);//得到可用socket$xportlist = stream_get_transports();echo "transports:\n";foreach ($xportlist as $value) {echo "{$value}\n";}//定义一些东西$xport = "tcp";$port = "8001";$address = "{$xport}://0.0.0.0:{$port}";//建立socketserverif ($xport==’tcp’) {$socket = stream_socket_server($address, $errno, $errstr);}elseif ($xp ort==’udp’) {$socket = stream_socket_server($address, $errno, $errstr, STREAM_SERVER_BIND); }if (!$socket) {echo "{$errstr} ({$errno})\n";}else {echo "listening {$xport}:{$port} ...\n";if ($xport==’tcp’) {//许可一个socket连接,-1超时while ($conn = stream_socket_accept($socket,-1)) {//得到访问的端口$peer = stream_socket_get_name($conn,true);echo "$peer\n";fwrite($conn, ’The local time is ’ . date("Y-m-d H:i:s\n"));fclose($conn);}}elseif ($xport==’udp’) {do {//得到访问的端口$pkt = stream_socket_recvfrom($socket, 1, 0, $peer);echo "$peer\n";stream_socket_sendto($socket, date("Y-m-d H:i:s\n"), 0, $peer);} while ($pkt !== false);}//关闭socketfclose($socket);}?〉------------------ fsockopen(post)-----------------〈?php/*** @author: DogWin* @Email&MSN&QQ:weblsfamily@* @Website: * @Office: 易路通* @Date: 2010-11-30*//*** php 发送POST请求** @param string $url 提交到的地址* @param array $data 要提交的参数array(’a’=〉’’,’b’=〉’’);* @return string*/function virtualPost($url, $data) {$url = parse_url($url);if (!$url) return "URL不能解析";if (!isset($url[’port’])) $url[’port’] = "";if (!isset($url[’query’])) $url[’query’] = "";$encoded = "";while (list($k,$v) = each($data)) {$encoded .= ($encoded ? "&" : "");$encoded .= rawurlencode($k)."=".rawurlencode($v);}//$fp = stream_socket_client($url[’host’].":".($url[’port’] ? $url[’port’] : 80));$fp = fsockopen($url[’host’], $url[’port’] ? $url[’port’] : 80);if (!$fp) return "不能打开到$url[host]的连接";//发送fputs($fp, sprintf("POST %s%s%s HTTP/1.0\n", $url[’path’], $url[’query’] ? "?" : "", $url[’query’]));fputs($fp, "Host: $url[host]\n");fputs($fp, "Content-type: application/x-www-form-urlencoded\n");fputs($fp, "Content-length: " . strlen($encoded) . "\n");fputs($fp, "Connection: close\n\n");fputs($fp, "$encoded\n");//接受$line = fgets($fp,1024);if (!eregi("^HTTP/1\.. 200", $line)) return "返回结果错误";//滤掉空行$results = "";$inheader = 1;while(!feof($fp)) {$line = fgets($fp,1024);//把剩余的头信息过滤掉if ($inheader && ($line == "\n" || $line == "\r\n")) {$inheader = 0;}elseif (!$inheader) {$results .= $line;}}fclose($fp);return $results;}echo virtualPost(’http://127.0.0.1/test/test2.php’,array(myz=〉’马永占’));?〉--------------------------------------<?phperror_reporting (E_ALL);$service_port = 3456;$address = "10.3.10.99";$socket = socket_create (AF_INET, SOCK_STREAM, 0);if ($socket < 0){echo "socket_create() failed: reason: " . socket_strerror ($socket) . "\n";exit();}else{echo "Attempting to connect to '$address' on port '$service_port'...". "\n";$result = socket_connect ($socket, $address, $service_port);if ($result == FALSE ){echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n";exit();}else{$send = '';//WORD wLength; // 数据区有效长度,从数据区aucData[0]开始$send = $send . pack("L",44);//UCHAR aucResv[TRANSFRAME_RESV_LENGTH]; // 保留$send = $send . pack("L",0);//_UL ulSIP; 源IP地址,业务不需要填写$send = $send . pack("L",0);//_UL ulDIP; // 目的IP地址,业务不需要填写$send = $send . pack("L",0);//_US usDProcID; // 目的进程ID$send = $send . pack("S",88);//_US usDProcHandle; // 目的进程Handle, 当一个进程启动多个实例时需要判断$send = $send . pack("S",89);//_UL ulDCmdHandle; // 目的命令句柄,标识一个模块内发送的命令标识$send = $send . pack("L",90);//_US usSProcID; // 源端进程ID$send = $send . pack("S",91);//_US usSProcHandle; // 源端进程Handle, 当一个进程启动多个实例时需要判断$send = $send . pack("S",92);//_UL ulSCmdHandle; // 源命令句柄,标识一个模块内发送的命令标识$send = $send . pack("L",93);//_US usMsgVer; // 消息版本号$send = $send . pack("S",94);//_US usMsgType; // 消息类型,具体类型附后$send = $send . pack("S",95);//_UL ulCmdCode; // 命令码$send = $send . pack("L",96);//_UC ucReserve[8]; // 保留$send = $send . pack("L",0);//_UL ulRetCode; // 交互返回码, 应用使用, 通讯无关$send = $send . pack("L",0);//_UL ulLength; // 后附数据区长度$send = $send . pack("L",0);$crc = 0xFFFF;for ($x = 0; $x < strlen ($send); $x++){$crc = $crc ^ ord($send[$x]);for ($y = 0; $y < 8; $y++){if (($crc & 0x0001) == 0x0001){$crc = (($crc >> 1) ^ 0xA001);}else{ $crc = $crc >> 1; }}}$Realsend = '';//DWORD dwHeaderFlag; // 帧的起始标志$Realsend = $Realsend . pack("L",0xDEADDEAD);//WORD wCrcCode; // CRC校验码,从长度字节wLength开始$Realsend = $Realsend . pack("L",$crc);$Realsend = $Realsend . $send;echo "the length is";echo strlen($Realsend);echo "the message is";echo $Realsend;echo "Sending Msg...";socket_write ($socket, $Realsend, strlen ($Realsend));$out ='';echo "Reading response:\n\n";$time = time();$PP=TRUE;socket_set_nonblock($socket);echo time();while($PP){$out =socket_read($socket,8);if ((time() - $time) >= 10 ){echo "Time out ,Closing socket...";$PP = FALSE;//socket_close($socket);}else{sleep(1);continue;}}echo time();echo "Closing socket...";socket_close($socket);}}?>----------------------------------------------------------------------看看下面的文章比较好PHP套接字编程1. 理解套接字Mail、ftp、telnet、name和finger这些服务都是在一个专用的公开的端口上提供的,通过连接到这些端口,客户程序就能够访问这些服务。
PHP sockets程序实例代码
《PHP sockets程序实例代码》前面两篇文章我们已经了解到:什么叫socketswindows下怎样配置PHP sockets编程环境本文将分享编写一个简单的socket程序的思路。
测试环境:windows7wamp(php5.3.8)一个socket就像一个插头,它提供了两个进程间通信的方式。
一般来说,它允许你在任意未被使用的端口进行接收或发送信息。
那么怎样使用sockets呢?socket 服务端的编写:为了使问题不至于太复杂,这里我们写一个简单的例子,步骤如下:在指定的IP和端口创建一个socket 使用socket_create()和socket_bind()socket监听使用socket_listen()等待来自客户端的链接使用socket_accept()从socket读取数据使用socket_read()输出数据后,关闭socket 使用socket_close()下面是socketserver.php代码:请查看原文socket客户端的编写:在指定的端口创建一个socket 使用socket_create()使用刚刚创建的socket连接服务端的socket 使用socket_connect()给服务端发送消息使用socket_send()关闭socket 使用socket_close()socketclient.php代码如下:请查看原文在命令行下测试socket程序。
如果你还没有在命令行下运行过php程序,请参考windows命令行下运行PHP程序。
以下是本人测试的过程和结果:运行socketserver.phpC:\Users\henrypoter>N:\wamp\bin\php\php5.3.8\php.exe -f"N:\wamp\www\word\socketserver.php"server is listenning...运行socketclient.phpC:\Users\henrypoter>N:\wamp\bin\php\php5.3.8\php.exe -f"N:\wamp\www\word\socketclient.phpsocketserver端的输出结果:C:\Users\henrypoter>N:\wamp\bin\php\php5.3.8\php.exe -f"N:\wamp\www\word\socketserver.php"server is listenning...Connection acceptedMessage From Client: This is a message from the client.在php5.3.8版本下面测试socket_send()函数的第4个参数不能设置为MSG_EOF,MSG_EOR可能是该版本的一个bug。
使用WebSocket实现服务端和客户端的通信
使⽤WebSocket实现服务端和客户端的通信开发中经常会有这样的使⽤场景.如某个⽤户在⼀个数据上做了xx操作, 与该数据相关的⽤户在线上的话,需要实时接收到⼀条信息.这种可以使⽤WebSocket来实现. 另外,对于消息,可以定义⼀个类进⾏固化. 主要是消息内容,接收⼈,发送⼈,是否已发送等. ⽤户上线时, 通过⽅法去查询出来然后进⾏发送@ServerEndpoint(value = "/websocket/{sessionId}")public class MyWebSocket {//静态变量,⽤来记录当前在线连接数。
应该把它设计成线程安全的。
private static AtomicInteger onlineCount = new AtomicInteger(0);//concurrent包的线程安全Set,⽤来存放每个客户端对应的MyWebSocket对象。
若要实现服务端与单⼀客户端通信的话,可以使⽤Map来存放,其中Key可以为⽤户标识public static CopyOnWriteArraySet<MyWebSocket> webSocketSet = new CopyOnWriteArraySet<MyWebSocket>();//与某个客户端的连接会话,需要通过它来给客户端发送数据public Session session;/*** 连接建⽴成功调⽤的⽅法** @param session 可选的参数。
session为与某个客户端的连接会话,需要通过它来给客户端发送数据*/@OnOpenpublic void onOpen(Session session) {this.session = session;if (webSocketSet.add(this)) {System.out.println("有新连接加⼊!当前在线⼈数为" + onlineCount.incrementAndGet());}}/*** 连接关闭调⽤的⽅法*/@OnClosepublic void onClose() {if (webSocketSet.remove(this)) {System.out.println("有⼀连接关闭!当前在线⼈数为" + onlineCount.decrementAndGet());}}/*** 收到客户端消息后调⽤的⽅法** @param message 客户端发送过来的消息* @param session 可选的参数*/@OnMessagepublic void onMessage(String message, Session session) {System.out.println("来⾃客户端的消息:" + message);//群发消息/* for(MyWebSocket item: webSocketSet){try {item.sendMessage(message);} catch (IOException e) {e.printStackTrace();continue;}}*/}/*** 发⽣错误时调⽤** @param session* @param error*/@OnErrorpublic void onError(Session session, Throwable error) {System.out.println("发⽣错误");error.printStackTrace();}private static ReentrantLock lock = new ReentrantLock(true);/*** 该⽅法是我们根据业务需要调⽤的.** @param message* @throws IOException*/public void sendMessage(String message) throws IOException {synchronized(this.session) {if (session.isOpen()) {this.session.getAsyncRemote().sendText(message);}}}}页⾯中的调⽤.每个客户都要初始化⼀个websocket⽰例. 其中我们⽤⽤户的userId作为标识的⼀部分.//页⾯加载完成. 初始化⼀个webSocket对象.然后可以根据需要调⼀个来发信息window.onload = function () {initWebSocket();setTimeout(function(){$.post('<%=basePath %>xxx.do',function(r){//alert(0);});},2000);};function initWebSocket() {webSocket = new WebSocket(requestUrl.replace("http", "ws")+ 'websocket/${userId}');webSocket.onerror = function (event) {onError(event)};//连接建⽴成功事件webSocket.onopen = function (event) {onOpen(event)};//接收到服务端消息事件webSocket.onmessage = function (event) {onMessage(event)};}----------------------------------------------------------------------------------------------------------webSocket与html区别,以及服务端与客户端消息通讯利⽤webSocket⼀、WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不⽀持持久连接的(长连接,循环连接的不算)⾸先HTTP有1.1和1.0之说,也就是所谓的keep-alive,把多个HTTP请求合并为⼀个,但是Websocket其实是⼀个新协议,跟HTTP协议基本没有关系,只是为了兼容现有浏览器的握⼿规范⽽已,也就是说它是HTTP协议上的⼀种补充可以通过这样⼀张图理解&amp;lt;img src="https:///6651f2f811ec133b0e6d7e6d0e194b4c_b.jpg" data-rawwidth="374" data-rawheight="133" class="content_image" width="374"&amp;gt;有交集,但是并不是全部。
php获取udp数据方法
php获取udp数据方法在PHP中获取UDP数据有以下几种方法:1. fsockopen与stream_socket_client函数:可以通过这两个函数创建一个UDP连接,并读取数据。
示例代码如下:```php$socket = fsockopen('udp://127.0.0.1', 1234, $errno, $errstr);if (!$socket)echo "UDP连接失败: $errstr ($errno)\n";} elsefwrite($socket, "GET / HTTP/1.0\r\n\r\n");$response = fread($socket, 4096);fclose($socket);echo "UDP响应:\n\n$response";```2. socket_bind与socket_recvfrom函数:可以使用这两个函数创建一个UDP套接字,并从UDP连接中接收数据。
示例代码如下:```php$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);socket_bind($socket, '127.0.0.1', 1234);$from = '';$port = 0;socket_recvfrom($socket, $buffer, 4096, 0, $from, $port);echo "从 $from:$port 收到UDP数据: $buffer";socket_close($socket);```3. stream_socket_server函数:可以使用这个函数创建一个UDP服务器,并接收客户端发送的数据。
示例代码如下:```php$socket = stream_socket_server('udp://127.0.0.1:1234', $errno, $errstr, STREAM_SERVER_BIND);if (!$socket)echo "UDP服务器启动失败: $errstr ($errno)\n";} else$buffer = stream_socket_recvfrom($socket, 4096);echo "收到UDP数据: $buffer";stream_socket_sendto($socket, 'Hello client!', 0, $remote);fclose($socket);```4. socket_create与socket_recvfrom函数:可以使用这两个函数创建一个UDP服务器,并接收客户端发送的数据。
PHP实现WebSocket实例详解
PHP实现WebSocket实例详解WebSocket 是什么?摘抄⽹上的⼀些解释:WebSocket 协议是基于 TCP 的⼀种新的⽹络协议。
它实现了浏览器与服务器全双⼯(full-duplex)通信——允许服务器主动发送信息给客户端。
WebSocket 通信协议于2011年被定为标准 RFC 6455,并被 RFC7936 所补充规范。
—— 百度百科WebSocket 是⼀个持久化的协议,这是相对于 http ⾮持久化来说的。
举个简单的例⼦,http1.0 的⽣命周期是以 request 作为界定的,也就是⼀个 request,⼀个 response,对于 http 来说,本次 client 与 server 的会话到此结束;⽽在 http1.1 中,稍微有所改进,即添加了keep-alive,也就是在⼀个 http 连接中可以进⾏多个 request 请求和多个 response 接受操作。
然⽽在实时通信中,并没有多⼤的作⽤,http 只能由 client 发起请求,server 才能返回信息,即 server 不能主动向 client 推送信息,⽆法满⾜实时通信的要求。
⽽ WebSocket 可以进⾏持久化连接,即 client 只需进⾏⼀次握⼿,成功后即可持续进⾏数据通信,值得关注的是 WebSocket 实现 client 与 server 之间全双⼯通信,即 server 端有数据更新时可以主动推送给 client 端。
上图是⼀个演⽰client和server之间建⽴WebSocket连接时握⼿部分client 建⽴ WebSocket 时向服务器端请求的信息GET /chat HTTP/1.1 Host: Upgrade: websocket //告诉服务器现在发送的是WebSocket协议 Connection: Upgrade Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== //是⼀个Base64 encode的值,这个是浏览器随机⽣成的,⽤于验证服务器端返回数据是否是WebSocket助理 Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13 Origin: 服务器获取到 client 请求的信息后,根据 WebSocket 协议对数据进⾏处理并返回,其中要对 Sec-WebSocket-Key 进⾏加密等操作HTTP/1.1 101 Switching Protocols Upgrade: websocket //依然是固定的,告诉客户端即将升级的是Websocket协议,⽽不是mozillasocket,lurnarsocket或者shitsocket Connection: Upgrade Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= //这个则是经过服务器确认,并且加密过后的 Sec-WebSocket-Key,也就是client要求建⽴WebSocket验证的凭证 Sec-WebSocket-Protocol: chatPHP 服务端<?phpif(($socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP)) < 0) {echo "socket_create() 失败的原因是:".socket_strerror($sock)."\n";}if(($ret = socket_bind($socket,'127.0.0.1','9090')) < 0) {echo "socket_bind() 失败的原因是:".socket_strerror($ret)."\n";}if(($ret = socket_listen($socket,3)) < 0) {echo "socket_listen() 失败的原因是:".socket_strerror($ret)."\n";}$all_sockets = [$socket]; // socket 集合do {$copy_sockets = $all_sockets; // 单独拷贝⼀份// 因为客户端是长连接,如果客户端⾮正常断开,服务端会在 socket_accept 阻塞,现在使⽤ select ⾮阻塞模式 socketif(socket_select($copy_sockets, $write, $except, 0) === false)exit('sosket_select error!');// 接收第⼀次 socket 连⼊,连⼊后移除服务端 socketif(in_array($socket, $copy_sockets)) {$client = socket_accept($socket);if($client) {$buf = socket_read($client, 1024);echo $buf;// 匹配 Sec-Websocket-Key 标识if (preg_match("/Sec-WebSocket-Key: (.*)\r\n/i",$buf,$match)) {// 需要将 Sec-WebSocket-Key 值累加字符串,并依次进⾏ SHA-1 加密和 base64 加密$key = base64_encode(sha1($match[1] . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11',true));// 拼凑响应内容$res= "HTTP/1.1 101 Switching Protocol".PHP_EOL."Upgrade: WebSocket".PHP_EOL."Connection: Upgrade".PHP_EOL."WebSocket-Location: ws://127.0.0.1:9090".PHP_EOL."Sec-WebSocket-Accept: " . $key .PHP_EOL.PHP_EOL; // 注意这⾥,需要两个换⾏// 向客户端应答 Sec-WebSocket-Acceptsocket_write($client, $res, strlen($res));// 向客户端发送消息socket_write($client, buildMsg('socket ok'), 1024);// 加⼊客户端 socket$all_sockets[] = $client;}// 移除服务端 socket$key = array_search($socket, $copy_sockets);unset($copy_sockets[$key]);// socket_close($client);}}// 循环所有客户端 socketsforeach ($copy_sockets as $s) {// 获取客户端发给服务端的内容$buf = socket_read($s, 8024);echo strlen($buf).'---'.PHP_EOL;// 代表客户端主动关闭if(strlen($buf) < 9) {$key = array_search($s, $all_sockets);unset($all_sockets[$key]);socket_close($s);continue;}// 输出echo getMsg($buf).PHP_EOL;}}while(true);socket_close($socket);// 编码服务端向客户端发送的内容function buildMsg($msg) {$frame = [];$frame[0] = '81';$len = strlen($msg);if ($len < 126) {$frame[1] = $len < 16 ? '0' . dechex($len) : dechex($len); } else if ($len < 65025) {$s = dechex($len);$frame[1] = '7e' . str_repeat('0', 4 - strlen($s)) . $s;} else {$s = dechex($len);$frame[1] = '7f' . str_repeat('0', 16 - strlen($s)) . $s;}$data = '';$l = strlen($msg);for ($i = 0; $i < $l; $i++) {$data .= dechex(ord($msg{$i}));}$frame[2] = $data;$data = implode('', $frame);return pack("H*", $data);}// 解析客户端向服务端发送的内容function getMsg($buffer) {$res = '';$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++) {$res .= $data[$index] ^ $masks[$index % 4];}return $res;}客户端<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title><script>// 创建⼀个Socket实例var socket = new WebSocket('ws://localhost:9090');// 打开Socketsocket.onopen = function(event) {// 发送⼀个初始化消息socket.send("init msg");};socket.onmessage = function(event) {console.log('收到消息',event);};// 监听Socket的关闭socket.onclose = function(event) {console.log('关闭监听',event);};function send(){socket.send("client msg");}</script></head><body><button onclick="send()">发送消息</button></body></html>运⾏测试:ClientServer到此这篇关于PHP实现WebSocket实例详解的⽂章就介绍到这了,更多相关PHP实现WebSocket内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 */本文章提供在php教程中socket相关函数的实例,如果创建socket 接受一个socket连接写入一个socket 初始化连接等操作。
*/ 2$ip="127.0.0.1"; //定义ip地址
3$port=1000; //定义端口
4$socket=socket_create(af_inet,sock_stream,sol_tcp); //创建socket
5$bind=socket_bind($socket,$ip,$prot); //绑定一个socket
6$listen=socket_listen($socket); //监听socket
7$msg=socket_accept($socket); //接受一个socket连接
8$welcome="欢迎来到php服务/n"; //定义字符串
9 socket_write($msg,$welcome,strlen($welcome)); //写入一个socket
10 socket_close($socket); //关闭socket
11
12
13
14$ip="127.0.0.1"; //定义ip地址
15$port=1000; //定义端口
16$socket=socket_create(af_inet,sock_stream,sol_tcp); //创建socket
17 socket_clear_error($socket); //清空socket错误信息
18 socket_close($socket); //关闭socket
19
20
21
22$sockets=array(); //定义一个数组
23
24if(!socket_create_pair(af_unix,sock_stream,0,$sockets)) //如果socket没有成功创建
25 {
26echo socket_strerror(socket_last_error()); //输出错误信息
27 }
28
29if(!socket_write($sockets[0],"abcdef123n",strlen("abcdef123n"))) //如果执行socket写失败
30 {
31 cho socket_strerror(socket_last_error()); //输出错误信息
32 }
33if(!$data=socket_read($sockets[1],strlen("abcdef123n"),php_binary_read)) //如果读取信息失败
34 {
35echo socket_strerror(socket_last_error()); //输出错误信息
36 }
37var_dump($data); //输出socket数据信息
38
39 socket_close($sockets[0]); //关闭socket1
40 socket_close($sockets[1]); //关闭socket2
41
42
43
44$ip="127.0.0.1"; //定义ip地址
45$port=1000; //定义端口
46$socket=socket_create(af_inet,sock_stream,sol_tcp); //创建socket
47 socket_set_nonblock($socket); //设置不锁定状态
48 socket_connect($socket,$ip,$port); //初始化连接
49 socket_set_block($sock); //锁定socket
50switch(socket_select($r=array($socket),$w=array($socket),$f=array($socket),5)) 51 {
52case 2:
53echo "连接被拒绝!n";
54break;
55case 1:
56echo "成功连接n";
57break;
58case 0:
59echo "连接超时n";
60break;
61 }
62
63
64
65
66class socketlistener extends socket
67 {
68function __construct($port=null) //定义__construct方法
69 {
70$this->stream=@socket_create_listen($port?$port:port); //打开端口接受连接
71 }
72function isactive() //定义isactive方法
73 {
74if($this->stream) //如果有连接
75 {
76return true; //返回真值
77 }
78else//无连接
79 {
80return false; //返回假值
81 }
82 }。