當前位置:首頁 » 編程語言 » phpsocket教程

phpsocket教程

發布時間: 2025-02-06 17:42:13

① 請教php大神,php如何實現點擊頁面上的一個按鈕發送socket的tcp數據

1.參考資料

socket_create()函數需要三個參數:一個協議、一個socket類型、一個公共協議。socket_create()函數運行成功返回一個

包含socket的資源類型,如果沒有成功則返回false。

Socket函數
函數名 描述
函數名 描述
socket_accept() 接受一個Socket連接
socket_bind() 把socket綁定在一個IP地址和埠上
socket_clear_error() 清除socket的錯誤或最後的錯誤代碼
socket_close() 關閉一個socket資源
socket_connect() 開始一個socket連接
socket_create_listen() 在指定埠打開一個socket監聽
socket_create_pair() 產生一對沒有差別的socket到一個數組里
socket_create() 產生一個socket,相當於產生一個socket的數據結構
socket_get_option() 獲取socket選項
socket_getpeername() 獲取遠程類似主機的ip地址
socket_getsockname() 獲取本地socket的ip地址
socket_iovec_add() 添加一個新的向量到一個分散/聚合的數組
socket_iovec_alloc() 這個函數創建一個能夠發送接收讀寫的iovec數據結構
socket_iovec_delete() 刪除一個已分配的iovec
socket_iovec_fetch() 返回指定的iovec資源的數據
socket_iovec_free() 釋放一個iovec資源
socket_iovec_set() 設置iovec的數據新值
socket_last_error() 獲取當前socket的最後錯誤代碼
socket_listen() 監聽由指定socket的所有連接
socket_read() 讀取指定長度的數據
socket_readv() 讀取從分散/聚合數組過來的數據
socket_recv() 從socket里結束數據到緩存
socket_recvfrom() 接受數據從指定的socket,如果沒有指定則默認當前socket
socket_recvmsg() 從iovec里接受消息
socket_select() 多路選擇
socket_send() 這個函數發送數據到已連接的socket
socket_sendmsg() 發送消息到socket
socket_sendto() 發送消息到指定地址的socket
socket_set_block() 在socket里設置為塊模式
socket_set_nonblock() socket里設置為非塊模式
socket_set_option() 設置socket選項
socket_shutdown() 這個函數允許你關閉讀、寫、或指定的socket
socket_strerror() 返回指定錯誤號的周詳錯誤
socket_write() 寫數據到socket緩存
socket_writev() 寫數據到分散/聚合數組

2.代碼:

<?php
$sendStr='30323034033033';//16進制數據
$sendStrArray=str_split(str_replace('','',$sendStr),2);//將16進制數據轉換成兩個一組的數組
$socket=socket_create(AF_INET,SOCK_STREAM,getprotobyname("tcp"));//創建Socket
if(socket_connect($socket,"192.168.1.100",8080)){//連接
for($j=0;$j<count($sendStrArray);$j++){
socket_write($socket,chr(hexdec($sendStrArray[$j])));//逐組數據發送
}
$receiveStr="";
$receiveStr=socket_read($socket,1024,PHP_BINARY_READ);//採用2進制方式接收數據
$receiveStrHex=bin2hex($receiveStr);//將2進制數據轉換成16進制
echo"client:".$receiveStrHex;
}
socket_close($socket);//關閉Socket
?>

② phpwebsocket怎麼直接在socket連接上時返回數據

那是因為,還沒有握手成功,並且這個 in 的處理不是針對客戶端的是針對服務端的
這樣修改
在 websocket.class.php 添加這兩行
if(!$this->users[$k]['hand']){//沒有握手進行握手
$this->handshake($k,$buffer);
$eventreturn = array('k'=>$k,'sign'=>$sign);
$this->eventoutput('handsuccess',$eventreturn);
}

在 server.php 加一個elseif
}elseif('handsuccess'==$type){
//第一次握手成功
$websocket->write($event['sign'],'welcome');
}

③ 利用PHP如何實現Socket伺服器

Socket伺服器的工作方式是這樣的,不間斷地運行以等待客戶端的連接。一旦客戶端連接上了,伺服器就會將它添加到客戶名單中,然後開始等待來自客戶端的消息。

