1樓:匿名使用者
1、測試環境:
伺服器ip:192.168.150.1
客戶端ip:192.168.150.2
2、測試過程:
客戶端伺服器將在本機(192.168.150.
2)通過socket傳送資料到服務端(192.168.150.
2)的socket伺服器上,服務端接收到客戶端傳送的資料後返回一些資訊給客戶端。
3、服務端檔案內容:
#server.php
<?php
//獲取tcp協議號碼。
$tcp = getprotobyname("tcp");
// 建立server端socket ,建立並返回一個套接字,也稱作一個通訊節點。一個典型的網路連線由 2 個套接字構成,一個執行在客戶端,另一個執行在伺服器端。
$socket = socket_create(af_inet, sock_stream, $tcp);
//繫結要監聽的ip和埠,這裡繫結的ip一定要寫區域網ip,寫成127.0.0.1客戶端將無法與服務端建議連線。
socket_bind($socket, '192.168.150.1', 10008);
//監聽埠
socket_listen($socket);
//初始化一個資料,和客戶端通訊
$buffer = "connect";
while (true) else else
// 從客戶端獲取得的資料
while ($data = @socket_read($connection, 1024, php_normal_read))
} //關閉 socket
socket_close($connection);
printf("closed the socket\n");
} ?>
4、客戶端檔案內容:
client.php
<?php
// 建立客戶端的socet連線
$socket = socket_create(af_inet, sock_stream, sol_tcp);
//連線伺服器端socket
$connection = socket_connect($socket, '192.168.150.1', 10008);
//要傳送到服務端的資訊。
$send_data = "this data will send to server!";
//客戶端去連線服務端並接受服務端返回的資料,如果返回的資料保護not connect就提示不能連線。
while ($buffer = @socket_read($socket, 1024, php_normal_read)) else
//伺服器端收到資訊後,客戶端接收服務端傳給客戶端的迴應資訊。
while ($buffer = socket_read($socket, 1024, php_normal_read))
} }?>
5、在服務端socket服務啟動程序。
interactive mode enabled
6、服務端啟動後檢視啟動的程序及埠。
#netstat -tnlp |grep 10008
tcp 0 0 192.168.150.
13:10008 0.0.
0.0:* listen 28892/php
7、在客戶端(192.168.1.2)上執行傳輸
interactive mode enabled
buffer data: connect
writing to socket
sent to server:this data will send to server!
response from server was:thank you client, you data information received
8、回到服務端上檢視接收到的資訊。
interactive mode enabled
socket connected
send data to client
wrote to socket
buffer: this data will send to server!
9、參考資料
socket_create()函式需要三個引數:一個協議、一個socket型別、一個公共協議。socket_create()函式執行成功返回一個包含socket的資源型別,如果沒有成功則返回false。
2樓:在晴天的雨傘
socket_getpeername() 獲取遠端類似主機的ip地址
socket_getsockname() 獲取本地socket的ip地址
怎麼感覺你用的實際上是對的,難道用nginx一類的負載均衡伺服器了
想用php做socket伺服器,不知道如何實現同時和多個不同客戶端資料互動?
3樓:空雪夢見
因為只有呼叫了accept客戶端才能連上,你如果accept下面接一個迴圈,那麼第二個使用者不是說能不能進這個迴圈,而是連不進……此時只有第一個使用者break出了迴圈,然後程式回頭再呼叫accept,第二個使用者才能連上。
用多程序來處理如何?因為accept一個客戶端以後,應該是馬上準備accept下一個客戶端才對,而不是處理完現在這個客戶端才accept下一個客戶端。
socket_accept以後,直接呼叫 pcntl_fork(),此時程序會**為兩個,其中一個的pnctl_fork返回值是0,另一個不是0。不是0的那個直接繼續呼叫socket_accept即可,是0的那個處理客戶端請求。
pnctl_fork不知道在windows下能不能用。
不過返回不是0的那個程序並不是這樣就完事了,還要呼叫pcntl_wait防止子程序卡在那邊沒有完全結束。你可以在主程序裡時不時就呼叫這個,配上wnohang作為option引數防止沒有子程序需要wait的時候卡在那邊。
這都是linux下常用的處理手段。說實話本來我想讓你用多執行緒的,不過看了一圈不知道php裡怎麼用執行緒,倒是找到了用程序的方式,所以就
4樓:
你知道有session這個東西嗎
如何獲得socket連線客戶端的ip地址
馬三小夥兒 如果伺服器端要獲取客戶端ip的話 假設socket bind listen 函式已經完成addrlen sizeof client 那麼client.sin port 就是客戶端的埠client.sin addr.s addr 就是客戶端的ip。這兩個都是以網路位元組序來儲存的,如果要p...
linux下socket網路程式設計 客戶端向伺服器端傳送檔案
不知道是樓下還是樓上,他用的事windows的套接字貌似,不過過程是一樣的,在linux下面使用的函式名字不同罷了,客戶端向伺服器端傳送檔案,過程其實很簡單 1.客戶端向伺服器端傳送傳輸檔案的請求 可攜帶一些所傳檔案的大小之類的基本資訊 2.伺服器端接收請求 根據檔案資訊看是否能夠接受請求 3.客戶...
php怎麼響應客戶端傳送http請求
獲取請求 如下 測試 獲取域名或主機地址 獲取網頁地址 echo server php self blog testurl.php 獲取 引數 echo server query string id 5 獲取使用者 獲取完整的url 包含埠號的完整url 只取路徑 echo 匹配已找到 else e...