網路程式設計雜項高階

2022-08-19 17:30:11 字數 1419 閱讀 9446

tcp聊天,

#server端實現:

import socket

sk=socket.socket() # 例項化socket物件

address=("0.0.0.0",8000) #設定埠

sk.bind(address) # 繫結ip位址和埠

sk.listen(5) #監聽

while true:

conn,addr=sk.accept()#conn接受資料,addr獲取客戶端ip位址

while true: # 這個迴圈來實現相互之間聊天的邏輯

try: #win被中斷連線就會異常 linux不會

data=conn.recv(1024) #定義1024位元組接受資料,這裡的資料只能是bytes型別的資料,否則報錯;

if data: # 假如客戶端傳遞資料過來時

print("-->",str(data,"utf-8")) # 列印客戶端傳遞過來的資料,需要從bytes型別資料解碼成unicode型別的資料

data=bytes(input(">>>"),"utf-8") # 接收輸入的資料並轉換成bytes型別的資料

conn.send(data) # 將bytes型別的資料傳送給客戶端

else: # 否則客戶端連線的物件,當客戶端正常退出,執行了sk.close()時將不會傳送資料到服務端

conn.close() # 這時關閉這個conn物件並退出當前迴圈等待下乙個客戶端物件來連線

break

except connectionreseterror as e: # 捕獲到異常之後,列印異常出來並退出迴圈等待下乙個客戶端連線

print(e)

break

#client端實現

import socket # 匯入socket模組

sk=socket.socket() # 例項化客戶端物件

address=("127.0.0.1",8000) # 設定客戶端需要連線的服務端ip位址以及埠

sk.connect(address) # 連線服務端的ip位址以及埠

while true: # 迴圈實現對話

data=input(">>>").strip() # 獲取使用者輸入的資料

if data=="exit": # 如果輸入的是exit 關閉該物件並退出程式

sk.close() # 關閉物件

break # 退出迴圈

sk.send(bytes(data,"utf-8")) # 傳送剛輸入的資料,要先轉換成bytes型別的資料

data=str(sk.recv(1024),"utf-8") # 接收服務端傳送的資料,並將其轉換成unicode資料型別

print("-->",data) # 列印服務端傳輸過來的資料

Linux網路程式設計雜項

requests not to send sigpipe on errors on stream oriented sockets when the other end breaks the connection.the epipe error is still returned.當連線斷開,如果a...

網路程式設計雜項 (持續更新)

by fireworks2 foxmail.com 記錄一些小問題,陷阱 1.呼叫bind時,如果位址是0 就是inaddr any那個巨集 就繫結本地所有ip,如果埠是0,就隨機選擇乙個可用的埠 想要知道具體埠,可以呼叫getsockname檢視 2.send recv 與 read write ...

高階程式設計之網路程式設計(三)

io 模型 1 阻塞模型 fifo pipe read fgetc fgets fread recv recvfrom 以上獲取資料的函式預設都是阻塞方式接收資料。2 非阻塞模型 2.1 在開始階段的open函式部分調整 open fifo o rdonly o nonblock 函式 open r...