菜鸟初学python入门进阶第九节:面向对象,socket编程

1.HTTP、Socket、TCP

由于http是单向的、如聊天室的就实现不了,我们需要一种新的协议,一种基于传输层的api,也就是socket
TCP协议之上提供了socket接口,TCP协议是可以双向传播的
在这里插入图片描述

2.socket和server实现通信

server端

import socket

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 网络,协议
server.bind(('0.0.0.0', 8000))# 服务器
server.listen()
# 返回一个socket对象和对应绑定的用户地址
sock, addr = server.accept()
# 一次从客户端获取1kb数据,data是byte类型
data = sock.recv(1024)
# utf8方式解码成字符串
print(data.decode("utf8"))
# 获得新字符串,utf8方式编码成byte类型
sock.send("recv {}".format(data.decode('utf8')).encode('utf8'))

server.close()
sock.close()

client端

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 网络,协议
client.connect(('127.0.0.1', 8000))
client.send('dk'.encode('utf8'))
data = client.recv(1024)
print(data.decode('utf8'))
client.close()

先运行server,再运行client

3.socket实现聊天和多用户连接

server端

import socket
import threading

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 网络,协议
server.bind(('0.0.0.0', 8000))# 服务器
server.listen()

def handle_socket(sock, addr):
    while True:
        # 一次从客户端获取1kb数据,data是byte类型
        data = sock.recv(1024)
        if data.decode('utf8') == 'im out':
            break
        # utf8方式解码成字符串
        print(data.decode("utf8"))
        # 获得新字符串,utf8方式编码成byte类型
        re_data = input()
        sock.send("recv {}\nadd {}".format(data.decode('utf8'), re_data).encode('utf8'))
    print('one guy out')
    sock.close()

while True:
    print('in accepting')
    # 返回一个socket对象和对应绑定的用户地址
    sock, addr = server.accept()
    client_thread = threading.Thread(target=handle_socket, args=(sock, addr))
    client_thread.start()

client端

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 网络,协议
client.connect(('127.0.0.1', 8000))
while True:
    request = input()
    if request == 'im out':
        break
    client.send(request.encode('utf8'))
    data = client.recv(1024)
    print(data.decode('utf8'))
client.close()

4.socket发送http请求

平常用的requests库基于python的urllib,urllib基于socket

import socket
from urllib.parse import urlparse
'''parse用来解析url'''

def get_url(url):
    '''通过socket请求url'''
    url = urlparse(url)
    host = url.netloc
    path = url.path
    if path == '':
        path = '/'

    '''建立socket连接'''
    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
    data = data.decode('utf8')
    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、付费专栏及课程。

余额充值