脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - Python基于socket实现TCP客户端和服务端

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

2022-11-25 11:53程序员班长 Python

这篇文章主要介绍了Python基于socket实现的TCP客户端和服务端,以及socket实现的多任务版TCP服务端,下面相关操作需要的小伙伴可以参考一下

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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服务端

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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服务端

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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、面向对象版本

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
'''
基于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客户端和服务端内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://kantlee.blog.csdn.net/article/details/122665383

延伸 · 阅读

精彩推荐