学习自https://www.liaoxuefeng.com/wiki/1016959663602400/1017788916649408
socket是在客户机和服务机之间的连接。涉及到客户机和服务机两台电脑,客户机负责发送建立请求,和回收接收到的信息,而服务机要负责监控相应的端口程序,以响应请求
根据代码来理解原理
客户端:
1、新建一个socket,里面得说明是符合什么连接协议,ipv4或者ipv6,在就是定义为socket传输流
sc= socket.socket(socket.AF_INET,socket.SOCKET_STREAM)
2、需要和什么服务器建立连接,连接的ip和端口。如百度的端口80
sc.connect(('www.baidu.com',80))
3、建立好连接后,客户机需要发送请求信息给服务器
sc.send('GET HTTP/1.1/
HOST: www.baidu.com
Connection:close
')----
表示回车,
换行
表示结束
4.执行完前面三步,sc里面已经有服务机返回的信息了。
建立一个用于接收的容器,并把内容写入tagertHtml内
list = []
targetHtml= 'D: argetHtml.html'
while True:
data = sc.recv(2048)
if data:
list.append(data)
else:
break
d = b''.join(list)#将list数据转换为二进制数据(很重要)
with open(targetHtml,'wb') as f:
f.write(d)
客户机:
sc = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sc.bind('127.0.0.1',80)
sc.listen(5)
print('waiting for connection')
while True:
socket,addr =sc.accept()#接收到socket和addr
#创建线程去完成任务
t = threading.Thread(target=tcplink,args(socket,addr))
t.start()
def tcplink(socket,addr):
socket.send(b'welcome')
while True:
data = socket.recv(1024)
time.sleep(1)
if not data or data.decode('utf-8') == 'exit':
break
socket.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))
socket.close()
print('conect close')