第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

socket_read的兩個(gè)參數(shù):PHP_NORMAL_READ 和 PHP_BINARY_READ

socket_read的兩個(gè)參數(shù):PHP_NORMAL_READ 和 PHP_BINARY_READ

PHP
慕運(yùn)維8079593 2019-03-16 00:15:25
簡(jiǎn)單地拿php的socket寫了個(gè)小daemo, 代碼如下: server端:<?php $address = "127.0.0.1";$port = 20461;//創(chuàng)建socket資源$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("socket_create() 失敗的原因是:" . socket_strerror(socket_last_error()) . "/n");//阻塞模式socket_set_block($sock) or die("socket_set_block() 失敗的原因是:" . socket_strerror(socket_last_error()) . "/n");//綁定到socket端口$result = socket_bind($sock, $address, $port) or die("socket_bind() 失敗的原因是:" . socket_strerror(socket_last_error()) . "/n");//監(jiān)聽端口$result = socket_listen($sock) or die("socket_listen() 失敗的原因是:" . socket_strerror(socket_last_error()) . "/n");echo "OKnBinding the socket on $address:$port ... ";echo "OKnNow ready to accept connections.nListening on the socket ... n";do { $msgsock = socket_accept($sock) or die("socket_accept() failed: reason: " . socket_strerror(socket_last_error()) . "/n"); echo "Read client data \n"; $buf = socket_read($msgsock, 8192, PHP_NORMAL_READ); echo "Received msg: $buf \n"; //數(shù)據(jù)傳送 向客戶端寫入返回結(jié)果 $msg = "welcome" . PHP_EOL; socket_write($msgsock, $msg, strlen($msg)) or die("socket_write() failed: reason: " . socket_strerror(socket_last_error()) ."/n"); socket_close($msgsock); } while (true);socket_close($sock); client端:<?phpglobal $argv;$host = "127.0.0.1";$port = 20461;$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)or die("Could not create socketn"); // 創(chuàng)建一個(gè)Socket$connection = socket_connect($socket, $host, $port) or die("Could not connet servern"); // 連接socket_write($socket, $argv[1] . PHP_EOL) or die("Write failedn");//$buff = socket_read($socket, 1024, PHP_NORMAL_READ);while ($buff = socket_read($socket, 1024, PHP_NORMAL_READ)) { echo("Response was:" . $buff . PHP_EOL); }socket_close($socket); 我把服務(wù)端啟動(dòng)之后,客戶端發(fā)送數(shù)據(jù)會(huì)報(bào)錯(cuò):但是把客戶端的socket_read改成PHP_BINARY_READ就可以了;
查看完整描述

3 回答

?
守候你守候我

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超10個(gè)贊

我也是一樣的錯(cuò)誤,你知道為啥normal就不行么

查看完整回答
反對(duì) 回復(fù) 2019-03-18
?
縹緲止盈

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ì)成功通信一次,然后斷開連接,自然而然后面的通信就都失敗了。

查看完整回答
反對(duì) 回復(fù) 2019-03-18
?
慕慕森

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ù)連接和斷開。

查看完整回答
反對(duì) 回復(fù) 2019-03-18
  • 3 回答
  • 0 關(guān)注
  • 1017 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)