room server,signaling server 和客户端之间的交互

一、App版本(iOS为例)

单方向连接:

1.界面app已设定好,输入房间号后,点击join按钮。

[NSURLConnection sendAsynchronousRequest:request

queue:[NSOperationQueue mainQueue]

completionHandler:^(NSURLResponse *response,

NSData *data,

NSError *error) {

if (completionHandler) {

completionHandler(response, data, error);

}

}];

向服务器发送请求:

request:GET : turnServerUrl=https://域名/index.php?username=apprtc&key=0xc401269c75bda99dd198c568d5694730

response:{ URL:https://域名/index.php?username=apprtc&key=0xc401269c75bda99dd198c568d5694730} { status code: 200, headers {

Connection = "keep-alive";

"Content-Type" = "text/html";

Date = "Fri, 16 Jun 2017 09:10:29 GMT";

Server = "nginx/1.5.9";

"Transfer-Encoding" = Identity;

"X-Powered-By" = "PHP/5.5.9-1ubuntu4.21";

} }

data:

iceServers =    (

{

credential = "yjp0ArWpl1s8vOYegRGpYRU/XzU=";

ttl = 86400;

urls =            (

"turn:域名:3478?transport=udp",

"turn:域名:3478?transport=tcp",

"turn:域名:3479?transport=udp",

"turn:域名:3479?transport=tcp"

);

username = "1497605539:";

}

);

request:POST: url =https://域名/join/123456

response:{ URL:https://域名/join/123456} { status code: 200, headers {

"Cache-Control" = "no-cache";

Connection = "keep-alive";

"Content-Length" = 1230;

"Content-Type" = "text/html; charset=utf-8";

Date = "Fri, 16 Jun 2017 09:38:42 GMT";

Server = "nginx/1.5.9";

} }

data:

params    Object

wss_url    "wss://域名:4432/ws"

pc_config    "{\"rtcpMuxPolicy\": \"require…dlePolicy\": \"max-bundle\"}"

room_id    "622620833"

turn_url    "https://域名/index…username=27212903&key=apprtc"

error_messages    []

wss_post_url    "https:/域名:4432"

callstats_params    "{\"appId\": \"none\", \"appSecret\": \"none\"}"

include_rtstats_js    ""

version_info    "{\"branch\": \"master\", \"gi…Mar 6 07:49:29 2017 +0100\"}"

messages    []

ice_server_transports    ""

warning_messages    []

media_constraints    "{\"video\": true, \"audio\": true}"

is_loopback    "false"

pc_constraints    "{\"optional\": []}"

room_link    "http://域名/r/roomID"

offer_options    "{}"

is_initiator    "true"

ice_server_url    "https://域名/v1alpha/iceconfig?key=none"

include_loopback_js    ""

client_id    "27212903"

turn_server_override    []

bypass_join_confirmation    "false"

result    “SUCCESS"

2.上面返回的信息中有wss_url,”wss://域名:4432/ws",wss_post_url“https://域名:4432”,即是websocketUrl,初始化websocket,注册信令,创建主机tcp  /ip端口可读写流。

3.创建peerconnection ,创建LocalMediaStream:videoTrack,audioTrack.发送offer.

4.通过websocket输入输出

outPutStream: outPutBuffer:

GET /ws HTTP/1.1

Host:域名:4432

Sec-WebSocket-Version:13

Upgrade:websocket

Dec-WebSocket-Key:tu1zu……==

Connection:Upgrade Origin:https://域名:4432

inputStream:readBuffer

HTTP1.1  101 Switching Protocols

Upgrade  "websocket"

Connection    "Upgrade"

Sec-WebSocket-Accept    "geUmCmY/h7EFD1/qjbtzyfy1g04="

服务器返回上面代码,表示websocket协议请求成功,状态码101表示服务器客户端升级协议的请求正在进行协议切换,以后的通信就是websocket协议,后续就可以tcp通讯了。

5.websocket注册成功:

log:WebSocket connection opened.

Registering on WSS for rid:123456 cid:09876543

outPutStream:outPutBuffer:

message = {

"cmd" : "register",

"roomid" : "123456",

"clientid" : "09876543"

}

6.log :Signaling state changed: 1:LocalOffer

ICE gathering state changed: 1:Checking

调用PTCPeerConection方法实现

7.SDP

log:

