Python基于socket实现TCP客户端和服务端

 更新时间:2022年04月11日 19:20:01   作者:程序员班长  
这篇文章主要介绍了Python基于socket实现的TCP客户端和服务端,以及socket实现的多任务版TCP服务端,下面相关操作需要的小伙伴可以参考一下

一、基于socket实现的TCP客户端

import socket
 
# 建立socket对象
# 参数一表示IP地址类型(AF_INET为IPV4,AF_INET6为IPV6),参数二表示连接的类型(SOCK_STREAM表示TCP形式,SOCK_DGRAM表示UDP形式)
client_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)  # 代表(ipv4,TCP)
 
# 连接服务器(元组中填目标ip地址和端口号)
client_socket.connect(('127.0.0.1',7777))
# 准备数据,需要转换为二进制数据,encode()中填写的是本地的字符串编码格式,mac、linux填utf-8
data='hello'.encode('gbk')
# 向服务器发送数据
client_socket.send(data)
# 接收数据,必须要指定接收数据的大小,单位字节,最大4096,即4k
recv_data=client_socket.recv(1024)
# 接收的数据要进行decode()解码,发送的时候用啥编码就填啥编码
recv_data=recv_data.decode('gbk')
print(recv_data)
# 关闭连接
client_socket.close()

二、基于socket实现的TCP服务端

import socket
# 建立socket对象
server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 如果服务器是一次性的,如果服务器结束后马上重新启动会出现一个错误,原因是地址和端口没有被释放
# OSError: [Errno 48] Address already in use
# 如果想马上释放,要设置一下socket选项
server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
# 绑定IP和端口,如果在绑定IP时没有给定IP,默认是绑定本地IP
server_socket.bind(('',7777))
# 设置监听(最大监听数),设置完后服务端会进入被动模式,不能主动连接客户端,只能被动地等待客户端的连接
server_socket.listen(128)
# 等待客户端连接,连接上后,函数会返回客户端的Socket对象和地址信息
client_socket,ip_port=server_socket.accept()
print(f'客户端{ip_port[0]}使用端口{ip_port[1]}连接成功...')
# 接收客户端数据
data=client_socket.recv(1024)
# 查看客户端发送的数据长度
if len(data)!=0:
    data=data.decode('gbk')
    print(f'客户端{ip_port[0]}使用端口{ip_port[1]}发送是数据是{data}')
else:
    print(f'客户端{ip_port[0]}使用端口{ip_port[1]}关闭了连接')
 
# 给客户端发送数据
data='你好'.encode('gbk')
client_socket.send(data)
# 关闭客户端
client_socket.close()
# 关闭服务端
server_socket.close()

三、socket实现的多任务版TCP服务端

import socket
import threading
 
 
def client_task(client_socket,ip_port):
    print(ip_port,'加入连接')
    # 持续接收客户端的消息
    while True:
        data=client_socket.recv(1024).decode('gbk')
        if len(data)!=0:
            print(f'客户端{ip_port[0]}发来的信息是{data}')
        else:
            print(f'客户端{ip_port[0]}已经断开连接')
            break
        send_data=('Hello--'+data).encode('gbk')
        client_socket.send(send_data)
 
 
if __name__ == '__main__':
    server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
    server_socket.bind(('',7777))
    server_socket.listen(128)
    # 循环接收客户连接
    while True:
        client_socket,ip_port=server_socket.accept()    # 会一直等待接收连接
        t_client=threading.Thread(target=client_task,args=(client_socket,ip_port))
        t_client.setDaemon(True)
        t_client.start()

1、面向对象版本

'''
基于socket实现的多任务版TCP服务端(面向对象)
'''
 
import socket
import threading
 
class SocketServer(object):
    def __init__(self, port):
        self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
        self.server_socket.bind(('', port))
        self.server_socket.listen(128)
 
 
    def start(self):
        # 循环接收客户连接
        while True:
            client_socket, ip_port = self.server_socket.accept()  # 会一直等待接收连接
            t_client = threading.Thread(target=self.client_task, args=(client_socket, ip_port))
            t_client.setDaemon(True)
            t_client.start()
 
    def client_task(self,client_socket, ip_port):
        print(ip_port, '加入连接')
        # 持续接收客户端的消息
        while True:
            data = client_socket.recv(1024).decode('gbk')
            if len(data) != 0:
                print(f'客户端{ip_port[0]}发来的信息是{data}')
            else:
                print(f'客户端{ip_port[0]}已经断开连接')
                break
            send_data = ('Hello--' + data).encode('gbk')
            client_socket.send(send_data)
 
 
if __name__ == '__main__':
   server_socket=SocketServer(7777)
   server_socket.start()

到此这篇关于Python基于socket实现TCP客户端和服务端的文章就介绍到这了,更多相关socket实现 TCP客户端和服务端内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python复制Word内容并使用格式设字体与大小实例代码

    Python复制Word内容并使用格式设字体与大小实例代码

    这篇文章主要介绍了Python复制Word内容并使用格式设字体与大小实例代码,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • python中使用websocket方法实例详解

    python中使用websocket方法实例详解

    WebSocket是一种网络通信协议,它在单个TCP连接上提供全双工的通信信道,本文我们将探讨如何在Python中使用WebSocket实现实时通信,感兴趣的朋友跟随小编一起看看吧
    2024-03-03
  • 如何学习Python time模块

    如何学习Python time模块

    在本篇文章里小编给大家分享的是关于Python time模块知识点及用法,需要的朋友们可以学习下。
    2020-06-06
  • Windows下Python的Django框架环境部署及应用编写入门

    Windows下Python的Django框架环境部署及应用编写入门

    这篇文章主要介绍了Windows下Python的Django框架环境部署及程序编写入门,Django在Python的框架中算是一个重量级的MVC框架,本文将从程序部署开始讲到hellow world web应用的编写,需要的朋友可以参考下
    2016-03-03
  • 简单了解python PEP的一些知识

    简单了解python PEP的一些知识

    这篇文章主要介绍了简单了解python PEP的一些知识,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • python实例小练习之Turtle绘制南方的雪花

    python实例小练习之Turtle绘制南方的雪花

    Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制了图形
    2021-09-09
  • Python爬虫利用多线程爬取 LOL 高清壁纸

    Python爬虫利用多线程爬取 LOL 高清壁纸

    这篇文章主要介绍了Python爬虫利用多线程爬取 LOL 高清壁纸,通过网站爬取每一个英雄的所有皮肤图片,全部下载下来并保存到本地,下文爬取过程感兴趣的朋友可以参考一下
    2022-06-06
  • Python中super().__init__()测试以及理解

    Python中super().__init__()测试以及理解

    __init__()一般用来创建对象的实例变量,或一次性操作,super()用于调用父类的方法,可用来解决多重继承问题,下面这篇文章主要给大家介绍了关于Python中super().__init__()测试及理解的相关资料,需要的朋友可以参考下
    2021-12-12
  • Python更新所有已安装包的操作

    Python更新所有已安装包的操作

    今天小编就为大家分享一篇Python更新所有已安装包的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • 使用Anaconda3建立虚拟独立的python2.7环境方法

    使用Anaconda3建立虚拟独立的python2.7环境方法

    今天小编就为大家分享一篇使用Anaconda3建立虚拟独立的python2.7环境方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06

最新评论