使用四種框架分別實現1百萬websocket常連線的伺服器
轉自http://www.open-open.com/lib/view/open1435905714122.html
著名的 C10K 問題提出的時候, 正是 2001 年。這篇文章可以說是高效能伺服器開發的一個標誌性文件,它討論的就是單機為1萬個連線提供服務這個問題,當時因為硬體和軟體的限制,單機1萬還是
一個非常值得挑戰的目標。但是時光荏苒,隨著硬體和軟體的飛速發展,單機1萬的目標已經變成了最簡單不過的事情。現在用任何一種主流語言都能提供單機1萬的併發處理的能力。所以現在目標早已提高了100倍,變成C1000k,也就是一臺伺服器為100萬連線提供服務。在2010年,2011年已經看到一些實現C1000K的文章了,所以在2015年,實現C1000K應該不是一件困難的事情。
本文是我在實踐過程中的記錄,我的目標是使用spran-websocket,netty, undertow和node.js四種框架分別實現C1000K的伺服器,看看這幾個框架實現的難以程度,效能如何。開發語言為Scala和Javascript。
當然,談起效能,我們還必須談到每秒每個連線有多少個請求,也就是RPS數,還要考慮每條訊息的大小。
一般來說,我們會選取一個百分比,比如每秒20%的連線會收發訊息。我的需求是伺服器只是push,客戶端不會主動傳送訊息。 一般每一分鐘會為這一百萬群發一條訊息。
所以實現的測試工具每個client建立60000個websocket連線,一共二十個client。實際不可能使用20臺機器,我使用了兩臺AWS C3.2xlarge(8核16G)伺服器作為客戶端機。每臺機器10個客戶端。
伺服器每1分鐘群發一條訊息。訊息內容很簡單,只是伺服器的當天時間。
最近看到360用Go實現的訊息推送系統,下面是他們的資料:
目前360訊息推送系統服務於50+內部產品,萬款開發平臺App,實時長連線數億量級,日獨數十億量級,1分鐘內可以實現億量級廣播,日下發峰值百億量級,400臺物理機,3000多個例項分佈在9個獨立叢集中,每個叢集跨國內外近10個IDC。
四個伺服器的程式碼和Client測試工具程式碼可以在github上下載。 (其實不止四種框架了,現在包括Netty, Undertow, Jetty, Spray-websocket, Vert.x 和 Node.js 六種框架的實現)
測試下來可以看到每種伺服器都能輕鬆達到同時120萬的websocket活動連線,只是資源佔用和事務處理時間有差別。120萬隻是保守資料,在這麼多連線情況下伺服器依然很輕鬆,下一步我會進行C2000K的測試。
在測試之前我們需要對伺服器/客戶機的一些引數進行調優。
伺服器的引數調優
一般會修改兩個檔案,/etc/sysctl.conf和/etc/security/limits.conf, 用來配置TCP/IP引數和最大檔案描述符。
TCP/IP引數配置
修改檔案/etc/sysctl.conf,配置網路引數。
net.ipv4.tcp_wmem = 4096 87380 4161536
net.ipv4.tcp_rmem = 4096 87380 4161536
net.ipv4.tcp_mem = 786432 2097152 3145728
數值根據需求進行調整。更多的引數可以看以前整理的一篇文章: Linux TCP/IP 協議棧調優 。
執行/sbin/sysctl -p即時生效。
最大檔案描述符
Linux核心本身有檔案描述符最大值的限制,你可以根據需要更改:
系統最大開啟檔案描述符數:/proc/sys/fs/file-max
臨時性設定:echo 1000000 > /proc/sys/fs/file-max
永久設定:修改/etc/sysctl.conf檔案,增加fs.file-max = 1000000
程序最大開啟檔案描述符數
使用ulimit -n檢視當前設定。使用ulimit -n 1000000進行臨時性設定。
要想永久生效,你可以修改/etc/security/limits.conf檔案,增加下面的行:
* hard nofile 1000000
* soft nofile 1000000
root hard nofile 1000000
root soft nofile 1000000
還有一點要注意的就是hard limit不能大於/proc/sys/fs/nr_open,因此有時你也需要修改nr_open的值。
執行echo 2000000 > /proc/sys/fs/nr_open
檢視當前系統使用的開啟檔案描述符數,可以使用下面的命令:
[
1632 0 1513506
其中第一個數表示當前系統已分配使用的開啟檔案描述符數,第二個數為分配後已釋放的(目前已不再使用),第三個數等於file-max。
總結一下:
所有程序開啟的檔案描述符數不能超過/proc/sys/fs/file-max
單個程序開啟的檔案描述符數不能超過user limit中nofile的soft limit
nofile的soft limit不能超過其hard limit
nofile的hard limit不能超過/proc/sys/fs/nr_open
應用執行時調優
Java 應用記憶體調優
伺服器使用12G記憶體,吞吐率優先的垃圾回收器:
JAVA_OPTS="-Xms12G -Xmx12G -Xss1M -XX:+UseParallelGC"
V8引擎
node --nouse-idle-notification --expose-gc --max-new-space-size=1024 --max-new-space-size=2048 --max-old-space-size=8192 ./webserver.js
OutOfMemory Killer
如果伺服器本身記憶體不大,比如8G,在不到100萬連線的情況下,你的伺服器程序有可能出現"Killed"的問題。 執行dmesg可以看到
Out of memory: Kill process 10375 (java) score 59 or sacrifice child
這是Linux的OOM Killer主動殺死的。 開啟oom-killer的話,在/proc/pid下對每個程序都會多出3個與oom打分調節相關的檔案。臨時對某個程序可以忽略oom-killer可以使用下面的方式:
echo -17 > /proc/$(pidof java)/oom_adj
解決辦法有多種,可以參看文章最後的參考文章,最好是換一個記憶體更大的機器。
客戶端的引數調優
在一臺系統上,連線到一個遠端服務時的本地埠是有限的。根據TCP/IP協議,由於埠是16位整數,也就只能是0到 65535,而0到1023是預留埠,所以能分配的埠只是1024到65534,也就是64511個。也就是說,一臺機器一個IP只能建立六萬多個長連線。
要想達到更多的客戶端連線,可以用更多的機器或者網絡卡,也可以使用虛擬IP來實現,比如下面的命令增加了19個IP地址,其中一個給伺服器用,其它18個給client,這樣
可以產生18 * 60000 = 1080000個連線。
ifconfig eth0:0 192.168.77.10 netmask 255.255.255.0 up
ifconfig eth0:1 192.168.77.11 netmask 255.255.255.0 up
ifconfig eth0:2 192.168.77.12 netmask 255.255.255.0 up
ifconfig eth0:3 192.168.77.13 netmask 255.255.255.0 up
ifconfig eth0:4 192.168.77.14 netmask 255.255.255.0 up
ifconfig eth0:5 192.168.77.15 netmask 255.255.255.0 up
ifconfig eth0:6 192.168.77.16 netmask 255.255.255.0 up
ifconfig eth0:7 192.168.77.17 netmask 255.255.255.0 up
ifconfig eth0:8 192.168.77.18 netmask 255.255.255.0 up
ifconfig eth0:9 192.168.77.19 netmask 255.255.255.0 up
ifconfig eth0:10 192.168.77.20 netmask 255.255.255.0 up
ifconfig eth0:11 192.168.77.21 netmask 255.255.255.0 up
ifconfig eth0:12 192.168.77.22 netmask 255.255.255.0 up
ifconfig eth0:13 192.168.77.23 netmask 255.255.255.0 up
ifconfig eth0:14 192.168.77.24 netmask 255.255.255.0 up
ifconfig eth0:15 192.168.77.25 netmask 255.255.255.0 up
ifconfig eth0:16 192.168.77.26 netmask 255.255.255.0 up
ifconfig eth0:17 192.168.77.27 netmask 255.255.255.0 up
ifconfig eth0:18 192.168.77.28 netmask 255.255.255.0 up
修改/etc/sysctl.conf檔案:
net.ipv4.ip_local_port_range = 1024 65535
執行/sbin/sysctl -p即時生效。
伺服器測試
實際測試中我使用一臺AWS C3.4xlarge (16 cores, 32G memory)作為應用伺服器,兩臺AWS C3.2xlarge (8 cores, 16G memory)伺服器作為客戶端。
這兩臺機器作為測試客戶端綽綽有餘,每臺客戶端機器建立了十個內網虛擬IP, 每個IP建立60000個websocket連線。
客戶端配置如下:
/etc/sysctl.conf配置
fs.file-max = 2000000
fs.nr_open = 2000000
net.ipv4.ip_local_port_range = 1024 65535
/etc/security/limits.conf配置
* soft nofile 2000000
* hard nofile 2000000
* soft nproc 2000000
* hard nproc 2000000
服務端配置如下:
/etc/sysctl.conf配置
fs.file-max = 2000000
fs.nr_open = 2000000
net.ipv4.ip_local_port_range = 1024 65535
Netty伺服器
建立120萬個連線,不傳送訊息,輕輕鬆鬆達到。記憶體還剩14G未用。
[roocolobu ~]# ss -s; free -m
Total: 1200231 (kernel 1200245)
TCP: 1200006 (estab 1200002, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 4
Transport Total IP IPv6
* 1200245 - -
RAW 0 0 0
UDP 1 1 0
TCP 1200006 1200006 0
INET 1200007 1200007 0
FRAG 0 0 0
total used free shared buffers cached
Mem: 30074 15432 14641 0 9 254
-/+ buffers/cache: 15167 14906
Swap: 815 0 815
每分鐘給所有的120萬個websocket傳送一條訊息,訊息內容為當前的伺服器的時間。這裡傳送顯示是單執行緒傳送,伺服器傳送完120萬個總用時15秒左右。
02:15:43.307 [pool-1-thread-1] INFO com.colobu.webtest.netty.WebServer$ - send msg to channels for c4453a26-bca6-42b6-b29b-43653767f9fc
02:15:57.190 [pool-1-thread-1] INFO com.colobu.webtest.netty.WebServer$ - sent 1200000 channels for c4453a26-bca6-42b6-b29b-43653767f9fc
傳送時CPU使用率並不高,網路頻寬佔用基本在10M左右。
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
0 0 100 0 0 0| 0 0 | 60B 540B| 0 0 | 224 440
0 0 100 0 0 0| 0 0 | 60B 870B| 0 0 | 192 382
0 0 100 0 0 0| 0 0 | 59k 74k| 0 0 |2306 2166
2 7 87 0 0 4| 0 0 |4998k 6134k| 0 0 | 169k 140k
1 7 87 0 0 5| 0 0 |4996k 6132k| 0 0 | 174k 140k
1 7 87 0 0 5| 0 0 |4972k 6102k| 0 0 | 176k 140k
1 7 87 0 0 5| 0 0 |5095k 6253k| 0 0 | 178k 142k
2 7 87 0 0 5| 0 0 |5238k 6428k| 0 0 | 179k 144k
1 7 87 0 0 5| 0 24k|4611k 5660k| 0 0 | 166k 129k
1 7 87 0 0 5| 0 0 |5083k 6238k| 0 0 | 175k 142k
1 7 87 0 0 5| 0 0 |5277k 6477k| 0 0 | 179k 146k
1 7 87 0 0 5| 0 0 |5297k 6500k| 0 0 | 179k 146k
1 7 87 0 0 5| 0 0 |5383k 6607k| 0 0 | 180k 148k
1 7 87 0 0 5| 0 0 |5504k 6756k| 0 0 | 184k 152k
1 7 87 0 0 5| 0 48k|5584k 6854k| 0 0 | 183k 152k
1 7 87 0 0 5| 0 0 |5585k 6855k| 0 0 | 183k 153k
1 7 87 0 0 5| 0 0 |5589k 6859k| 0 0 | 184k 153k
1 5 91 0 0 3| 0 0 |4073k 4999k| 0 0 | 135k 110k
0 0 100 0 0 0| 0 32k| 60B 390B| 0 0 |4822 424
客戶端(一共20個,這裡選取其中一個檢視它的指標)。每個客戶端保持6萬個連線。每個訊息從伺服器傳送到客戶端接收到總用時平均633毫秒,而且標準差很小,每個連線用時差不多。
Active WebSockets for eb810c24-8565-43ea-bc27-9a0b2c910ca4
count = 60000
WebSocket Errors for eb810c24-8565-43ea-bc27-9a0b2c910ca4
count = 0
-- Histograms ------------------------------------------------------------------
Message latency for eb810c24-8565-43ea-bc27-9a0b2c910ca4
count = 693831
min = 627
max = 735
mean = 633.06
stddev = 9.61
median = 631.00
75% <= 633.00
95% <= 640.00
98% <= 651.00
99% <= 670.00
99.9% <= 735.00
-- Meters ----------------------------------------------------------------------
Message Rate for eb810c24-8565-43ea-bc27-9a0b2c910ca4
count = 693832
mean rate = 32991.37 events/minute
1-minute rate = 60309.26 events/minute
5-minute rate = 53523.45 events/minute
15-minute rate = 31926.26 events/minute
Spray伺服器
建立120萬個連線,不傳送訊息,輕輕鬆鬆達到。它的記憶體相對較高,記憶體還剩7G。
[
Total: 1200234 (kernel 1200251)
TCP: 1200006 (estab 1200002, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 4
Transport Total IP IPv6
* 1200251 - -
RAW 0 0 0
UDP 1 1 0
TCP 1200006 1200006 0
INET 1200007 1200007 0
FRAG 0 0 0
total used free shared buffers cached
Mem: 30074 22371 7703 0 10 259
-/+ buffers/cache: 22100 7973
Swap: 815 0 815
每分鐘給所有的120萬個websocket傳送一條訊息,訊息內容為當前的伺服器的時間。
CPU使用較高,傳送很快,頻寬可以達到46M。群發完一次大約需要8秒左右。
05/22 04:42:57.569 INFO [ool-2-worker-15] c.c.w.s.WebServer - send msg to workers 。for 8454e7d8-b8ca-4881-912b-6cdf3e6787bf
05/22 04:43:05.279 INFO [ool-2-worker-15] c.c.w.s.WebServer - sent msg to workers for 8454e7d8-b8ca-4881-912b-6cdf3e6787bf. current workers: 1200000
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
74 9 14 0 0 3| 0 24k|6330k 20M| 0 0 | 20k 1696
70 23 0 0 0 6| 0 64k| 11M 58M| 0 0 | 18k 2526
75 11 6 0 0 7| 0 0 |9362k 66M| 0 0 | 24k 11k
82 4 8 0 0 6| 0 0 | 11M 35M| 0 0 | 24k 10k
85 0 14 0 0 1| 0 0 |8334k 12M| 0 0 | 44k 415
84 0 15 0 0 1| 0 0 |9109k 16M| 0 0 | 36k 425
81 0 19 0 0 0| 0 24k| 919k 858k| 0 0 | 23k 629
76 0 23 0 0 0| 0 0 | 151k 185k| 0 0 | 18k 1075
客戶端(一共20個,這裡選取其中一個檢視它的指標)。每個客戶端保持6萬個連線。每個訊息從伺服器傳送到客戶端接收到總用時平均1412毫秒,而且標準差較大,每個連線用時差別較大。
Active WebSockets for 6674c9d8-24c6-4e77-9fc0-58afabe7436f
count = 60000
WebSocket Errors for 6674c9d8-24c6-4e77-9fc0-58afabe7436f
count = 0
-- Histograms ------------------------------------------------------------------
Message latency for 6674c9d8-24c6-4e77-9fc0-58afabe7436f
count = 454157
min = 716
max = 9297
mean = 1412.77
stddev = 1102.64
median = 991.00
75% <= 1449.00
95% <= 4136.00
98% <= 4951.00
99% <= 5308.00
99.9% <= 8854.00
-- Meters ----------------------------------------------------------------------
Message Rate for 6674c9d8-24c6-4e77-9fc0-58afabe7436f
count = 454244
mean rate = 18821.51 events/minute
1-minute rate = 67705.18 events/minute
5-minute rate = 49917.79 events/minute
15-minute rate = 24355.57 events/minute
Undertow
建立120萬個連線,不傳送訊息,輕輕鬆鬆達到。記憶體佔用較少,還剩餘11G記憶體。
[
Total: 1200234 (kernel 1200240)
TCP: 1200006 (estab 1200002, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 4
Transport Total IP IPv6
* 1200240 - -
RAW 0 0 0
UDP 1 1 0
TCP 1200006 1200006 0
INET 1200007 1200007 0
FRAG 0 0 0
total used free shared buffers cached
Mem: 30074 18497 11576 0 10 286
-/+ buffers/cache: 18200 11873
Swap: 815 0 815
每分鐘給所有的120萬個websocket傳送一條訊息,訊息內容為當前的伺服器的時間。
群發玩一次大約需要15秒。
03:19:31.154 [pool-1-thread-1] INFO c.colobu.webtest.undertow.WebServer$ - send msg to channels for d9b450da-2631-42bc-a802-44285f63a62d
03:19:46.755 [pool-1-thread-1] INFO c.colobu.webtest.undertow.WebServer$ - sent 1200000 channels for d9b450da-2631-42bc-a802-44285f63a62d
客戶端(一共20個,這裡選取其中一個檢視它的指標)。每個客戶端保持6萬個連線。每個訊息從伺服器傳送到客戶端接收到總用時平均672毫秒,而且標準差較小,每個連線用時差別不大。
Active WebSockets for b2e95e8d-b17a-4cfa-94d5-e70832034d4d
count = 60000
WebSocket Errors for b2e95e8d-b17a-4cfa-94d5-e70832034d4d
count = 0
-- Histograms ------------------------------------------------------------------
Message latency for b2e95e8d-b17a-4cfa-94d5-e70832034d4d
count = 460800
min = 667
max = 781
mean = 672.12
stddev = 5.90
median = 671.00
75% <= 672.00
95% <= 678.00
98% <= 684.00
99% <= 690.00
99.9% <= 776.00
-- Meters ----------------------------------------------------------------------
Message Rate for b2e95e8d-b17a-4cfa-94d5-e70832034d4d
count = 460813
mean rate = 27065.85 events/minute
1-minute rate = 69271.67 events/minute
5-minute rate = 48641.78 events/minute
15-minute rate = 24128.67 events/minute
Setup Rate for b2e95e8d-b17a-4cfa-94d5-e70832034d4d
node.js
node.js不是我要考慮的框架,列在這裡只是作為參考。效能也不錯。
Active WebSockets for 537c7f0d-e58b-4996-b29e-098fe2682dcf
count = 60000
WebSocket Errors for 537c7f0d-e58b-4996-b29e-098fe2682dcf
count = 0
-- Histograms ------------------------------------------------------------------
Message latency for 537c7f0d-e58b-4996-b29e-098fe2682dcf
count = 180000
min = 808
max = 847
mean = 812.10
stddev = 1.95
median = 812.00
75% <= 812.00
95% <= 813.00
98% <= 814.00
99% <= 815.00
99.9% <= 847.00
-- Meters ----------------------------------------------------------------------
Message Rate for 537c7f0d-e58b-4996-b29e-098fe2682dcf
count = 180000
mean rate = 7191.98 events/minute
1-minute rate = 10372.33 events/minute
5-minute rate = 16425.78 events/minute
15-minute rate = 9080.53 events/minute
相關推薦
使用四種框架分別實現1百萬websocket常連線的伺服器
轉自http://www.open-open.com/lib/view/open1435905714122.html 著名的 C10K 問題提出的時候, 正是 2001 年。這篇文章可以說是高效能伺服器開發的一個標誌性文件,它討論的就是單機為1萬個連線提供服務這個問題,當時
四種框架分別實現百萬 websocket 常連線的伺服器
著名的 C10K 問題提出的時候, 正是 2001 年。這篇文章可以說是高效能伺服器開發的一個標誌性文件,它討論的就是單機為1萬個連線提供服務這個問題,當時因為硬體和軟體的限制,單機1萬還是一個非常值得挑戰的目標。但是時光荏苒,隨著硬體和軟體的飛速發展,單機1萬的目標已經變成了最簡單不過的事情。 現在用任
C || 圖的四種儲存結構實現
1. 陣列表示法: #include <stdio.h> #include <limits.h> #define INFINITY INT_MAX #define Maxvex 100 typedef struct graph {
從壹開始前後端分離 [.netCore 填坑 ] 三十二║ 四種方法快速實現專案的半自動化搭建
更新 1、更新小夥伴 @ 提出好點子:試試VS的外掛擴充套件:VSIX、ItemProject等,將T4模板給製作外掛,這裡先記下,有懂的小夥伴可以自己先試試,我會在以後更新。 2、感謝小夥伴 @的測試和指正,本文 T4 模板已經支援 Oracle 緣起 哈嘍大家週二好呀,這個國慶過的真
Redis的四種工作模式實現
節點配置 rep refused 多實例 sel 參數 move 高可用 ins Redis: Redis是一款優秀的結構數據存儲系統,由於出色的並發性能廣為關註,可用作:數據庫、緩存、消息隊列;同類型的還有memcached,但是由於memcache支持的結構類型較少,並
項目一:第十二天 1、常見權限控制方式 2、基於shiro提供url攔截方式驗證權限 3、在realm中授權 5、總結驗證權限方式(四種) 6、用戶註銷7、基於treegrid實現菜單展示
eal 重復數 規則 認證通過 delete get 數據庫 filter 登陸 1 課程計劃 1、 常見權限控制方式 2、 基於shiro提供url攔截方式驗證權限 3、 在realm中授權 4、 基於shiro提供註解方式驗證權限 5、 總結驗證權限方式(四種) 6、
晚上,有四個人過河,分別需要1、2、5、10分鐘。只有一把手電筒,過河的必要條件是有手電筒。最多可以兩個人同時過河,但必須以兩人中較慢的那個人的速度過去。問:所有人都過河,至少需幾分鐘。用java實現
找實習工作遇到的筆試題: 解題思路:用兩個集合分別代表河的兩岸(list2表示對岸),利用雙重for迴圈模擬A,B,C,D分別組合過河,如:A,B先過河,則,將A,B都新增到list2集合中去。如果A的時間大於B,則B再次過河送手電筒,再一次將B新增到集合中去。反之同理。 總之,時間短的過河
四、利用SeimiCrawler爬蟲框架和selenium自動化測試工具分別實現對網站的爬取
一、案例背景 這裡為了簡化操作,我們以爬取 http://www.fzdm.com/ 網頁的熱門漫畫為例。 二、對比 SeimiCrawler爬蟲框架 爬取速度較快,但是不穩定(表現線上程一多,易崩潰);selenium自動化測試工具 爬取速度略慢,但是穩定。 三、方式一:S
框架-SPI四種模式+通用裝置驅動實現
[toc] --- ### 前言 * **SPI 介紹**為蒐集百度資料+個人理解 * 其餘為原創(有誤請指正) * 集四種模式於一身 ### 筆錄草稿 ### SPI介紹 * SPI 協議簡介 * SPI 協議是由摩托羅拉公司提出的通訊協議(Serial Peripheral Interf
5.6-全棧Java筆記:內部類的四種實現方式
java一般情況,我們把類定義成獨立的單元。有些情況下,我們把一個類放在另一個類的內部定義,稱為內部類(innerclasses)。內部類的作用1.內部類提供了更好的封裝。只能讓外部類直接訪問,不允許同一個包中的其他類直接訪問。2.內部類可以直接訪問外部類的私有屬性,內部類被當成其外部類的成員。 但外部類不能
Android中Button四種點擊事件實現方式
方法 instance break findview gin ins case tac 匿名內部類 1.Xml添加監聽屬性,這裏添加的doClick。 1 <Button 2 android:id="@+id/bt1" 3 andro
列表整體加1四種方法
append map 整體 num enume for in rate int pen 1、 list = [0,1,2,3,4,5,6,7,8,9] num = map(lambda x:x+1,list)print num 2、list1=[]for i in lis
實現多線程的四種方式
註意 ger interrupt exception future pool port pre repl Java多線程實現方式主要有四種:繼承Thread類、實現Runnable接口、實現Callable接口通過FutureTask包裝器來創建Thread線程、使用Exe
JavaScript中的單體模式四種實現方式
ret div 劃分 scrip diff different 不同的 如果 get 1 /* 2 1 簡單單體 3 */ 4 var Singleton = { 5 attr1: 1 , 6 method1:funct
1.4socket服務器打印信息的四種不同方式()
span 綁定 col tip ner 1.4 一次 +++ soc 方式一 socker 服務器 # -*- coding: utf-8 -*- import sys,os,multiprocessing from socket import * serverHost
java在線聊天項目1.2版 ——開啟多個客戶端,分別實現數據庫註冊和登錄功能後,成功登陸則登錄框消失,好友列表窗出現
false als blog string def iat ets cat med 登錄框消失語句 dispose(); 好友列表窗出現 使用new FriendsFrame(phone,s); 登陸對話框代碼修改如下: package com.swift.frame;
java 四種方式實現字符流文件的拷貝對比
put In exception bytes public 字節緩沖區 tput code cep 將D:\\應用軟件\\vm.exe 拷貝到C:\\vm.exe 四種方法耗費時間對比 4>2>3>1 package Copy; imp
js 數組的深度拷貝 的四種實現方法
實現 個人總結 對象 () tro logs json 錯誤 深度拷貝 首先聲明本人資質尚淺,本文只用於個人總結。如有錯誤,歡迎指正、共同提高。 --------------------------------------------------------------
KVM虛擬化的四種簡單網絡模型介紹及實現(一)
_for only 應該 code eth tun x86_64 信息 dock KVM中的四種簡單網絡模型,分別如下:1、隔離模型:虛擬機之間組建網絡,該模式無法與宿主機通信,無法與其他網絡通信,相當於虛擬機只是連接到一臺交換機上。2、路由模型:相當於虛擬機連接到一臺路由
KVM虛擬化的四種簡單網絡模型介紹及實現(二)
str drive 51cto -c water -a return dfa 模型 接上篇,介紹NAT網絡模型和橋接模型。 三、NAT模型 NAT模型其實就是SNAT的實現,路由中虛擬機能將報文發送給外部主機,但是外部主機因找不到通往虛擬機的路由因而無法回應請求。但是外部