C->RS POST: {"type":"offer","sdp":"v=0\r\no=- 7930074291607742461 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE audio video\r\na=msid-semantic: WMS ARDAMS\r\nm=audio 9 UDP\/TLS\/RTP\/SAVPF 111 103 104 9 102 0 8 106 105 13 127 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:9z7jtEySOjadK2L3\r\na=ice-pwd:P1FSuJPZnkh3t3OU+JWzY3tn\r\na=fingerprint:sha-256 CB:94:1B:E8:AB:B0:D6:EC:BC:B6:54:52:87:17:FC:8D:B4:76:3A:FA:6C:96:D7:BE:32:D7:BD:33:26:5D:20:55\r\na=setup:actpass\r\na=mid:audio\r\na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:3 http:\/\/www.webrtc.org\/experiments\/rtp-hdrext\/abs-send-time\r\na=sendrecv\r\na=rtcp-mux\r\na=rtpmap:111 opus\/48000\/2\r\na=fmtp:111 minptime=10; useinbandfec=1\r\na=rtpmap:103 ISAC\/16000\r\na=rtpmap:104 ISAC\/32000\r\na=rtpmap:9 G722\/8000\r\na=rtpmap:102 ILBC\/8000\r\na=rtpmap:0 PCMU\/8000\r\na=rtpmap:8 PCMA\/8000\r\na=rtpmap:106 CN\/32000\r\na=rtpmap:105 CN\/16000\r\na=rtpmap:13 CN\/8000\r\na=rtpmap:127 red\/8000\r\na=rtpmap:126 telephone-event\/8000\r\na=maxptime:60\r\na=ssrc:282299390 cname:dwTJJogpUnEjR9By\r\na=ssrc:282299390 msid:ARDAMS ARDAMSa0\r\na=ssrc:282299390 mslabel:ARDAMS\r\na=ssrc:282299390 label:ARDAMSa0\r\nm=video 9 UDP\/TLS\/RTP\/SAVPF 100 101 116 117 96\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:9z7jtEySOjadK2L3\r\na=ice-pwd:P1FSuJPZnkh3t3OU+JWzY3tn\r\na=fingerprint:sha-256 CB:94:1B:E8:AB:B0:D6:EC:BC:B6:54:52:87:17:FC:8D:B4:76:3A:FA:6C:96:D7:BE:32:D7:BD:33:26:5D:20:55\r\na=setup:actpass\r\na=mid:video\r\na=extmap:2 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:3 http:\/\/www.webrtc.org\/experiments\/rtp-hdrext\/abs-send-time\r\na=extmap:4 urn:3gpp:video-orientation\r\na=sendrecv\r\na=rtcp-mux\r\na=rtpmap:100 VP8\/90000\r\na=rtcp-fb:100 ccm fir\r\na=rtcp-fb:100 nack\r\na=rtcp-fb:100 nack pli\r\na=rtcp-fb:100 goog-remb\r\na=rtpmap:101 VP9\/90000\r\na=rtcp-fb:101 ccm fir\r\na=rtcp-fb:101 nack\r\na=rtcp-fb:101 nack pli\r\na=rtcp-fb:101 goog-remb\r\na=rtpmap:116 red\/90000\r\na=rtpmap:117 ulpfec\/90000\r\na=rtpmap:96 rtx\/90000\r\na=fmtp:96 apt=100\r\na=ssrc-group:FID 797147928 458665663\r\na=ssrc:797147928 cname:dwTJJogpUnEjR9By\r\na=ssrc:797147928 msid:ARDAMS ARDAMSv0\r\na=ssrc:797147928 mslabel:ARDAMS\r\na=ssrc:797147928 label:ARDAMSv0\r\na=ssrc:458665663 cname:dwTJJogpUnEjR9By\r\na=ssrc:458665663 msid:ARDAMS ARDAMSv0\r\na=ssrc:458665663 mslabel:ARDAMS\r\na=ssrc:458665663 label:ARDAMSv0\r\n”}

[self sendSignalingMessage:sdp]

[self sendSignalingMessageToRoomServer:sdp completionHandler:nil];

sdp:

v=0

o=- 631685190248252292 2 IN IP4 127.0.0.1

s=-

t=0 0

a=group:BUNDLE audio video

a=msid-semantic: WMS ARDAMS

m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 102 0 8 106 105 13 127 126

c=IN IP4 0.0.0.0

a=rtcp:9 IN IP4 0.0.0.0

a=ice-ufrag:ktg6AGYFl6ibNPGY

a=ice-pwd:ZL5KQbLLCNZkDIy0Zt0DXWZ2

a=fingerprint:sha-256 DF:4B:02:9E:4E:78:98:75:BD:E8:13:B4:FD:E5:72:EE:24:B5:36:43:73:6E:A1:3C:4C:13:FD:7A:15:30:5F:E8

a=setup:actpass

a=mid:audio

a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level

a=extmap:3http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time

a=sendrecv

a=rtcp-mux

a=rtpmap:111 opus/48000/2

a=fmtp:111 minptime=10; useinbandfec=1

a=rtpmap:103 ISAC/16000

a=rtpmap:104 ISAC/32000

a=rtpmap:9 G722/8000

a=rtpmap:102 ILBC/8000

a=rtpmap:0 PCMU/8000

a=rtpmap:8 PCMA/8000

a=rtpmap:106 CN/32000

a=rtpmap:105 CN/16000

a=rtpmap:13 CN/8000

a=rtpmap:127 red/8000

a=rtpmap:126 telephone-event/8000

a=maxptime:60

a=ssrc:1330996120 cname:BeTH+Ahwn2YbXhAJ

a=ssrc:1330996120 msid:ARDAMS ARDAMSa0

a=ssrc:1330996120 mslabel:ARDAMS

a=ssrc:1330996120 label:ARDAMSa0

m=video 9 UDP/TLS/RTP/SAVPF 100 101 116 117 96

c=IN IP4 0.0.0.0

a=rtcp:9 IN IP4 0.0.0.0

a=ice-ufrag:ktg6AGYFl6ibNPGY

a=ice-pwd:ZL5KQbLLCNZkDIy0Zt0DXWZ2

a=fingerprint:sha-256 DF:4B:02:9E:4E:78:98:75:BD:E8:13:B4:FD:E5:72:EE:24:B5:36:43:73:6E:A1:3C:4C:13:FD:7A:15:30:5F:E8

a=setup:actpass

a=mid:video

a=extmap:2 urn:ietf:params:rtp-hdrext:toffset

a=extmap:3http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time

a=extmap:4 urn:3gpp:video-orientation

a=sendrecv

a=rtcp-mux

a=rtpmap:100 VP8/90000

a=rtcp-fb:100 ccm fir

a=rtcp-fb:100 nack

a=rtcp-fb:100 nack pli

a=rtcp-fb:100 goog-remb

a=rtpmap:101 VP9/90000

a=rtcp-fb:101 ccm fir

a=rtcp-fb:101 nack

a=rtcp-fb:101 nack pli

a=rtcp-fb:101 goog-remb

a=rtpmap:116 red/90000

a=rtpmap:117 ulpfec/90000

a=rtpmap:96 rtx/90000

a=fmtp:96 apt=100

a=ssrc-group:FID 3011579612 365513713

a=ssrc:3011579612 cname:BeTH+Ahwn2YbXhAJ

a=ssrc:3011579612 msid:ARDAMS ARDAMSv0

a=ssrc:3011579612 mslabel:ARDAMS

a=ssrc:3011579612 label:ARDAMSv0

a=ssrc:365513713 cname:BeTH+Ahwn2YbXhAJ

a=ssrc:365513713 msid:ARDAMS ARDAMSv0

a=ssrc:365513713 mslabel:ARDAMS

a=ssrc:365513713 label:ARDAMSv0

request:request.HTTPMethod = POST: url =https://域名/message/45677/60574066

A. request.HTTPBody =sdp;

block函数为nil,没有设置返回值

B.request.HTTPBody =icecandidate;

其中icecandidate 从[peerConnection  gotICECandidate]获取到的。

log :{

"label" : 0,

"id" : "audio",

"candidate" : "candidate:3672176605 1 udp 2122260223 192.168.153.194 55122 typ host generation 0",

"type" : "candidate"

}

{"label" : 1,

"id" : "video",

"candidate" : "candidate:3005921308 1 udp 1686052607 1.85.223.111 10107 typ srflx raddr 192.168.153.194 rport 65478 generation 0",

"type" : "candidate"

}

response:

{ URL:https://域名/message/46789/02181168} { status code: 200, headers {

"Cache-Control" = "no-cache";

Connection = "keep-alive";

"Content-Length" = 21;

"Content-Type" = "text/html; charset=utf-8";

Date = "Fri, 16 Jun 2017 10:50:36 GMT";

Server = "nginx/1.5.9";

} }

