python socket编程

弄懂 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")


完结

下一篇:多线程,多进程和线程池编程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值