Python多线程实现客户端-服务器模式TCP通信

需要模块:threading,socket-client-server

先看运行效果

在这里插入图片描述
这里是你每次的输入都会被客户端读到,然后发送给服务器,服务器接收到后,回送接收到的信息并附加上时间戳,客户端接收到回送消息后打印消息到屏幕上。

上面的图片明显可以看到每个消息下面都有一个附加上时间的相同的消息,这个消息就是服务器发送回来的消息,没有带时间的消息就是我们输入的消息,也是客户端发送给服务器的消息


下面上代码

服务器类的代码,请单独将它作为一个文件,命名为_server.py

#服务器类

from socket import *;        #套接字模块
from time import ctime;      #时间模块,用来打印时间
import threading;            #线程模块

class _Server(threading.Thread):
    def __init__(self, Addr, BufSize):                        #Addr:服务器ip地址
        threading.Thread.__init__(self);                      #初始化线程
        self.tcpSerSock=socket(AF_INET,SOCK_STREAM);          #AF_INET代表生成面向网络的套接字,SOCK_STREAM代表TCP类型
        self.tcpSerSock.bind(Addr);                           #将服务器ip地址与套接字绑定
        self.tcpSerSock.listen(5);                            #设置该服务器最多建立5个TCP连接
        self.BufSize=BufSize;                                 #设置缓冲区大小
    def run(self):                                            #多线程的启动函数,只能命名为run()
        while True:
            print("waiting for connection...");
            tcpCliSock,addr=self.tcpSerSock.accept();         #accept()函数接收到客户端连接申请后,将切换消息,从而让出总线,tcpCliSock就是接线员,addr是客户端的IP地址
            print('...connected from:',addr);

            while True:
                data=tcpCliSock.recv(self.BufSize);           #客户端发来的消息存入data中
                if not data:
                    break;
                tcpCliSock.send(str('['+ctime()+']  ').encode('utf-8')+data);#将客户端发送的消息回送给客户端,并附加上时间戳,表示服务器已经收到

            tcpCliSock.close();                               #关闭接线员通道
        tcpSerSock.close();                                   #关闭TCP连接


客户端代码,与服务器的代码差不多,就不注释了,命名为_client.py

from socket import *;
from time import ctime;
import threading;

class _Client(threading.Thread):
    def __init__(self,Addr,BufSize):
        threading.Thread.__init__(self);
        self.tcpCliSock=socket(AF_INET,SOCK_STREAM);
        self.tcpCliSock.connect(Addr);
        self.BufSize=BufSize;

    def run(self):
        while True:
            data=input('>');
            if not data:
                break;
            self.tcpCliSock.send(data.encode('utf-8'));
            data=self.tcpCliSock.recv(self.BufSize);
            if not data:
                break;
            print(data.decode('utf-8'));
        self.tcpCliSock.close();

main代码,请保证这个是主函数文件

from _server import _Server;
from _client import _Client;
import threading;

from socket import *;
from time import ctime;


server_Host='';                       #服务器地址,由于我们是在同一台电脑模拟客户端和服务器通信,所以不必填服务器的地址
server_Port=21567;                    #服务器端口号,最好选择非周知端口号
server_BufSize=1024;                  #缓冲区大小,单位是字节
server_Addr=(server_Host,server_Port);#生成服务器地址,主机地址加上端口号

client_Host='localhost';              #客户端类似,不再注释,localhost代指127.0.0.1,你也可以直接写127.0.0.1,这个是代指本机IP地址,
client_Port=21567;
client_Bufsize=1024;
client_Addr=(client_Host,client_Port);

Ser=_Server(server_Addr, server_BufSize);  #生成一个服务器对象
Cli=_Client(client_Addr,client_Bufsize);   #生成一个客户端对象

#多线程并发运行
Cli.start();
Ser.start();

编译环境:Visual Studio Python 3.6
参考书籍:《Python核心编程》

发布了9 篇原创文章 · 获赞 2 · 访问量 665

猜你喜欢

转载自blog.csdn.net/qq_41195985/article/details/104066856