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()