Python基于socket实现TCP客户端和服务端
作者:程序员班长 发布时间:2023-09-29 15:30:05
标签:Python,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()
来源:https://kantlee.blog.csdn.net/article/details/122665383


猜你喜欢
- 从MySQL 5.0.2开始,通过mysql_stmt_attr_set() C API函数实现了服务器端光标。服务器端光标允许在服务器端生
- 什么是 Python?自20世纪90年代初Python语言诞生至今,它已被逐渐广泛应用,Python 已然成为最受欢迎的程序设计语言之一,特
- SQL*DBA命令的安全性: 如果您没有SQL*PLUS应用程序,您也可以使用SQL*DBA作SQL查权限相关的命令只能分配给Oracle软
- 除了传递给日志记录函数的参数(如msg)外,有时候我们还想在日志输出中包含一些额外的上下文信息。比如,在一个网络应用中,可能希望在日志中记录
- 我们网站的静态资源(css、js和背景图片)和web应用程序是分开部署的,几乎所有的静态资源都部署在同一个应用下。最开始的网站
- 在python3爬虫中如何我们想要导入/导出Redis数据,就要安装使用RedisDump。RedisDump是一个用于Redis数据导入/
- 在python处理数据时,经常用到DataFrame和set。train=pd.read_csv('XXX.csv')#读取
- 本文实例讲述了go语言操作redis连接池的方法。分享给大家供大家参考。具体实现方法如下:func newPool(server, pass
- 2021年7月1日,官方正式发布了1.0Datatable版本。1.0版本支持windows和linux,以及Macos。 具体文档可以见:
- 工欲善其事必先利其器,一个好的工具能让起到事半功倍的效果,Python社区提供了足够多的优秀工具来帮助开发者更方便的实现某些想法,下面这几个
- 第一步,修改配置文件:vim /etc/mysql/my.cnf找到bind-address = 127.0.0.1改为:bind-addr
- 上篇文章给大家介绍过 Python脚本破解Linux口令(crypt模块) 感兴趣的朋友点击查
- Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形
- 一提起Google的产品,大多数人可能都会想到用一个词来形容,“简洁”。简单得来又实用,这就是Google的产品设计方针了。Jon Wile
- 在运行复杂的Python程序时,执行时间会很长,这时也许想提高程序的执行效率。但该怎么做呢?首先,要有个工具能够检测代码中的瓶颈,例如,找到
- 玩过电脑游戏的同学对于 * 肯定不陌生,但是你在用 * 的时候有没有想过如何做一个 * 呢?(当然用 * 不是那么道义哈,呵呵),那我们就来看一下如
- 前言python与C/C++不一样,它的变量使用有自己的特点,当初学python的时候,一定要记住“一切皆为对象,一切皆为对象的引用”这句话
- 本文实例讲述了Python面向对象程序设计之继承、多态原理与用法。分享给大家供大家参考,具体如下:相关内容:继承:多继承、super、__i
- 外部临时表通过CREATE TEMPORARY TABLE 创建的临时表,这种临时表称为外部临时表。这种临时表只对当前用户可见,当前会话结束
- 最近在用vue做项目,学习了不少东西,但是有时候光顾着做项目却忘记要找个时间来整理一下最近的一些学习新得,因为是新手,所以可能会有错误的地方