- tcp服务器模型
ss=socket() #创建服务器套接字
ss.bind() #套接字与地址绑定
ss.listen() #监听连接
inf_loop: #服务器无限循环
cs=ss.accept() #接受客户端连接
comm_loop: #通信循环
cs.recv/cs.send() #对话(接收/发送)
cs.close() #关闭客户端套接字
ss.close() #关闭服务器套接字
- tcp客户端模型:
cs=socket() #创建客户端套接字
cs.connect() #尝试连接服务器
comm_loop: #通信循环
cs.send()/cs.recv() #对话(发送/接收)
cs.close() #关闭客户端套接字
服务器端:tsTserv.py
#!python3
# -*- coding: utf-8 -*-
import socket
from time import ctime
filename = 'info.txt'
ip_port = ('127.0.0.1',8081)
BUFSIZE = 1024
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #创建套接字
s.bind(ip_port)#绑定地址
s.listen(5)#监听链接
print('server listening...')
while True: #无限等待连接
conn,addr = s.accept() #接受客户端连接
conn.sendall('欢迎使用socket服务器TCP模式\n服务器功能:为客户端发送的文字加上时间戳'
.encode('utf8'))#发送欢迎信息
print(conn)
print(addr)
print('接到来自%s的连接'%addr[0])
while True: #通信循环,无限接受客户端信息
try:
msg = conn.recv(BUFSIZE) #接受消息的内容
# 当用户直接点击关闭按钮关闭客户端时,显示主机强制关闭的异常,否则服务器端会奔溃
except ConnectionResetError as e_crst:
print("Error: ",e_crst)
break
else:
if msg.decode('utf-8') == 'exit':
print("客户端主动断开连接!")
break
else:
print(msg.decode('utf-8'),type(msg))
with open(filename,'a',encoding='utf-8') as f_obj:
f_obj.write(msg.decode('utf-8') + '\n')
# conn.send(msg.upper())#服务端发送消息,将接收的字符串改为全大写
# 这里的括号很多,要注意整体性,发送的内容必须是.encode()
# 本行代码的功能:为接收的字符串加上时间戳,同时大写
conn.sendall(('[%s] %s'%(ctime(),msg.upper().decode('utf-8'))).encode())
conn.close()#关闭链接
s.close()#关闭套接字
客户端:tsTclnt.py
#!python3
# -*- coding: utf-8 -*-
import socket,os
ip_port=('127.0.0.1',8081)
BUFSIZE=1024
c=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
c.connect(ip_port)
except ConnectionRefusedError as eref: # 服务器未开启造成客户端无法连接
print("Error: ",eref)
# 为了防止运行时一闪而过,看不到错误信息
os.system("pause")
else:
server_info = c.recv(BUFSIZE).decode('utf8')# 接受服务端的欢迎消息
print(server_info)
while True:#通讯循环,客户端可以无限发消息
msg = input('>>:').strip()
if len(msg)==0:continue
try:
c.sendall(msg.encode('utf8'))#发送消息,utf8格式
except ConnectionResetError as erst: # 服务器主动关闭,导致连接被重置
print("Error ",erst)
# 为了防止运行时一闪而过,看不到错误信息
os.system("pause")
if msg == 'exit':
break
feedback = c.recv(BUFSIZE)#接受服务端消息
print(feedback.decode('utf8'))
c.close()#关闭套接字
参考资料:
- 【Python Socket 编程详细介绍(转)】http://www.cnblogs.com/pyyu/p/8631155.html
- 【网络编程第一步:时间戳----python3】https://blog.csdn.net/pear_home/article/details/77151459
- 【TCP服务器/客户端建立流程图】https://www.cnblogs.com/jcchoiling/p/5929640.html
- 【解决直接关闭客户端导致服务器端同时关闭的问题】http://blog.51cto.com/daimalaobing/2087349
- 【socketserver建立TCP服务器】http://www.liujiangblog.com/course/python/77