3 回答

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

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