1) 创建TCP服务器
创建通用TCP服务器的伪代码:
ss = socket() # create server socket(创建服务器套接字)
ss.bind() # bind socket to address(套接字与地址绑定)
ss.listen() # listen for connections(监听连接)
inf_loop: # server infinite loop(服务器无限循环)
cs = ss.accept() # accept client connection(接受客户端连接)
comm_loop: # communication loop(通信循环)
cs.recv()/cs.send() # dialog (receive/send)(对话(接收 / 发送))
cs.close() # close client socket(关闭客户端套接字)
ss.close() # close server socket # 关闭服务器套接字 # (可选)
2) 创建TCP客户端
创建通用TCP客户端的伪代码:
cs = socket() # create client socket(创建客户端套接字)
cs.connect() # attempt server connection(尝试连接服务器)
comm_loop: # communication loop(通信循环)
cs.send()/cs.recv() # dialog (send/receive)(进行对话(发送/接收))
cs.close() # close client socket(关闭客户端套接字)
3) 执行TCP服务器和客户端
在任何客户端试图连接之前,首先启动服务器。
4)实际应用
tsTserv.py
# 使用*可以使代码更简洁
from socket import*
from time import ctime
# 空表示可以接收多有有效ip地址的连接请求,bind()函数可以绑定在所有有效的ip地址上
HOST=''
# 随机选的一个端口号,必须大于1024
PORT=21567
# 每次读取的数据量
BUFSIZ=1024
# HOST与PORT共同组成了ADDR
ADDR=(HOST,PORT)
# 创建了一个基于网络的、使用TCP的socket。AF_INET表示是基于网络的socket编程,SOCK_STREAM表示是TCP通信
tcpSerSock=socket(AF_INET, SOCK_STREAM)
# socket与ADDR绑定到一起,表示socket可以在这个PORT上接收HOST处的连接请求。还需要开始监听
tcpSerSock.bind(ADDR)
# 开始监听,5表示同时最多可以有5个连接进来。开始等待连接到来
tcpSerSock.listen(5)
# 服务器循环,表示一直等待
while True:
print("waiting for connecting...")
# 如果有连接进来,则生成一个新的socket: tcpCliSock,并得到源的地址
(tcpCliSock,addr) = tcpSerSock.accept()
print('...connected from: ',addr)
# 开始接收数据,并处理
while True:
# 接收数据,并转化成utf-8格式,原始的是bytes格式
data=tcpCliSock.recv(BUFSIZ).decode('utf8')
# 如果没有数据了,则跳出while循环,等待下一次连接到来
if not data:
break;
# 向console输出,增加了当前的时间
print('[%s] %s'%(ctime(),data))
# 将数据转换成bytes型,再send回去
tcpCliSock.send(('[%s] %s'%(ctime(),data)).encode('utf8'))
# 关闭tcpCliSock,一次通信在服务器端的工作完成,继续等待下一次连接的到来
tcpCliSock.close()
#不会被执行到,可以加个try-except进去,让程序更友好的退出
tcpSerSock.close()
tsTclnt.py
# 使用*可以使代码更简洁
from socket import*
# 由于是在同一台电脑上,所以可以写localhost(或127.0.0.1),如果是在两台电脑上,则这儿要写server的ip地址
HOST='localhost'
# 端口号必须和服务器的一样
PORT=21567
BUFSIZ=1024
# 服务器的ADDR
ADDR=(HOST,PORT)
# 创建客户端套接字
tcpCliSock=socket(AF_INET,SOCK_STREAM)
# 连接到服务器,成功后,服务器端输出'...coonnected from...'
tcpCliSock.connect(ADDR)
while True:
data=input('> ')
# 输入为空,则跳出while循环
if not data:
break;
tcpCliSock.send(data.encode('utf-8'))
data=tcpCliSock.recv(BUFSIZ)
if not data:
break;
print(data.decode('utf8'))
tcpCliSock.close()