Python3 网络套接字(socket / socketserver)

Python3 网络套接字(socket / socketserver)


本文由 Luzhuo 编写,转发请保留该信息.
原文: http://blog.csdn.net/Rozol/article/details/72553736


以下代码以Python3.6.1为例
Less is more!

socket

#!/usr/bin/env python
# coding=utf-8
__author__ = 'Luzhuo'
__date__ = '2017/5/13'
# socket_demo.py 套接字接口
# 协议: TCP/IP(3次握手,4次断开) UDP(直接发数据)
# 一台PC最多可开 65535 个端口

import socket
import os

# 地址簇
socket.AF_INET  # IPV4, (host, port), host:'luzhuo.me' / '127.0.0.1'
socket.AF_INET6  # IPV6, (host, port, flowinfo, scopeid); boolean = socket.has_ipv6 // 是否支持ipv6

# 套接字类型
socket.SOCK_STREAM  # tcp
socket.SOCK_DGRAM  # udp
socket.SOCK_RAW  # 原始套接字(可伪造IP地址,发起DDOS攻击)
socket.SOCK_RDM  # UDP,保证交付,但不保证顺序
socket.SOCK_SEQPACKET


HOST = 'localhost' # windows: '127.0.0.1' / 'localhost'; linux:0.0.0.0
PORT = 10086


def tcp_server():
    '''
    TCP服务端
    '''

    # 1. 实例化socket对象
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  # 可重用地址
    # 2. 绑定
    server.bind((HOST, PORT))  # 绑定
    # 3. 监听链接
    server.listen()
    while True:
        # 4. 接收一个连接
        conn, addr = server.accept()  # (阻塞等待)接收一个连接, 返回 连接对象 地址
        while True:
            # 5. 接收/发送数据 (接收数据(命令), 发送数据量, 接收反馈, 发送全部数据)
            data_bytes = conn.recv(1024)  # (阻塞)接收数据
            if not data_bytes:
                break  # 当client断开时,conn.recv不断的接收空信息
            data_str = data_bytes.decode("utf-8")
            print("接收到数据: {}".format(data_str))
            res_cmd_bytes = os.popen(data_str).read().encode("utf-8")
            if not res_cmd_bytes:
                res_cmd_bytes = b"success"
            conn.send(str(len(res_cmd_bytes)).encode("utf-8"))  # 不能发送空数据
            conn.recv(1024)  # 为避免粘包, 发送数据后接收下客户端的反馈
            conn.send(res_cmd_bytes)  # 每次发送的数据量与缓存有关
        # 6. 关闭连接, 释放资源
        conn.close()
    server.close()


def tcp_client(data):
    '''
    TCP客户端
    :param data: 字符串数据
    '''

    # 1. 实例化对象
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2. 连接服务端
    client.connect((HOST, PORT))  # 连接
    if not data:
        return
    data_bytes = data.encode("utf-8")
    # 3. 发送/接收数据 (发送数据, 接收反馈, 发送反馈, 接收全部数据)
    client.send(data_bytes)  # 发送数据, 发送的数据不能为空, 未发完的数据将放到缓冲区继续发
    res_count_bytes = client.recv(1024)  # 接收数据, 每次接收的数据量有限制, 限制大小与系统有关
    client.send(b"seccess")  # 给服务器反馈
    if not res_count_bytes:
        res_count_bytes = b'0&#
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值