3 回答

TA貢獻2041條經(jīng)驗 獲得超4個贊
和標(biāo)題的兩個參數(shù)都沒有關(guān)系。
和server端"socket_close($msgsock);"有關(guān)。
第一次通信之后,server端就關(guān)閉了來自client的socket。
所以會成功通信一次,然后斷開連接,自然而然后面的通信就都失敗了。

TA貢獻1856條經(jīng)驗 獲得超17個贊
主要是你循環(huán)的地方不對啦!
1.socket_read:
socket_read函數(shù)有兩種讀模式:PHP_BINARY_READ和PHP_NORMAL_READ。
string$input=socket_read(*resource*$socket,int$length[,*int*$type=PHP_BINARY_READ/PHP_NORMAL_READ]);
這兩種模式最大的不同在于對于被讀的信息的結(jié)束標(biāo)志的要求。
socket_read是一種阻塞型的函數(shù),所謂阻塞就是別的事情都不做,只做這一件事。當(dāng)read的字符串長度不長時,read可能只需要幾個微秒的執(zhí)行時間,當(dāng)字符串很長,或者read遲遲沒有返回值時,程序就會陷在read的位置,不會繼續(xù)往下執(zhí)行。
PHP手冊上對socket_read的具體介紹
PHP_BINARY_READ是默認的socket_read模式,對于結(jié)束標(biāo)志沒有固定要求,因此客戶端只需要發(fā)送信息,服務(wù)器端的socket_read讀到最后一個字符之后就會結(jié)束并返回讀到的結(jié)果。而PHP_NORMAL_READ則必須在\n、\r或者讀到的字符串長度達到參變量$length所規(guī)定的最大字符長度之后停止,并返回讀操作的結(jié)果,否則在NORMAL模式下,socket_read會阻塞程序的進行,一直等待到滿足停止read的條件出現(xiàn)為止。
因此在NOAMAL_READ模式下面進行的通信很容易會造成失步。除非每條傳輸?shù)男畔⒍荚谀┪布由弦粋€"\n"或者"\r"。
只需要在信息末尾加上換行符或者回車符,NORMAL和BINARY是差不多的。
對于這兩個程序來說,并不是客戶端發(fā)送報錯,而是服務(wù)器端讀指令不能成功結(jié)束。
2.socket_close($msgsock):
看了一下服務(wù)器端的do-while循環(huán)體,每進行一次循環(huán),都關(guān)閉一次$msgsock然后再重新accept一次。
但是客戶端并沒有循環(huán)進行connect連接,只有循環(huán)的讀顯,甚至沒有循環(huán)寫。這就導(dǎo)致了只有在第一次連接的時候可以通信。服務(wù)器端程序進入第二個循環(huán)之后就會停留在accept那里(然后超時報錯)。
這一套一看就是某論壇上的例程啦(我也錯在這里過)。
如果只是驗證socket通信,而不是檢測連接可靠性,建議修改循環(huán),把accept和$msgsock的close部分都放在循環(huán)外,兩個程序的while循環(huán)里面都只進行讀和寫(和顯),就一個客戶端進行連接和通信,沒必要重復(fù)連接和斷開。
- 3 回答
- 0 關(guān)注
- 1021 瀏覽
添加回答
舉報