Python3网络编程TCP服务端/客户端

  • 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()#关闭套接字

参考资料:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值