美文网首页
python socket示例

python socket示例

作者: 生活就是爱 | 来源:发表于2020-06-07 10:18 被阅读0次

最近写了一个socket示例,可以实现两个功能:

  1. 一个服务端同时服务多个客户端:采用带返回值的多线程

2.客户端发现服务端断开后,自动重连

Server端代码

import socket
import threading
import time


class MyThread(threading.Thread):
    """多线程有返回值时,使用该类"""
    def __init__(self, func, args=()):
        super(MyThread, self).__init__()
        self.func = func
        self.args = args

    def run(self):
        self.result = self.func(*self.args)

    def get_result(self):
        try:
            return self.result
        except Exception:
            return None


def recv_data(sock, nonblock_mark):
    if nonblock_mark:
        '''非阻塞式接受信息'''
        print("start to get message unblock")
        try:
            data = sock.recv(1024, 0x40)
        except Exception as e:
            print("no message recieved!!", e, "will recieve 3s later")
            time.sleep(3)
            data ="null"
    else:
        '''阻塞式接受信息'''
        print("start to get message block")
        try:
            data = sock.recv(1024)
        except Exception as e:
            print("connection broken!!!", e)
            data = None

    return data


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) #设置端口复用
s.bind(('', 123456))
s.listen(5)
print("waiting for connection!!!")
while True:
    sock, addr = s.accept()
    print("receive connection from %s:%s" % addr)
    while True:
        t = MyThread(recv_data, args=((sock, 1)))
        t.start()
        t.join()
        data = t.get_result()
        print(data)
        print("length of data:", len(data), time.time())
        if data == 'exit' or not data:
            print("connection from %s:%s closed" % addr)
            sock.close()
            break
        elif data == "null":
            print("receieve no data on nonblocking mode!!")
            continue
        
s.close()

Client端代码

# 导入 socket、sys 模块
import socket
import struct
import time


def doConnect(host, port):
    # 创建 socket 对象
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    while True:
        try:
            s.connect((host, port))
        except Exception as e:
            print("connection broken:", e, "will reconnect 3s later!!")
            time.sleep(3)
        else:
            break
    return s

# 获取本地主机名
host = "127.0.0.1"
# 设置端口号
port = 123456
# 连接服务,指定主机和端口
s = doConnect(host, port)

while True:
    data = input("please input anykey to continue:")
    if task_type:
        # 发送消息:如果连接失败,重连服务器,重新发送
        try:
            s.send(data.edcode())
        except socket.error as e:
            print("connection borken:", e, "\nwill reconnect 3s later")
            s = doConnect(host, port)
            s.send(data)

    else:
        continue
s.close()

当然,这段代码也是有缺陷的:
1.标准代码应该采用类的方式来写,本人类的基础比较弱,有待加强
2.一个服务端同时服务多个客户端,官方推荐采用select模块
3.客户端的自动重连功能有缺陷:当服务端断开30s之内,客户端依然认为服务端在线,这个bug暂时没找到解决方案

参考资料:
python-socket客户端设置自动重连,服务端线程收发消息
Python socket 怎么判断连接断开
Python-select详解(select、epoll)

相关文章

  • python socket示例

    最近写了一个socket示例,可以实现两个功能: 一个服务端同时服务多个客户端:采用带返回值的多线程 2.客户端发...

  • python socket 简单示例

    服务端: 客户端: 在python3.7里,send发送必须是socket.send(bytes[, flags]...

  • day19-网络通信

    1.socket服务器 代码示例 2.socket客户端 代码示例 3.socket服务器升级 代码示例 4.接受...

  • Python与Java之间Socket通信

    python socket server python socket client java socket cli...

  • Socket示例

    1.1-GCDScoket 该框架提供了一套底层API来处理这些过程 下载地址:https://github.co...

  • Python Socket 编程示例 Echo Server

    简评:我们已经从「Python Socket 编程概览」了解了 socket API 的概述以及客户端和服务器的通...

  • Python socket套接字通信示例

    什么是socket? socket是一个模块, 又称套接字,用来封装 互联网协议(应用层以下的层)。socket可...

  • 网络编程

    python学习笔记-网络编程 socket编程: socket()函数:socket.socket([famil...

  • Python Socket 编程

    参考 python 官方socket文档 Python核心编程 Socket family AF_INET a p...

  • Socket之TCP相关

    客户端socket简单示例(以下都是针对TCP协议) 服务端sockt简单示例 客户端流程 客户端创建socket...

网友评论

      本文标题:python socket示例

      本文链接:https://www.haomeiwen.com/subject/pwjbzhtx.html