Python3网络编程——TCP服务器和客户端

本文详细介绍了如何使用Python创建TCP服务器与客户端,实现基本的双向通信。服务器接收客户端消息,添加时间戳前缀后返回,客户端则接收并显示带时间戳的消息。文章深入解析了socket模块的使用,包括套接字的创建、绑定、监听及数据收发过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、创建 TCP 服务器:

'''
此脚本创建一个TCP服务器,
他接受来自客户端的消息,
然后将消息加上时间戳前缀并发送回客户端
'''

#!/usr/bin/env python

from socket import *
from time import ctime

HOST = ''  #对bind()方法的标识
PORT = 21567 #端口号
BUFSIZ = 1024
ADDR = (HOST , PORT)

#套接字
#socket_family : 套接字家族
#第一种套接字是 UNIX ,其家族名字为 AF_UNIX ,是基于文件的套接字
#第二种套接字是基于网络的,其家族名字为 AF_INET ,或者地址家族:因特网。目前使用最广泛
#AF_INET 支持 IPV4  ;  AF_INET6 支持 IPV6
#TCP : 传输控制协议
#创建TCP套接字,必须使用 SOCK_STREAM 作为 套接字类型(socket_type)
#创建套接字的语法:socket(socket_family , socket_type , proyocol=0)

tcpSerSock = socket(AF_INET, SOCK_STREAM)  #创建服务器套接字
tcpSerSock.bind(ADDR)                       #套接字与地址绑定
tcpSerSock.listen(5)                        #监听连接

while True:   #服务器无限循环
    print('waiting for connection ...')
    tcpCliSock, addr = tcpSerSock.accept() #接受客户端连接
    #addr = tcpCliSock
    print('...connected from:', addr)

    while True:  #进入对话循环中等待客户端发送消息
        data = tcpCliSock.recv(BUFSIZ)       #接受对话
        # 如果消息是空白的,则意味着客户端已退出,此时跳出对话循环,并关闭客户端连接
        if not data:
            break
        tcpCliSock.send(('[%s] %s' % (ctime(), data.decode())).encode())    #发送对话

    tcpCliSock.close()    #关闭客户端套接字
tcpSerSock.close()      #关闭服务器套接字

2、创建 TCP 客户端:

'''
此脚本创建一个客户端,
它提示用户输入发送到服务器端的消息,
并接收从服务器端返回的添加了时间戳前缀的消息,
然后将结果返回给用户
'''

#!/usr/bin/env python

from socket import *

HOST = 'localhost' #主机名
PORT = 21567       #端口号
BUFSIZ = 1024
ADDR = (HOST, PORT)

tcpCliSock = socket(AF_INET, SOCK_STREAM) #创建客户端套接字
tcpCliSock.connect(ADDR)                  #尝试连接服务器

while True:       #通信循环
    data = input('> ')
    if not data:  #用户没有输入,跳出循环
        break
    tcpCliSock.send(data.encode())  # 发送对话
    data = tcpCliSock.recv(BUFSIZ)  #接受对话
    if not data:   #服务器终止且对recv()调用失败,跳出循环
        break
    print(data.decode('utf-8'))

tcpCliSock.close() #关闭客户端套接字

3、代码中字符串的处理:

     关于发送对话的 send() 函数 ,里面的参数应该是字节型(bytes);

     输入函数input()返回值为字符型(str);

     print()函数的参数是字符型(str);

     python3中 字节型(bytes) 和 字符型(str) 的转换关系为:

                      

 

     对照可以理解代码中字节型和字符型之间的转换。

    python2 和 python3 关于字节型和字符型之间的转换处理不太一样

     (开始的时候特迷,一直报错,好久才总算明白过来)

4、运行结果:
客户端:

                     

服务器端:

                     

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值