前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python的socket编程介绍及示例

python的socket编程介绍及示例

原创
作者头像
languageX
发布2021-10-02 21:58:36
1.3K0
发布2021-10-02 21:58:36
举报
文章被收录于专栏:计算机视觉CV计算机视觉CV

一 基础知识

在进行代码实现前,先简单介绍下TCP,UDP,Socket等基础知识。

首先要了解下socket(套接字),我们可以通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。

另外在通讯中,我们经常使用TCP和UDP,TCP,UDP属于传输层的连接,他们之间区别是TCP是面向链接的,他的连接需要经过三次握手;而UDP传送数据前并不与对方建立连接。所以一般说TCP比UDP安全,但是UDP比TCP实时。

HTTP属于应用层的协议,只有连接把数据进行传输,但是没有一个协议的话我们不知道传输的到底是什么东西,所以需要一个应用层的HTTP协议(超文本传送协议Hypertext Transfer Protocol )。TCP是底层通讯协议,定义的是数据传输和连接方式的规范;HTTP是应用层协议,定义的是传输数据的内容的规范;

我们有了连接,还需要一个对外的变成接口,这就是本文要介绍的Socket套接字了。Sockert编程接口就是为了让我们更方便的使用协议栈。

具体的介绍可以参考:

TCP和UDP区别以及HTTP协议

https://segmentfault.com/a/1190000014044351

Socket连接与HTTP连接

https://cloud.tencent.com/developer/article/1124905

二 代码示例

下面我们直接使用python的Socket进行编程,简单实现一个客户端发送请求,服务端收到请求后返回一个json的示例。

需要用到的库就是

import socket

服务端代码

服务端主要做的事情

  1. 创建套接字:socket.socket()
  2. 绑定IP和端口:socket.bind()
  3. 开始tcp监听socket.listen()
  4. 接受tcp连接,等待数据:socket.accept()
  5. 接收数据:socket.recv()
  6. 发送处理数据:socket.sendall()
  7. 关闭套接字:socket.close()

其中recv和send是bytes类型,所以如果是字符串或者json格式需要进行下转换。因为项目中多使用json格式,所以本文也以收到str,返回json的形式编写示例。

服务端详细代码如下:

代码语言:javascript
复制
import json
import socket

HOST = '127.0.0.1'
PORT = 8000
ADDR = (HOST,PORT)

def start_server():
    # 创建套接字:AF_INET--使用ipv4地址族  SOCK_STREAM--用流式套接字
    svr_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    svr_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    # 绑定host:port
    svr_socket.bind(ADDR)
    # setblocking 0--非阻塞模式 ,1--阻塞模式 默认为1
    svr_socket.setblocking(1)
    # 开始监听TCP传入连接
    svr_socket.listen(5)

    # 返回新的套接字和客户端地址
    client_socket, addr = svr_socket.accept()
    client_socket.settimeout(20.0)

    # 接收数据,这里先接收数据长度(需要和客户端协商发送格式,是否是len+data的形式),可以不用这一步
    data_len = client_socket.recv(4)
    length = int.from_bytes(data_len, byteorder="big")
    # 接收的具体数据,这里也可以设置一个较大缓冲区
    data = client_socket.recv(length)
    print("rev client data", data)

    # 返回给客户端数据,设置为一个json
    json_msg ={"key":"id","val": 123}
    str_msg = json.dumps(json_msg)
    # 字符串要转为bytes传输
    client_socket.sendall(str_msg.encode())
    # 关闭套接字
    client_socket.close()

if __name__ == '__main__':
    start_server()

客户端代码

服务端主要做的事情

  1. 创建套接字:socket.socket()
  2. 打开tcp连接:socket.connect()
  3. 发送请求数据:socket.sendall()
  4. 接收服务端数据:socket.recv()
  5. 关闭套接字:socket.close()

完整代码:

代码语言:javascript
复制
import json
import socket

HOST = '127.0.0.1'
PORT = 8000
ADDR = (HOST,PORT)

def start_client():
    # 创建套接字
    _socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    _socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    # 打开tcp连接
    _socket.connect(ADDR)

    msg = "msg from client"
    length = len(msg)
    buf = length.to_bytes(4, byteorder="big")
    # 发送请求数据 len+data格式
    _socket.sendall(buf + msg.encode())

    # 接收服务端返回数据
    data = _socket.recv(1024)
    msg = json.loads(data)
    print("client get json", msg)
    # 关闭套接字
    _socket.close()

if __name__ == '__main__':
    start_client()

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一 基础知识
  • 二 代码示例
    • 服务端代码
      • 客户端代码
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档