网络编程的循环收发数据

服务器
from socket import *
server = socket(AF_INET,SOCK_STREAM)#创建服务器对象,套接字家族,面向网络,选择tcp协议,udp(DGRAM)
HOST  = "127.0.0.1"#设置服务器ip
PORT = 8888#设置端口
BASE_SIZE = 1024#设置接收文件上限
server.bind((HOST,PORT))#绑定端口,ip
server.listen(5)#监听
while True:
    conn,addr = server.accept()#接收客户端请求,完成了三次挥手,获取客户端对象和地址
    while True:
        try:#监测客户端突然退出异常
            msg = conn.recv(BASE_SIZE)#接收信息
            if not msg:#linux系统客户端退出不会报错,一直发空包,故实现跨平台
                conn.close()
                break
            print(msg.decode("utf-8"))#打印接收信息,以什么编码存,以什么编码读
            conn.send(msg.upper())#给客户端回信息
        except ConnectionResetError:#客户端突然退出时,关闭客户端对象,重新进入阻塞接收客户请求
            conn.close()
            break#不加的话,内层循环msg = conn.recv会报错,因为套接字已关闭
server.close()


客户端
from socket import *
client = socket(AF_INET,SOCK_STREAM)#创建客户端对象,套接字家族,选择面向网络,选择tcp协议
HOST  = "127.0.0.1"
PORT = 8888
BASE_SIZE = 1024
client.connect((HOST,PORT))#链接服务器,向服务器发请求,完成三次握手
while True:
    msg = input(">>>:").strip().encode("utf-8")
    client.send(msg)#发送信息,只能发送bytes类型
    res = client.recv(BASE_SIZE)#接收服务器信息
    print(res.decode("utf-8"))
client.close()


udp循环输入
服务器
from socket import *
server  = socket(AF_INET,SOCK_DGRAM)#建立服务器,选择套接字家族和udp协议
HOST  = "127.0.0.1"
PORT = 8888
BASE_SIZE = 1024
server.bind((HOST,PORT))#绑定端口,ip
while True:
    msg,addr = server.recvfrom(BASE_SIZE)#直接接收,与tcp不同,tcp接收的是信息,udp接收的是信息和客户端地址
    print(msg.decode("utf-8"))
    server.sendto(msg.upper(),addr)#直接发送,需要加客户端地址

server.close()

客户端
from socket import *

client = socket(AF_INET, SOCK_DGRAM)
HOST = "127.0.0.1"
PORT = 8888
BASE_SIZE = 1024
while True:
    msg = input(">>:").strip().encode("utf-8")
    client.sendto(msg,(HOST,PORT))#发送时需加上服务器地址
    res,addr = client.recvfrom(BASE_SIZE)#接收服务器信息和服务器地址
    print(res.decode("utf-8"))


client.close()

tcp #好人协议,可靠性高,效率低
udp#可靠性低,不管对方收不收到,不管地址存不存在,效率高
posted @ 2018-12-25 23:11  robertzhou  阅读(875)  评论(0编辑  收藏  举报