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、运行结果:
客户端:
服务器端: