socket套接字

socketsocket

什麼是socket?tcp

         socket是應用層與TCP/IP協議族通訊的中間軟件抽象層,它是一組接口,它把複雜的TCP/IP協議族隱藏在socket接口後面,對用戶來講,一組簡單的接口就是所有。spa

爲何使用socket?code

         socket幫咱們把複雜的TCP/IP協議族封裝好了,咱們只須要調用socket的接口。blog

怎麼用?接口

         基於tcp的套接字(socket):ip

服務端:服務端就至關於手機通訊過程utf-8

import socket
#一、買手機
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #tcp稱爲流式協議,udp稱爲數據報協議SOCK_DGRAM
# print(phone)

#二、插入/綁定手機卡
# phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
phone.bind(('127.0.0.1',8080))

#三、開機
phone.listen(5) # 半鏈接池,限制的是請求數

#四、等待電話鏈接
print('start....')
conn,client_addr=phone.accept() #(三次握手創建的雙向鏈接,(客戶端的ip,端口))
# print(conn)
print(client_addr)

#五、通訊:收\發消息
data=conn.recv(1024) #最大接收的字節數
print('來自客戶端的數據',data)
conn.send(data.upper())

# import time
# time.sleep(500)
#六、掛掉電話鏈接
conn.close()

#七、關機
phone.close()

客戶端:客戶端至關於找電話亭給他人打電話過程input

import socket

#一、找電話亭
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print(phone)
#二、撥電話
phone.connect(('127.0.0.1',8080)) # 指定服務端ip和端口

#三、通訊:發\收消息
phone.send('hello'.encode('utf-8'))
# phone.send(bytes('hello',encoding='utf-8'))
data=phone.recv(1024)
print(data)

# import time
# time.sleep(500)
#四、掛機
phone.close()

爲服務端與客戶端加上鍊接循環與通訊循環io

服務端:

import socket

#一、買手機
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #tcp稱爲流式協議,udp稱爲數據報協議SOCK_DGRAM

#二、插入/綁定手機卡
# phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # 防止地址仍被佔用時報錯
phone.bind(('127.0.0.1',8080))

#三、開機
phone.listen(5) # 半鏈接池,限制的是請求數

#四、等待電話鏈接
print('start....')
while True: # 鏈接循環
    conn,client_addr=phone.accept() #(三次握手創建的雙向鏈接,(客戶端的ip,端口))
    # print(conn)
    print('已經有一個鏈接創建成功',client_addr)

    #五、通訊:收\發消息
    while True: # 通訊循環
        try:
            print('服務端正在收數據...')
            data=conn.recv(1024) #最大接收的字節數,沒有數據會在原地一直等待收,即發送者發送的數據量必須>0bytes
            # print('===>')
            if len(data) == 0:break #在客戶端單方面斷開鏈接,服務端纔會出現收空數據的狀況
            print('來自客戶端的數據',data)
            conn.send(data.upper())
        except ConnectionResetError:
            break
    #六、掛掉電話鏈接
    conn.close()

客戶端

#一、買手機
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# print(phone)
#二、撥電話
phone.connect(('127.0.0.1',8080)) # 指定服務端ip和端口

#三、通訊:發\收消息
while True: # 通訊循環
    msg=input('>>: ').strip() #msg=''
    if len(msg) == 0:continue
    phone.send(msg.encode('utf-8'))
    # print('has send----->')
    data=phone.recv(1024)
    # print('has recv----->')
    print(data)
相關文章
相關標籤/搜索