server 端
from socket import *
import select
import time
s = socket()
s.bind(('127.0.0.1',8001))
s.listen()
data_dict= {}
r_list=[s]
w_list=
while 1:
readables,writables,_= select.select(r_list,w_list,)
for i in readables:
print(i)
if i == s:
c,addr = i.accept()
else:
try:
data = i.recv(1024)
if not data:
i.close()
r_list.remove(i)
continue
data_dict[i]=data
except:
print('強行下線')
i.close()
r_list.remove(i)
for i in writables:
try:
i.send(data_dict[i].upper())
except:
i.close()
finally:
data_dict.pop(i)
w_list.remove(i)
client 端
import socket
c = socket.socket()
c.connect(("127.0.0.1", 9999))
print("connect....")
while true:
msg = input(">>>:").strip()
if not msg:continue
c.send(msg.encode("utf-8"))
data = c.recv(1024)
print(data.decode("utf-8"))
**
server端
import socket
from threading import thread
s = socket.socket()
s.bind(("127.0.0.1",9999))
s.listen()
def talking(c):
while true:
try:
data = c.recv(1024)
print("recv.....")
if not data:
c.close()
break
# send是乙個本地io操作 速度非常快
c.send(data.upper())
except connectionreseterror:
c.close()
break
while true:
c,addr = s.accept()
print("accept.....")
t = thread(target=talking,args=(c,))
t.start()
client端
import socket
import os
c = socket.socket()
c.connect(("127.0.0.1", 9999))
print("connect....")
while true:
msg = "%s 發來問候 hello" % os.getpid()
if not msg:continue
c.send(msg.encode("utf-8"))
data = c.recv(1024)
print(data.decode("utf-8"))
server端
"""
非阻塞io 即遇到io操作也不導致程式阻塞,會繼續執行
意味著即使遇到io操作cpu執行權也不會被剝奪
程式效率就變高了
以下程式 占用cpu太高
原因是 需要無限的迴圈 去向作業系統拿資料
"""import socket
import time
s = socket.socket()
s.bind(("127.0.0.1",9999))
s.listen()
# 設定socket 是否阻塞 預設為true
s.setblocking(false)
# 所有的客戶端socket
cs =
# 所有需要返回資料的客戶端
send_cs =
while true:
# time.sleep(0.2)
try:
c,addr = s.accept() # 三次握手
print("run accept")
except blockingioerror:
# 沒有資料準備 可以作別的事情
# print("收資料")
for c in cs[:]:
try:
data = c.recv(1024)
if not data:
c.close()
cs.remove(c)
print(data.decode("utf-8"))
# 把資料和連線放進去
#c.send(data.upper()) # io
# send也是io操作 在一些極端情況下 例如系統快取滿了 放不進去 那肯定丟擲
# 非阻塞異常 這時候必須把傳送資料 單獨拿出來處理 因為recv和send都有可能丟擲相同異常
# 就無法判斷如何處理
except blockingioerror:
continue
except connectionreseterror:
c.close()
# 從所有客戶端列表中刪除這個連線
cs.remove(c)
# print("發資料")
for item in send_cs[:]:
c,data = item
try:
c.send(data.upper())
# 如果傳送成功就把資料從列表中刪除
send_cs.remove(item)
except blockingioerror: # 如果緩衝區慢了 那就下次再發
continue
except connectionreseterror:
c.close() # 關閉連線
send_cs.remove(item) # 刪除資料
# 從所有客戶端中刪除這個已經斷開的連線
cs.remove(c)
client 端
import socket
c = socket.socket()
c.connect(("127.0.0.1", 9999))
print("connect....")
while true:
msg = input(">>>:").strip()
if not msg:continue
c.send(msg.encode("utf-8"))
data = c.recv(1024)
print(data.decode("utf-8"))
I O模型 I O模型
輸入 輸出 i o 是在主存和外部裝置 例如磁碟驅動器 終端和網路 之間複製資料的過程。輸入操作是從 i o 裝置複製資料到主存,輸出資料是從主存複製資料到 i o 裝置。描述的是使用者執行緒與核心的互動方式 描述的是使用者執行緒呼叫核心 i o 操作的方式 乙個 i o 操作其實分成了兩個步驟 發...
OSI模型以及各類協議
osi 網路層次結構模型 物理層 網絡卡,網線等物理裝置 資料鏈路層 資料封裝,交換機 網路層 ip位址,路由器 傳輸層 tcp,udp,定義傳輸資料的協議埠號 會話層 本地與遠端主機進行會話 表示層 資料的表示,安全,壓縮 應用層 http ftp tftp smtp snmp dns 各類協議 ...
I O復用和I O模型
由 unix網路程式設計卷1 總結而來。同時監視多個i o條件,在其中任意乙個就緒時通知程序,這樣的能力稱為i o復用。由select和poll函式支援,較新的還有posix中的pselect函式。linux中還有epoll i o復用應用場合 1 客戶同時處理多個描述符時,必須使用i o復用。2 ...