弄懂 HTTP、Socket、TCP概念
其实在传输层和应用层当中还有表示层和会话层这2个层。7层网络模型。
socket协议不是属于计算机网络协议。使得应用层可以直接和传输层进行沟通。独立于这个模型之外,可以脱离于应用层,可以与传输层及以下的层建立沟通。
socket的client 和server 实现通信
上图中左侧是server端,右侧是client端。
下面是使用socket_server.py和socket_client.py实现了简单的从服务端到
客户端的通信。运行时先运行服务端,在运行客户端。
socket_server.py
import socket
# 网络类型 协议
server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#绑定 ip 端口
server.bind(('0.0.0.0',8000))
#监听
server.listen()
sock,addr=server.accept()
#获取从客户端发送的数据
data=sock.recv(1024)
#bytes类型
print(data.decode("utf8"))
sock.send("hello ! {}".format(data.decode("utf8")).encode("utf8"))
server.close()
sock.close()
socket_client.py
import socket
# 网络类型 协议
client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(('127.0.0.1',8000))
client.send("xiaopang".encode("utf8"))
data=client.recv(1024)
print(data.decode("utf8"))
client.close()
socket实现聊天和多用户连接
socket_server.py
import socket
import threading
# 网络类型 协议
server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#绑定 ip 端口
server.bind(('0.0.0.0',8000))
#监听
server.listen()
def handle_sock(sock,addr):
while True:
data = sock.recv(1024)
# bytes类型可以让我们的终端去输入
print(data.decode("utf8"))
# 这里可以加入判断接收的数据格式
'''
if type(data)==数据类型:
break
然后在循环之外 sock.close()
'''
re_data = input()
sock.send(re_data.encode("utf8"))
while True:
sock, addr = server.accept()
#用线程去处理新接受的连接(用户) #参数target传递的是函数的名称
client_thread=threading.Thread(target=handle_sock,args=(sock,addr))
#启动线程
client_thread.start()
# #获取从客户端发送的数据 1次接受1k的数据
# data=sock.recv(1024)
# #bytes类型可以让我们的终端去输入
# print(data.decode("utf8"))
# re_data=input()
# sock.send(re_data.encode("utf8"))
socket_client.py
import socket
# 网络类型 协议
client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(('127.0.0.1',8000))
# client.send("xiaopang".encode("utf8"))
while True:
re_data=input()
client.send(re_data.encode("utf8"))
#获取从客户端发送的数据
data=client.recv(1024)
#bytes类型可以让我们的终端去输入
print(data.decode("utf8"))
socket 模拟http请求的整个过程
# requests --> urlib-->socket
import socket
from urllib.parse import urlparse
def get_url(url):
#解析url
url=urlparse(url)
host=url.netloc
path=url.path
if path=="":
path="/"
#建立连接
client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect((host,80))
#发送请求
client.send("GET {} HTTP/1.1\r\nHost:{}\r\nConnection:close\r\n\r\n".format(path,host).encode("utf8"))
#将所有数据获取完成
data=b""
while True:
d=client.recv(1024)
if d:
data+=d
else:
break
#数据是byte类型的
data=data.decode("utf8")
#可以将头部去掉
htmldata=data.split("\r\n\r\n")[1]
print(".............htmldata...............")
print(htmldata)
print(".............................data.............")
print(data)
client.close()
if __name__=="__main__":
get_url("http://www.baidu.com")
完结
下一篇:多线程,多进程和线程池编程