• Python Socket


    Python 使用Socket提供对TCP / UDP网络通信的支持。

    TCP

    client

    TCP是带连接的可靠通信协议。创建TCP连接时,主动发起连接的称为客户端,被动响应连接称为服务器。

    示例,请求博客园首页:

    import socket
    
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(('www.cnblogs.com',80))
    s.send(b'GET / HTTP/1.1
    Host: www.cnblogs.com
    Connection: close
    
    ')
    # receive
    buf = list()
    while True:
    	d = s.recv(1024)
    	if d:
    		buf.append(d)
    	else:
    		break
    
    print(buf)
    s.close()
    

    说明:

    • socket.socket()

    建立socket连接。

    socket.AF_INET代表使用IPv4协议,socket.AF_INET6使用更新的IPv6协议。

    SOCK_STREAM指定使用面向流的TCP协议。

    • s.connect()

    进行socket连接,参数为包含url和port的元组。

    • s.send(str)

    通过socket发送数据。

    • s.recv(max)

    接收返回的数据,max指定最大字节数。

    server

    服务端程序监听接口,拦截请求然后进行响应。

    先编写一个client:

    import socket
    
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(('127.0.0.1', 8081))
    print(s.recv(1024).decode('utf-8'))
    s.send('Finley')
    s.close()
    

    server代码:

    import socket
    import threading
    
    def respond(sock, addr):
    	buf = list()
    	while True:
    		d = sock.recv(1024)
    		if d:
    			buf.append(d)
    		else:
    			break
    	data = 'Hello, ' + buf
    	sock.send(data)
    
    
    if __name__ == '__main__':
    	s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    	s.bind(('127.0.0.1', 8081))
    	s.listen(5)
    	while True:
    	    sock, addr = s.accept()
    		s.send('Hello from server')
    	    t = threading.Thread(target=respond, args=(sock, addr))
    	    t.start()
    	s.close()
    

    很多地方与client一致,主要多了监听端口所需的API:

    • bind()

    接受一个包含URL和port的元组作为参数,绑定该端口

    • listen(max)

    执行监听, 阻塞式调用max为最大连接数

    • accept()

    建立连接

    UDP

    UDP是无连接的用户数据报协议,通常用来发送要求速度快不要求可靠到达的数据,如检测用户是否在线。

    UDP的socket为SOCK_DGRAM,udp无需连接,服务器无需绑定接口进行监听。

    client:

    import socket
    
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    data = 'hello'
    s.sendto(data, ('127.0.0.1', 9999))
    print(s.recv(1024).decode('utf-8'))
    s.close()
    

    使用sendto(data, addr_tuple)发送数据报

    server:

    import socket
    
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.bind(('127.0.0.1', 9999))
    print('bind udp on 9999')
    data, addr = s.recvfrom(1024)
    print('Received from %s:%s.' % addr)
    s.sendto(b'Hello, %s!' % data, addr)
        s.close()
    

    使用recvfrom(max)接收发送来的数据。

  • 相关阅读:
    Django基础
    Web框架
    JQuery
    16 Javascript
    axios+qs传值序列化时出现数组形式我们该如何修改呢?
    MyBatis 对象中含有对象的查询
    MyBatis 新增获取自增主键的小坑
    List、Set、Map
    事务的隔离级别
    mybatis配置中文参考文档
  • 原文地址:https://www.cnblogs.com/Finley/p/5297566.html
Copyright © 2020-2023  润新知