data:result :SUCCESS

房间服务器收到 /message/消息后将request.HTTPBody的信息sdp,icecandidate发送给信令服务器。

8.挂断

request :POST:url =https://域名/leave/123456/09876543

response:{ URL:https://域名/leave/123456/09876543}{ status code: 200, headers {

"Cache-Control" = "no-cache";

Connection = "keep-alive";

"Content-Type" = "text/html; charset=utf-8";

Date = "Fri, 16 Jun 2017 09:38:42 GMT";

Server = "nginx/1.5.9";

} }

data :0 bytes

outPutStream:outPutBuffer:

message = {

"cmd" : "send",

"msg":"{type:"bye"}"

}

websocket:

request :DELETE:url =https://域名:4432/123456/09876543

request.HTTPMethod:"Delete"

request.HTTPBody:nil

response:{ URL:https://域名:4432/123456/09876543}{ status code: 200, headers {

"Acess-Control-Allow-Methods" = "POST,DELETE";

"Acess-Control-Allow-Origin"="*"

"Content-Length" = 3;

Connection = "keep-alive";

"Content-Type" = "text/html; charset=utf-8";

Date = "Fri, 16 Jun 2017 09:38:42 GMT";

Server = "nginx/1.5.9";

} }

data :OK

加入到同一个房间

