网络编程socket (套接字tcp与udp得到简单)推演

 

 

半连接池==就是待客厅

基于tcp简单使用(有bug 向后推演)

# x='你好 '.encode('utf8')  #转换为bytes类型
# print(type(x))
# print(x.decode('utf8'))

# 购买手机
import socket
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#传输协议是通过网络的家族协议,需要参数  是基于tcp(流)或者是基于udp(报)传输协议
# 传输地址(拨通服务电话)
phone.connect(('127.0.0.1',8080))#传输给ip地址端口给服务器
# 发送信息(通信)
phone.send('你好啊涛哥'.encode('utf8'))#传输的bytes类型
# 接收信息
data=phone.recv(1024)
print(data.decode('utf8'))


#手机关机(必须回收资源的操作)
phone.close()
客户端
# import socket
# # 1,打买手机 (实例化)
# phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#数据流=>tcp协议    SOCK_DGRAM=》udb数据报
# #2 绑定手机卡      私网ip毫无意义(局域网通信)         (测试 回环 127.0.0.1)
# phone.bind(('127.0.0.1',8080))#0-65535端口,  1024以前的都被系统保留使用(慎用 )
# # 3.开机(监听状态)
# phone.listen(5)#backlog=?    半连接池大小
# #4.等待电话请求
# conn,client_addr=phone.accept()
#
# data=conn.recv(1024)


import socket
# 购买手机
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定手机卡
phone.bind(('127.0.0.1',8080))#需要IP 和端口 绑定

# 开机
phone.listen(5)#定义半连接池 大小
# 接收信息
conn,client=phone.accept()#第一个是建立的的管道 后一个是客户端ip和端口
# 接收信息
data=conn.recv(1024)#接收bytse类型的最大限度
print(data.decode('utf8'))#解码输出客户端传来的数据
conn.send('我已近接收到你发出的信息%s'.encode('utf8')%(data.upper()))#只能输出传达bytes类型

#(必选)关闭发送管道解决系统占用问题
conn.close()

#(可选)关闭接收手机发出的信息
# phone.close()
服务端

基于tcp循环通信(修正1)

# 购买手机
import socket
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#传输协议是通过网络的家族协议,需要参数  是基于tcp(流)或者是基于udp(报)传输协议
# 传输地址(拨通服务电话)
phone.connect(('127.0.0.1',8080))#传输给ip地址端口给服务器       循环在这上面会一直刷新所以接收不到值

while True:
    msg=input('请输入您需要发送的信息>>>: ').strip()
    if len(msg)==0:continue
    # 发送信息(通信)
    phone.send(msg.encode('utf8'))#传输的bytes类型           seng是给自己缓存发东西并不是一一对应的 recv也是在自己内存中 要数据
    # 接收信息
    data=phone.recv(1024)
    print(data.decode('utf8'))


#手机关机(必须回收资源的操作)
phone.close()
客户端
import socket
# 购买手机
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定手机卡
phone.bind(('127.0.0.1',8080))#需要IP 和端口 绑定

# 开机
phone.listen(5)#定义半连接池 大小 存放链接

# 接收信息
conn,client=phone.accept()#第一个是建立的的管道 后一个是客户端ip和端口
while True:
    # 接收信息
    try:                                                               # 异常处理
         data=conn.recv(1024)#接收bytse类型的最大限度
    except Exception :
        break
    print(data.decode('utf8'))#解码输出客户端传来的数据
    conn.send(data.upper())#上面已近解码

#(必选)关闭发送管道解决系统占用问题
conn.close()

#(可选)关闭接收手机发出的信息
phone.close()
服务端

基于tcp链接循环通信(修正2)

# 购买手机
import socket
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#传输协议是通过网络的家族协议,需要参数  是基于tcp(流)或者是基于udp(报)传输协议
# 传输地址(拨通服务电话)
phone.connect(('127.0.0.1',8080))#传输给ip地址端口给服务器       循环在这上面会一直刷新所以接收不到值

while True:
    msg=input('请输入您需要发送的信息>>>: ').strip()
    if len(msg)==0:continue
    # 发送信息(通信)
    phone.send(msg.encode('utf8'))#传输的bytes类型           seng是给自己缓存发东西并不是一一对应的 recv也是在自己内存中 要数据
    # 接收信息
    data=phone.recv(1024)
    print(data.decode('utf8'))


#手机关机(必须回收资源的操作)
phone.close()
客户端
# 服务端特点
# 一直提供服务
# 并发的 提供服务
import socket
# 购买手机
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定手机卡
phone.bind(('127.0.0.1',8080))#需要IP 和端口 绑定

# 开机
phone.listen(5)#定义半连接池 大小 存放链接

# 链接循环(解决上一次管道关闭后再  接收新用户管道连接) #秉承着服务端一直提供服务
while True:
    # 接收信息
    conn,client=phone.accept()#第一个是建立的的管道 后一个是客户端ip和端口

    # 通信:收\发信息
    while True:
        # 接收信息
        try:                                             # 管道通讯非正常中短 win中会出现异常所以不能使用if 只能使用异常处理
             data=conn.recv(1024)#接收bytse类型的最大限度

             if len(data)==0:break         #管道通讯非正常中短 在unix中会无限循环下去


        except Exception :
            break
        print(data.decode('utf8'))#解码输出客户端传来的数据
        conn.send(data.upper())#上面已近解码

    #(必选)关闭发送管道解决系统占用问题
    conn.close()

#(可选)关闭接收手机发出的信息      (鸡肋)
phone.close()
服务端

基于udp的通信

import socket
client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#udp数据报
while True:
    msg=input('请输入》》》:').strip()
    client.sendto(msg.encode('utf8'),('127.0.0.1',8080))            #需要知道公网地址
    data,sever_addr=client.recvfrom(1024)
    print(data.decode('utf8'))

client.close()
客户端
import socket
serve=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#udp数据报    是收一个集装箱(数据报就看起来是空但是打包后就不是空了)

serve.bind(('127.0.0.1',8080))   #服务端需要固定绑定在一个位置
while True:
    client,client_addr=serve.recvfrom(1024) #接收值  bytes类型  (需要限制一次最大字节数)
    serve.sendto(client.upper(),client_addr)    #上一级有按地址返回
    print(client.decode('utf8'))

serve.close()
服务端

 

posted @ 2021-04-10 22:30  欧阳锦涛  阅读(42)  评论(0)    收藏  举报
TOP 底部