各類IO模型

2021-09-12 11:48:31 字數 3891 閱讀 3615

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 ...