下面是一個完整的源代碼示例:

//
set_time_limit(0);
//Settheipandportwewilllistenon
$address='localhost';
$port=10000;
$max_clients=10;
//
$client=Array();
//CreateaTCPStreamsocket
$sock=socket_create(AF_INET,SOCK_STREAM,0);
//Bindthesockettoanaddress/port
socket_bind($sock,$address,$port)ordie('Couldnotbindtoaddress');
//Startlisteningforconnections
socket_listen($sock);
echo"Waitingforconnections...\r\n";

接下來,我們進入一個無限循環,這里我們設置了一個 $read 數組,包含所有客戶端的套接字和我們主伺服器的套接字。這個變數稍後會用於socket_select語句:告訴PHP監聽來自這些客戶端的每一條消息。

socket_select()的最後一個參數告訴我們的伺服器在返回值之前最多等待5秒鍾。如果它的返回值小於1,表示沒有收到任何數據,那麼只需要返回循環頂部,繼續等待。

然後我們檢查是否有新的客戶端連接,如果 $sock 在 $read 數組中,則表示有新的連接,我們將這個新的連接添加到客戶端數組中。

接下來,代碼會循環通過每個客戶端,檢查是否收到來自於它們的消息。如果是,獲取輸入的內容,根據輸入來檢查這是否是一個斷開消息。如果是,從數組中刪除它們;反之,那它就是一個正常的消息,伺服器再次通過所有客戶端,並一個一個寫信息給他們,跳過發送者。

最後,關閉主伺服器套接字。

乍一看,這似乎是一個大工程,但我們可以將其分解為幾個較小的部分。第一部分是創建伺服器,這是在代碼的2至20行實現的。這部分代碼設置了變數、地址、埠、最大客戶端和客戶端數組。接下來創建socket並將其綁定到我們指定的地址和埠上。

第二部分是設置 $read 數組,包含所有客戶端的套接字和主伺服器的套接字,這個變數稍後會用於socket_select語句。socket_select()的最後一個參數告訴我們的伺服器在返回值之前最多等待5秒鍾。如果它的返回值小於1,表示沒有收到任何數據,那麼只需要返回循環頂部,繼續等待。

第三部分是增加新的客戶端到數組中。這部分代碼位於33至44行,將新的客戶端放置在列表的末尾,檢查以確保客戶端的數量沒有超過我們想要伺服器處理的數量。

接下來是處理客戶端消息的部分,這是伺服器的主要部分。這部分代碼從46行開始,當客戶端將消息發送到伺服器時,就需要這塊代碼挺身而出來處理。消息可以是各種各樣的,斷開消息、實際斷開——只要是伺服器需要處理的消息。

最後,我們可以嘗試創建自己的聊天伺服器。通過上述代碼,你可以根據需求進行修改和擴展。

④ PHP如何開啟socket

如果你是windows系統,請進入安裝目錄,找到php.ini這個文件,找到下面一行。
找到extension=php_sockets.dll一句,將前面的;去掉
;是注釋的意思。

如果你的Linux系統,重新編譯,./configure --help,自己看去,相信你懂的,你也必須學著看這個了。想看看自己的php是否有這個拓展,使用php -m命令來看,如果有,就不用重新編譯了。
--enable-sockets

⑤ 想問下php的socket的工作流程是什麼

PHP 使用Berkley的socket庫來創建它的連接。你可以知道socket只不過是一個數據結構。你使用這個socket數據結構去開始一個客戶端和伺服器之間的會話。這個伺服器是一直在監聽准備產生一個新的會話。當一個客戶端連接伺服器,它就打開伺服器正在進行監聽的一個埠進行會話。這時,伺服器端接受客戶端的連接請求,那麼就進行一次循環。現在這個客戶端就能夠發送信息到伺服器,伺服器也能發送信息給客戶端。
產生一個Socket,你需要三個變數:一個協議、一個socket類型和一個公共協議類型。產生一個socket有三種協議供選擇,繼續看下面的內容來獲取詳細的協議內容。
定義一個公共的協議類型是進行連接一個必不可少的元素。下面的表我們看看有那些公共的協議類型。

