1.socket编程
socket又叫套接字
socket编程其实就是用代码来实现进行网络通信的两个端;套接字就是实现通信的两个程序
实现通信的两个端分为服务器和客户端两种
python通过socket模块来提供socket编程相关的类和方法;其中socket类就是套接字对应的类
2.服务器端的实现
1)创建套接字对象(买电话机)
socket(family=AF_INET, type=SOCK_STREAM)
family - 设置ip类型; AF_INET对应的是ipv4; AF_INET6对应的是ipv6
type - 设置传输类型; SOCK_STREAM对应的是TCP协议; SOCK_DGRAM对应的是UDP协议
"""
server = socket()
2)绑定IP和端口(插电话线)
bind((ip地址, 端口))
ip地址: 找到互联网中唯一的一台计算机; 赋值ip地址对应的字符串
端口: 区分同一台计算机中不同的服务(程序); 赋整数,值的范围是0~65535, 其中0~1024属于著名,不能随便用。
同一时间同一个端口只能对应一个服务
server.bind(('10.7.156.58', 12342))
3)开始监听(等电话)
server.listen(512)
4)保证服务器一直运行
while True:
print('开始监听...')
5)接收客户端的请求(接电话),返回为这个客户端创建的独立的套接字对象(分机)和客户端的地址
当程序运行到这句代码的时候会停下来,直到有请求为止
connection, address = server.accept()
print(connection, type(connection))
print(address)
print('============')
6)接收消息(听别人说话)
# recv(一次性能够接收的数据的大小) - 返回接收到的数据, 数据类型是二进制
recv_data = connection.recv(1024)
print(recv_data.decode(encoding='utf-8'))
7)发送消息(说话给别人听)
# send(需要发送的数据)
# 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)关闭连接(挂电话)
connection.close()
二、socket客户端
1.客户端套接字
1)创建套接字对象(买电话)
client = socket()
2)连接服务器(拨号)
client.connect(('10.7.156.58', 12342))
3)发送消息
client.send('服务器你好吗?'.encode())
4)接收消息
re_data = client.recv(1024)
print(re_data.decode(encoding='utf-8'))
5)关闭连接
client.close()
三、server单人通讯
1.创建套接字对象
server = socket()
2.绑定ip和端口
server.bind(('10.7.156.58', 8081))
3.准备监听
server.listen(512)
4.让服务一直运行
while True:
print('开始监听...')
# 1.接受请求
connection, address = server.accept()
# 2.持续交流
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
# 发送消息
message = input('server:')
connection.send(message.encode())
if message == '拜拜' or message == 'ByeBye':
connection.close()
break
四、client持续通信
1.创建套接字对象
client = socket()
2.建立连接
client.connect(('10.7.156.58', 8086))
3.持续交流
while True:
# 1.发送消息
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图片数据
server = socket()
server.bind(('10.7.156.58', 8086))
server.listen(512)
while True:
connection, address = server.accept()
# 发送图片
with open('海贼王/aa.wav', 'rb') as f:
data = f.read()
# 先发送整个图片的总长度 100 -> '100'
length = len(data)
connection.send(str(length).encode())
# 再发送图片数据
connection.send(data)
六、client图片数据
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() # 保存接收到的图片的总数据
# 接收图片
while True:
# 方法一: 接收一点儿写一点儿
# re_data = client.recv(1024)
# length = len(re_data)
# sum_length += length
# print('当前接收的数据的长度:', 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):
# 实现和一个客户端不断聊天的效果
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('监听....')
connection, address = server.accept()
t1 = ConnectionThread(connection, address)
t1.start()