房间的最大人数是在房间服务器room.go中设定,默认为2个人。client A 注册房间号,向websocket发送

message = {

"cmd" : "register",

"roomid" : "123456",

"clientid" : "09876543"

}

信息,clientID 是随机生成的,当client A和client B进入同一个房间时,websocket打开client A 和client B的ReadWriteClose接口,会相互发送对方的msg

获取到对方的sdp,answer和icecandidate

inputStream:readBuffer

{"type":"answer","sdp":"v=0\r\no=- 2842181041571733368 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE audio video\r\na=msid-semantic: WMS ARDAMS\r\nm=audio 9 UDP\/TLS\/RTP\/SAVPF 111 103 104 9 102 0 8 106 105 13 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:5EBa\r\na=ice-pwd:+BOWo0ZqtrGNvmtWWCtHX0QC\r\na=ice-options:renomination\r\na=fingerprint:sha-256 E5:06:2E:37:E8:13:0C:45:B3:AC:28:92:71:5B:60:32:6D:E8:B7:D5:E2:96:B0:E5:17:B6:92:33:6A:1C:DF:8E\r\na=setup:active\r\na=mid:audio\r\na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=sendrecv\r\na=rtcp-mux\r\na=rtpmap:111 opus\/48000\/2\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:103 ISAC\/16000\r\na=rtpmap:104 ISAC\/32000\r\na=rtpmap:9 G722\/8000\r\na=rtpmap:102 ILBC\/8000\r\na=rtpmap:0 PCMU\/8000\r\na=rtpmap:8 PCMA\/8000\r\na=rtpmap:106 CN\/32000\r\na=rtpmap:105 CN\/16000\r\na=rtpmap:13 CN\/8000\r\na=rtpmap:126 telephone-event\/8000\r\na=ssrc:1892460007 cname:DBqx+KdFlQmMiVm6\r\na=ssrc:1892460007 msid:ARDAMS ARDAMSa0\r\na=ssrc:1892460007 mslabel:ARDAMS\r\na=ssrc:1892460007 label:ARDAMSa0\r\nm=video 9 UDP\/TLS\/RTP\/SAVPF 100 101 116 117 96\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:5EBa\r\na=ice-pwd:+BOWo0ZqtrGNvmtWWCtHX0QC\r\na=ice-options:renomination\r\na=fingerprint:sha-256 E5:06:2E:37:E8:13:0C:45:B3:AC:28:92:71:5B:60:32:6D:E8:B7:D5:E2:96:B0:E5:17:B6:92:33:6A:1C:DF:8E\r\na=setup:active\r\na=mid:video\r\na=extmap:2 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:3 http:\/\/www.webrtc.org\/experiments\/rtp-hdrext\/abs-send-time\r\na=extmap:4 urn:3gpp:video-orientation\r\na=sendrecv\r\na=rtcp-mux\r\na=rtpmap:100 VP8\/90000\r\na=rtcp-fb:100 ccm fir\r\na=rtcp-fb:100 nack\r\na=rtcp-fb:100 nack pli\r\na=rtcp-fb:100 goog-remb\r\na=rtpmap:101 VP9\/90000\r\na=rtcp-fb:101 ccm fir\r\na=rtcp-fb:101 nack\r\na=rtcp-fb:101 nack pli\r\na=rtcp-fb:101 goog-remb\r\na=rtpmap:116 red\/90000\r\na=rtpmap:117 ulpfec\/90000\r\na=rtpmap:96 rtx\/90000\r\na=fmtp:96 apt=100\r\na=ssrc-group:FID 3263650902 1527749129\r\na=ssrc:3263650902 cname:DBqx+KdFlQmMiVm6\r\na=ssrc:3263650902 msid:ARDAMS ARDAMSv0\r\na=ssrc:3263650902 mslabel:ARDAMS\r\na=ssrc:3263650902 label:ARDAMSv0\r\na=ssrc:1527749129 cname:DBqx+KdFlQmMiVm6\r\na=ssrc:1527749129 msid:ARDAMS ARDAMSv0\r\na=ssrc:1527749129 mslabel:ARDAMS\r\na=ssrc:1527749129 label:ARDAMSv0\r\n"}