表一:協議
名字/常量 描述
AF_INET 這是大多數用來產生socket的協議,使用TCP或UDP來傳輸,用在IPv4的地址
AF_INET6 與上面類似,不過是來用在IPv6的地址
AF_UNIX 本地協議,使用在Unix和Linux系統上,它很少使用,一般都是當客戶端和伺服器在同一台及其上的時候使用
表二:Socket類型
名字/常量 描述
SOCK_STREAM 這個協議是按照順序的、可靠的、數據完整的基於位元組流的連接。這是一個使用最多的socket類型,這個socket是使用TCP來進行傳輸。
SOCK_DGRAM 這個協議是無連接的、固定長度的傳輸調用。該協議是不可靠的,使用UDP來進行它的連接。
SOCK_SEQPACKET 這個協議是雙線路的、可靠的連接,發送固定長度的數據包進行傳輸。必須把這個包完整的接受才能進行讀取。
SOCK_RAW 這個socket類型提供單一的網路訪問,這個socket類型使用ICMP公共協議。(ping、traceroute使用該協議)
SOCK_RDM 這個類型是很少使用的,在大部分的操作系統上沒有實現,它是提供給數據鏈路層使用,不保證數據包的順序

表三:公共協議
名字/常量 描述
ICMP 互聯網控制消息協議,主要使用在網關和主機上,用來檢查網路狀況和報告錯誤信息
UDP 用戶數據報文協議,它是一個無連接,不可靠的傳輸協議
TCP 傳輸控制協議,這是一個使用最多的可靠的公共協議,它能保證數據包能夠到達接受者那兒,如果在傳輸過程中發生錯誤,那麼它將重新發送出錯數據包。

現在你知道了產生一個socket的三個元素,那麼我們就在php中使用socket_create()函數來產生一個socket。這個 socket_create()函數需要三個參數:一個協議、一個socket類型、一個公共協議。socket_create()函數運行成功返回一個包含socket的資源類型,如果沒有成功則返回false。
Resourece socket_create(int protocol, int socketType, int commonProtocol);

現在你產生一個socket,然後呢?php提供了幾個操縱socket的函數。你能夠綁定socket到一個IP,監聽一個socket的通信,接受一個socket;現在我們來看一個例子,了解函數是如何產生、接受和監聽一個socket。

<?php
$commonProtocol = getprotobyname(「tcp」);
$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);
socket_bind($socket, 『localhost』, 1337);
socket_listen($socket);
// More socket functionality to come
?>

上面這個例子產生一個你自己的伺服器端。例子第一行,
$commonProtocol = getprotobyname(「tcp」);
使用公共協議名字來獲取一個協議類型。在這里使用的是TCP公共協議,如果你想使用UDP或者ICMP協議,那麼你應該把getprotobyname() 函數的參數改為「udp」或「icmp」。還有一個可選的辦法是不使用getprotobyname()函數而是指定SOL_TCP或SOL_UDP在 socket_create()函數中。
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
例子的第二行是產生一個socket並且返回一個socket資源的實例。在你有了一個socket資源的實例以後,你就必須把socket綁定到一個IP地址和某一個埠上。

熱點內容
津貼腳本 發布:2025-02-06 19:44:10 瀏覽:739
好分數里如何修改密碼 發布:2025-02-06 19:42:30 瀏覽:155
mysql存儲過程判斷 發布:2025-02-06 19:40:15 瀏覽:852
bat編譯器的作用 發布:2025-02-06 19:26:54 瀏覽:343
phpajaxsession 發布:2025-02-06 19:20:56 瀏覽:623
西安java學習 發布:2025-02-06 19:15:44 瀏覽:622
微信電影源碼網站 發布:2025-02-06 18:55:21 瀏覽:934
本地建mysql資料庫 發布:2025-02-06 18:54:23 瀏覽:762
屏幕看不清了如何輸密碼 發布:2025-02-06 18:51:14 瀏覽:333
手機開腳本買個什麼配置的 發布:2025-02-06 18:45:59 瀏覽:113