Python爬虫 socket库实践——模拟连接发送接收数据

Python爬虫(八)

学习Python爬虫过程中的心得体会以及知识点的整理,方便我自己查找,也希望可以和大家一起交流。

—— socket库实践 模拟连接发送接收数据 ——

1.基于TCP协议的模拟服务端

  1. 引入socket库。

    import socket
    
  2. 设置socket,主机和端口,并将主机名和端口绑定在一起,同时开启侦听。

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    host = socket.gethostname()
    port = 1234
    s.connect((host, port))
    s.listen(5)
    
  3. 设置一个循环,确保可以接受多个申请。

    while True:
    	connection, address = s.accept()
    	print ('Got connection from', address)
    
  4. 可以设置Socket超时时间。

    	connection.settimeout(5)
    
  5. 设置接受数据,并规定接受数据的长度,防止接收包过大。

    	buf = connection.recv(1024)
    
  6. 转换类型,由于Python 3 的新规定,发送的必须是bytes类型,所以我们需要把str类型转换为bytes。

    	str1 ='Thank you for connecting'
    	str1 = str1.encode()
    	str2 ='Go away!'
    	str2 = str2.encode()
    	str3 ='1'
    	str3 = str3.encode()
    
  7. 继续循环,进行判断,依据接收数据判断返回数据。

    	if buf == str3:
        	connection.send(str1)
        else:
        	connection.send(str2)
    	connection.close()
    s.close()
    

2.基于TCP协议的模拟客户端访问服务端

  1. 引入socket库和time库。

    import socket
    import time
    
  2. 设置socket,主机和端口,并将主机名和端口绑定在一起确定发送目标。

    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    host = socket.gethostname()
    port = 1234
    s.connect((host, port))
    
  3. 转换类型,由于Python 3 的新规定,发送的必须是bytes类型,所以我们需要把str类型转换为bytes。

    str01 = '1'
    str01 = str01.encode()
    
  4. 设置发送睡眠间隔时间

    time.sleep(1)
    
  5. 发送数据,并将接收的数据打印出来。

    s.send(str01)
    print (s.recv(1024))
    s.close()
    

效果演示:

  1. 启动服务端,并开始接收数据。
    socket库实践
  2. 启动客户端,并发送数据。
    socket库实践
  3. 可以看到返回数据和接收数据都是成功的,并且此时服务端依然还在运行。
    socket库实践

3.基于UDP协议的模拟服务端

  1. 大部分和基于TCP的一样,但是要注意,UDP不需要三次握手,所以不需要listen和accept,也要注意发送数据的类型是bytes。
    #coding:utf-8
    
    import socket
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    host = socket.gethostname()
    port = 1234
    s.bind((host, port))
    while True:
    	recv,client_addr = s.recvfrom(1024)
    	if not recv:
        	break
    	print('[Client %s:%s said]:%s' % (client_addr[0],client_addr[1],recv))
    	str1 ='tcpServer has received your message'
    	str1 = str1.encode()
    	s.sendto(str1,client_addr)
    
    

4.2.基于UDP协议的模拟客户端访问服务端

  1. 大部分和基于TCP的一样,但是要注意,UDP不需要三次握手,所以不需要listen和accept,也要注意发送数据的类型是bytes。

    import socket
    import time
    
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    host = socket.gethostname()
    port = 1234
    s.connect((host, port))
    
    str01 = '1'
    str01 = str01.encode()
    
    time.sleep(1)
    s.send(str01)
    print (s.recv(1024))
    s.close()
    

效果演示:

  1. 启动服务端,并开始接收数据。
    socket库实践
  2. 启动客户端,并发送数据。
    socket库实践
  3. 服务端也接收到客户端的数据了。

socket库实践

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值