{"type":"candidate","label":0,"id":"audio","candidate":"candidate:1300829926

1 udp 2122260223 192.168.153.186 36349 typ host generation 0 ufrag Xe0D

network-id 3 network-cost 10"}

二、Web网页版

1.获取网页界面信息

GEThttps://域名/[HTTP/1.1 200 OK 32ms]

response:网页界面信息html

GEThttps://域名/css/main.css[HTTP/1.1 304 Not Modified 23ms]

main.css中的内容如网页的长宽、颜色等

GEThttps://域名/callstats/callstats.min.js[HTTP/1.1 304 Not Modified 44ms]

GEThttps://域名/callstats/sha.js[HTTP/1.1 304 Not Modified 65ms]

sha.js:加密信息

GEThttps://域名/callstats/socket.io.js[HTTP/1.1 304 Not Modified 65ms]

socket.io.js:websocket protocol

GEThttps://域名/js/apprtc.debug.js[HTTP/1.1 304 Not Modified 70ms]

GEThttps://www.google-analytics.com/analytics.js[HTTP/2.0 304 Not Modified 62ms]

GEThttps://www.google-analytics.com/r/collect[HTTP/2.0 200 OK 73ms]

2.输入房间号,点击join按钮,加入房间

POST XHRhttps://域名/join/040075152[HTTP/1.1 200 OK 35ms]

3.连接websocket协议

GEThttps://域名:4432/ws[HTTP/1.1 101 Switching Protocols 49ms]

4.给服务器发送sdp和icecandidate信息,房间服务器转将信息转发给信令服务器

POST XHRhttps://域名/message/040075152/13888651[HTTP/1.1 200 OK 44ms]

POST XHRhttps://域名/message/040075152/13888651[HTTP/1.1 200 OK 36ms]

POST XHRhttps://域名/message/040075152/13888651[HTTP/1.1 200 OK 46ms]

POST XHRhttps://域名/message/040075152/13888651[HTTP/1.1 200 OK 51ms]

POST XHRhttps://域名/message/040075152/13888651[HTTP/1.1 200 OK 42ms]

POST XHRhttps://域名/message/040075152/13888651[HTTP/1.1 200 OK 29ms]

POST XHRhttps://域名/message/040075152/13888651[HTTP/1.1 200 OK 30ms]

POST XHRhttps://域名/message/040075152/13888651[HTTP/1.1 200 OK 31ms]

POST XHRhttps://域名/message/040075152/13888651[HTTP/1.1 200 OK 32ms]

response:result SUCCESS

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • RTSP SDP RTP/RTCP 介绍应用层 RTSP、SDP; 传输层 RTP、TCP、UDP; 网络层 IP...
    Atom_Woo阅读 3,787评论 0 7
  • 昨晚的课程阿秋放出了这样一个彩蛋~伍迪·艾伦的一句话“人不必完美”,让我对这个戴着一副镜框,一脸苦相,神经兮兮又絮...
    Miss伊柚阅读 245评论 0 1
  • 高楼斜睨地,向欲睡的湖中投下 几窗户的光 然,我却分明在这墨迹的湖里 看见了一条,暴露在阳光下 波光粼粼的,像银箔...
    二猫二毛阅读 324评论 3 0
  • 传说人死后会经过一座桥,名曰奈何桥 桥上有位慈眉善目的老太太,名曰孟婆 孟婆会给每位经过桥上的人一碗汤,名曰孟婆汤...
    胡利梅阅读 640评论 0 4
  • 开放思维 19.?开放思维 互联网精神的本质就是:开放、开放、再开放。 从这个意义上讲,它和亚马逊的“网上超市”模...
    Tywin_Zhang阅读 295评论 0 0