日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

31 socket客户端. 服务器 异常 语法

發布時間:2023/12/18 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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()

異常

# 如果已經開啟了服務器 再次運行將會拋出 端口占用異常 把之前開啟的服務器關掉即可

1.可能是由于你已經啟動了服務器程序,卻又再次啟動了服務器程序,同一個端口不能被多個進程使用導致!

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客户端. 服务器 异常 语法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。