Day18-網(wǎng)絡(luò)編程

1.socket編程

socket又叫套接字
socket編程其實就是用代碼來實現(xiàn)進(jìn)行網(wǎng)絡(luò)通信的兩個端;套接字就是實現(xiàn)通信的兩個程序
實現(xiàn)通信的兩個端分為服務(wù)器和客戶端兩種

python通過socket模塊來提供socket編程相關(guān)的類和方法;其中socket類就是套接字對應(yīng)的類

2.服務(wù)器端的實現(xiàn)

1)創(chuàng)建套接字對象(買電話機(jī))

socket(family=AF_INET, type=SOCK_STREAM)

family - 設(shè)置ip類型; AF_INET對應(yīng)的是ipv4; AF_INET6對應(yīng)的是ipv6
type - 設(shè)置傳輸類型;  SOCK_STREAM對應(yīng)的是TCP協(xié)議; SOCK_DGRAM對應(yīng)的是UDP協(xié)議
"""
server = socket()

2)綁定IP和端口(插電話線)

bind((ip地址, 端口))

ip地址: 找到互聯(lián)網(wǎng)中唯一的一臺計算機(jī); 賦值ip地址對應(yīng)的字符串
端口: 區(qū)分同一臺計算機(jī)中不同的服務(wù)(程序); 賦整數(shù),值的范圍是0~65535, 其中0~1024屬于著名,不能隨便用。
同一時間同一個端口只能對應(yīng)一個服務(wù)

server.bind(('10.7.156.58', 12342))

3)開始監(jiān)聽(等電話)

server.listen(512)

4)保證服務(wù)器一直運行

while True:
    print('開始監(jiān)聽...')

5)接收客戶端的請求(接電話),返回為這個客戶端創(chuàng)建的獨立的套接字對象(分機(jī))和客戶端的地址

當(dāng)程序運行到這句代碼的時候會停下來,直到有請求為止

    connection, address = server.accept()
    print(connection, type(connection))
    print(address)
    print('============')

6)接收消息(聽別人說話)

    # recv(一次性能夠接收的數(shù)據(jù)的大小)   - 返回接收到的數(shù)據(jù), 數(shù)據(jù)類型是二進(jìn)制
    recv_data = connection.recv(1024)
    print(recv_data.decode(encoding='utf-8'))

7)發(fā)送消息(說話給別人聽)

# send(需要發(fā)送的數(shù)據(jù))
# with open('test.html', 'r', encoding='utf-8') as f:
    #     message = f.read()
    # connection.send(('HTTP/1.1 200 OK\r\n\r\n'+message).encode())
message = input('(server)請輸入:')
connection.send(message.encode())

8)關(guān)閉連接(掛電話)

connection.close()

二、socket客戶端

1.客戶端套接字

1)創(chuàng)建套接字對象(買電話)

client = socket()

2)連接服務(wù)器(撥號)

client.connect(('10.7.156.58', 12342))

3)發(fā)送消息

client.send('服務(wù)器你好嗎?'.encode())

4)接收消息

re_data = client.recv(1024)
print(re_data.decode(encoding='utf-8'))

5)關(guān)閉連接

client.close()

三、server單人通訊

1.創(chuàng)建套接字對象

server = socket()

2.綁定ip和端口

server.bind(('10.7.156.58', 8081))

3.準(zhǔn)備監(jiān)聽

server.listen(512)

4.讓服務(wù)一直運行

while True:
    print('開始監(jiān)聽...')
    # 1.接受請求
    connection, address = server.accept()

    # 2.持續(xù)交流
    while True:
        # 接收消息
        re_data = connection.recv(1024)
        re_message = re_data.decode(encoding='utf-8')
        print('%s:%s'% (address[0], re_message))
        if re_message == '拜拜' or re_message == 'ByeBye':
            connection.close()
            break

        # 發(fā)送消息
        message = input('server:')
        connection.send(message.encode())
        if message == '拜拜' or message == 'ByeBye':
            connection.close()
            break

四、client持續(xù)通信

1.創(chuàng)建套接字對象

client = socket()

2.建立連接

client.connect(('10.7.156.58', 8086))

3.持續(xù)交流

while True:
    # 1.發(fā)送消息
    message = input('client:')
    client.send(message.encode())
    if message == '拜拜' or message == 'ByeBye':
        client.close()
        break

    # 2.接收消息
    re_message = client.recv(1024).decode(encoding='utf-8')
    print('server:', re_message)
    if re_message == '拜拜' or re_message == 'ByeBye':
        client.close()
        break

五、server圖片數(shù)據(jù)

server = socket()
server.bind(('10.7.156.58', 8086))
server.listen(512)
while True:
    connection, address = server.accept()
    # 發(fā)送圖片
    with open('海賊王/aa.wav', 'rb') as f:
        data = f.read()
    # 先發(fā)送整個圖片的總長度  100 -> '100'
    length = len(data)
    connection.send(str(length).encode())
    # 再發(fā)送圖片數(shù)據(jù)
    connection.send(data)

六、client圖片數(shù)據(jù)

client = socket()
client.connect(('10.7.156.58', 8086))

# 接收圖片長度
total_length = int(client.recv(1024).decode())
print('第一次:', total_length)


sum_length = 0   # 保存接收到的圖片的總長度
sum_data = bytes()   # 保存接收到的圖片的總數(shù)據(jù)


# 接收圖片
while True:
    # 方法一: 接收一點兒寫一點兒
    # re_data = client.recv(1024)
    # length = len(re_data)
    # sum_length += length
    # print('當(dāng)前接收的數(shù)據(jù)的長度:', length)
    # with open('client/test.jpeg', 'ab') as f:
    #     f.write(re_data)
    #
    # if sum_length == total_length:
    #     break

    re_data = client.recv(1024)
    sum_data += re_data
    if len(sum_data) == total_length:
        with open('client/test1.wav', 'wb') as f:
            f.write(sum_data)
        break

七、多人同時聊天

class ConnectionThread(Thread):
    def __init__(self, connection: socket, address):
        super().__init__()
        self.connection = connection
        self.address = address

    def run(self):
        # 實現(xiàn)和一個客戶端不斷聊天的效果
        while True:
            re_message = (self.connection.recv(1024)).decode(encoding='utf-8')
            print('%s:%s'%(self.address[0], re_message))

            self.connection.send('我是余婷!'.encode())



server = socket()
server.bind(('10.7.156.58', 8086))
server.listen(512)
while True:
    print('監(jiān)聽....')
    connection, address = server.accept()
    t1 = ConnectionThread(connection, address)
    t1.start()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容