31 socket客户端. 服务器 异常 语法
生活随笔
收集整理的這篇文章主要介紹了
31 socket客户端. 服务器 异常 语法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Socket是應用層與TCP/IP協議族通信的中間軟件抽象層,它是一組接口。
基于文件類型的套接字家族
套接字家族的名字:AF_UNIX
unix一切皆文件,基于文件的套接字調用的就是底層的文件系統來取數據,兩個套接字進程運行在同一機器,可以通過訪問同一個文件系統間接完成通信
基于網絡類型的套接字家族
套接字家族的名字:AF_INET
服務器端先初始化Socket,然后與端口綁定(bind),對端口進行監聽(listen),調用accept阻塞,等待客戶端連接。在這時如果有個客戶端初始化一個Socket,然后連接服務器(connect),如果連接成功,這時客戶端與服務器端的連接就建立了。客戶端發送數據請求,服務器端接收請求并處理請求,然后把回應數據發送給客戶端,客戶端讀取數據,最后關閉連接,一次交互結束
?
socket()模塊函數用法
import socket# socket實例類
serve=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
serve.bind(('127.0.0.1',12))
# serve.bind('127.0.0.1',端口)
# 127.0.0.1這叫回送地址 表示電腦本身
# 端口 為普通整數
# 參數為一個元組
serve.listen()
# 監聽
# 接收鏈接請求
# 第一個是表示客戶端的socket 第二個客戶端的地址信息
client,addr=serve.accept()
serve.recv(10)
# 接收數據 單位為字節
serve.close()
# 關閉數據
socket服務端 import socket
# 作為服務器,ip和端口號是明確的
# 參數1指定 AF_INET 為網絡類型 , AF_UNIX 為文件類型
# 參數2 指定SOCK_STERAM 表示TCP協議 SOCK_DGRAM 為udp協議
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 默認就是網絡類型 TCP協議
# serve = socket.socket()
server.bind(('127.0.0.1', 122))
# 開始監聽1688端口
server.listen()
# 接收鏈接請求
# 第一個是表示客戶端的socket 第二個客戶端的地址信息
client,addr=server.accept()
data=client.recv(122)
client.send('222222'.encode('utf-8'))
server.close()
# 關機 socket客戶端
常見的異常
服務端 import socket
client=socket.socket()
# 所有系統會自動分配隨機端口給客戶端
client.connect(('127.0.0.1', 122))
# 開始通話
# 發送數據 注意發送的內容只能是二進制 bytes
client.send('111111111'.encode('utf-8'))
data = client.recv(122)
client.close() import socket
sever = socket.socket()
sever.bind(('127.0.0.1', 133))
sever.listen()
# accept 是一個阻塞函數 會一直等到有客戶端鏈接過來 在繼續執行
client,addr=sever.accept()
print('三次握手成功')
# 收發數據 注意都是用表示客戶端的socket來收發數據
# client.send('hello'.encode('utf-8'))
try:
data=client.recv(100)
print('客戶端發來的數據',data)
except:
print('client 下線')
client .close()
print('完成四次揮手')
# 休10秒
import time
time.sleep(10)
sever.close()
print('服務器關機') 客戶端
import socket
client=socket.socket()
# connect本質實在進行三次握手 也是一個數據傳輸的過程 如果服務器沒有立馬響應 也會阻塞
client.connect(('127.0.0.1',133))
print('握手成功!')
# 發送數據 本質上是把數據交給操作系統來進行發送 一旦數據交給了操作系統 后續的發送
# 應用程序就無法控制了 ,send一般不會卡 當然 如果數據量很大就會阻塞
# client.send('hello'.encode('utf-8'))
# print('發送完成')
# 是從操作系統緩存區讀取數據 如果當前還沒有任何數據 就會進入阻塞
# 會一直等到有數據到來 再繼續執行
try:
data=client.recv(100)
print('客戶端的數據',data)
except:
print('client 下線')
# 客戶端執行close 是正常關閉鏈接 會給服務器送空字節 用于表示要斷開鏈接
client.close()
print('客戶端關機') import socket
server = socket.socket()
server.bind(('127.0.0.1',11))
server.listen()
server.accept()
server.close()
異常
# 如果已經開啟了服務器 再次運行將會拋出 端口占用異常 把之前開啟的服務器關掉即可
2.三次握手或四次揮手時,發生了異常導致對方程序已經結束而服務器任然處于time_wait狀態導致!
3.在高并發的場景下,由于鏈接的客戶端太多,也會產生大量處于time_wait狀態的鏈接
"""
有些情況 明明已經關閉了進程 但是 還是端口占用
可能是進程正在后臺運行 可以通過端口查出進程 進行關閉
windows下
netstat -ano | findstr 9898
tasklist | findstr 進程id 拿到進程名稱
taskkill /f /t /im 進程名稱
大招: 重啟電腦
""" 循環
服務器 import socket
sever = socket.socket()
# 指定服務器的端口和ip 客戶端的端口系統自動分配的
sever.bind(('127.0.0.1',36))
sever.listen()
while True:
client_socket,client_addr=sever.accept()
buffer_size=1024
# 緩沖區 就是一個臨時的容器
while True:
try:
data=client_socket.recv(1024)
if not data:
client_socket.close()
break
print(data.decode('utf-8'))
# 解碼時必須保證雙方同意編碼方式
# 轉為大寫在發回去
client_socket.send(data.upper())
except ConnectionResetError as a:
print('%s %s" % (client_addr[0],client_addr[1]),e')
# 如果對方下線了 那服務器也應該關閉對應的客戶端對象
client_socket.close()
break
客戶端 import socket
client=socket.socket()
client .connect(('127.0.0.1',36))
while True:
msg=input('輸入內容...')
if msg == 'q':
break
if not msg:
continue
client.send(msg.encode('utf-8'))
print('發送')
data = client.recv(1024)
print(data.decode('utf-8'))
client.close()
windows正常關閉
服務器 import socket
sever = socket.socket()
sever.bind(('127.0.0.1',96))
sever.listen()
while True:
client_socket,client_addr=sever.accept()
buffer_size=1024
while True:
try:
data=client_socket.recv(1024)
if not data:
print(data)
break
print('收到數據...',data.decode('utf-8'))
# 解碼時必須保證雙方同意編碼方式
# 轉為大寫在發回去
client_socket.send(data.upper())
except ConnectionResetError as a:
print('%s %s'%(client_addr[0],client_addr[1]),a)
# 如果對方下線了 那服務器也應該關閉對應的客戶端對象
break
client_socket.close() 客戶端
import socket
client=socket.socket()
client.connect(('127.0.0.1',96))
# 添加循環 用來重復收發數據
while True:
# 收發的順序 必須和對面相反 否則卡死了
msg= input('輸入內容....q 退出')
if msg == 'q':
break
if not msg:
continue
client.send(msg.encode('utf-8'))
print('發送')
data = client.recv(1024)
print(data.decode('utf-8'))
client.close()
?
轉載于:https://www.cnblogs.com/komorebi/p/10940771.html
總結
以上是生活随笔為你收集整理的31 socket客户端. 服务器 异常 语法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SESSION 回收机制
- 下一篇: 计算机网络入门指南之计算机网络体系结构