day35 Pyhton 网络编程02

一内容回顾

  网络基础

  网络应用开发架构

    B/S架构   浏览器直接作为客户端的程序

    C/S架构

    B/S是特殊的C/S

  osi七层模型

    应用层  python代码   http  https  ftp  smtp

    socket

    传输层   port tcp/udp协议    四层交换机  四层路由器

    网络层  ip协议                     三层路由器  三层交换机

    数据链路层   mac地址  arp协议         网卡   二层交换机

    物理层

  tcp网络模型中

    arp协议-网络层

二.今日内容

  tcp协议

   代码

   协议特点

     三次握手

     为什么使用tcp协议

     四次挥手

   代码进阶  完善

  udp协议

    代码

    协议特点

    代码的进阶

tcp

import socket


sk = socket.socket()
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)  # 只在测试的时候添加,到正式的生产环境中应该去掉
sk.bind(('127.0.0.1',9000))
sk.listen()
while True:
    conn,addr = sk.accept()  # 接电话
    while True:
        msg =conn.recv(1024)
        print(msg.decode('utf-8'))
        message = input('>>>')
        conn.send(message.encode('utf-8'))
        if message == 'q':
            break
    conn.close()

sk.close()
# 起web服务 永远先启动服务端 
# server端 - 服务端
# 端口被占用的原因
# bind 已经向操作系统申请了一个9000的端口
# 如果9000没有被占用,那么就批准给你使用
# 直到sk.close的时候,这个端口才归还给操作系统
# 程序结束但是忘记close关闭,
# 那么操作系统就不能及时发现这个端口已经被归还
# 当你重启程序再次申请使用9000端口的时候
# 操作系统告诉你这个端口被占用了

# 网络上是否连通决定了两台电脑能否通信
# 和tcp建立了连接之后才能通信完全是两回事儿
# 可靠的协议

# 为什么要有tcp协议
    # 可靠
    # 全双工
    # 效率低
# 建立连接 : 三次握手
# 断开连接 : 四次挥手

# 社交软件
    # tcp就不适用了 udp协议
# 1.连接资源有限
# 同一时刻只能和一个客户端沟通
# 2.每一次数据的发送都需要一个回执来确保数据可靠
# 数据发送的效率不高

client

import socket

sk = socket.socket()

sk.connect(('127.0.0.1',9000))
while True:
    message = input('>>>')
    sk.send(message.encode('utf-8'))
    ret = sk.recv(1024)
    if ret == b'q':
        break
    print(ret.decode('utf-8'))
sk.close()

udp

server

import socket
sk = socket.socket(type = socket.SOCK_DGRAM)
addr = ('127.0.0.1',9000)
sk.bind(addr)

while True:
    # udp来说 第一个信息 必须是先接收
    msg,cli_addr = sk.recvfrom(1024)
    print(msg.decode('utf-8'))
    # message = input('>>>')
    sk.sendto('收到'.encode('utf-8'),cli_addr)


sk.close()

# 1 先把udp协议的cs调通
# 2 让cs之间通信多说点儿话
# 3 让多个client和server进行通信

# 在server端根本就不应该有input

client

import socket
sk = socket.socket(type = socket.SOCK_DGRAM)

# b'hello' == 'hello'.encode('utd-8')
sk.sendto(b'hello',('127.0.0.1',9000))
msg,ser_addr = sk.recvfrom(1024)
print(msg)
print(ser_addr)

sk.close()

 



posted @ 2018-12-03 16:29  Python张梦书  阅读(166)  评论(0编辑  收藏  举报