zoukankan      html  css  js  c++  java
  • 网络编程之socket

    TCP 协议:可靠的,面向连接的协议  牺牲效率 确保安全    (支持全双工:双方都可以接收发送信号)

    UDP 协议:不可靠的非连接协议  视频 音频 通话等

    ARP协议:通过IP去获得Mac地址

    通过IP+port(端口)就能确定唯一的pc和唯一的应用程序服务

    套接字socket作用于应用层传输层之间

    ****************************************************************************************

    【应用层】应用软件的交互层

             socket所在区域   两层之间

    【传输层】TCP和UDP协议所在层

    【网络层】IP协议作用范围    --------> 路由器      

    【数据链路层】Mac地址范围  -------->交换机     arp协议获取IP对应的Mac地址

    【物理层】网线网卡 介质范围

    ****************************************************************************************

    套接字的简单c/s 模拟代码:

    server:

     1 import socket
     2 sk=socket.socket()           #买一个手机
     3 sk.bind(('127.0.0.1',8080))    #绑定一个电话卡     接收的参数为元组
     4 sk.listen()          #监听电话
     5 
     6 conn,addres=sk.accept()     #接听电话 来电显示地址
     7 ret=conn.recv(1024)    #听对方说话内容  1024字节
     8 print(ret.decode('utf-8'))
     9 conn.send(bytes('客户端连接成功了?'.encode('utf-8')))    #回答对方
    10 
    11 conn.close()     #断开连接 挂电话
    12 sk.close()       #关机

    client:

    1 import socket
    2 sk=socket.socket()       #买手机
    3 sk.connect(('127.0.0.1',8080))          #拨号    接收的参数为元组
    4 
    5 sk.send(bytes('我要连接你了,服务器'.encode('utf-8')))     #讲话
    6 ret=sk.recv(1024)         #收听对方讲话
    7 print(ret.decode('utf-8'))
    8 sk.close()               #关机

    需要注意:数据在网络传输必须为字节byte,中文传输前必须encode ,收到后必须decode解码 才能正确显示中文

    必须先启动服务器,才能启动客户端去访问服务器,否则会报错

    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

    客户端与服务器的多次会话请求以及断开实现:

    server:

     1 import socket
     2 sk=socket.socket()  #买手机
     3 sk.bind(('127.0.0.1',8080))   #绑卡
     4 sk.listen()  #监听
     5 
     6 conn,address=sk.accept()   #建立连接通道
     7 while True:
     8     ret=conn.recv(1024).decode('utf-8')
     9     print(ret)
    10     if ret=='bye':
    11         conn.send(b'bye')
    12         break
    13 
    14     s_talk=input('请输入会话...')
    15     conn.send(bytes(s_talk.encode('utf-8')))
    16 
    17 conn.close()
    18 sk.close()

    client:

     1 import socket
     2 sk=socket.socket()
     3 sk.connect(('127.0.0.1',8080))
     4 
     5 while True:
     6     c_talk = input('请输入会话内容')
     7     sk.send(bytes(c_talk.encode('utf-8')))
     8     ret=sk.recv(1024).decode('utf-8')
     9     print(ret)
    10     if ret=='bye':
    11         sk.send(b'bye')
    12         break
    13 
    14 sk.close()

    **********************************UDP协议****************************************

    server:

    1 import socket
    2 sk=socket.socket(type=socket.SOCK_DGRAM)    #数据报文
    3 sk.bind(('127.0.0.1',8080))
    4 
    5 msg,addr=sk.recvfrom(1024)           #接收数据
    6 print(msg.decode('utf-8'))
    7 sk.sendto(b'hello',addr)            #发送数据
    8 
    9 sk.close()     #关闭连接

    client:

    1 import socket
    2 sk=socket.socket(type=socket.SOCK_DGRAM)
    3 ip_port=('127.0.0.1',8080)
    4 sk.sendto(b'hi server',ip_port)
    5 ret,addr=sk.recvfrom(1024)
    6 print(ret.decode('utf-8'))
    7 
    8 sk.close()

    UDP协议不需要连接 ,但是收发数据都需要带上地址

  • 相关阅读:
    Java关键字:transient,strictfp和volatile简介
    freemarker 数字格式化函数
    使用 BeanCopier 复制对象
    扩展Smack Message
    JavaScript 中2个等号与3个等号的区别
    Eclipse 3.5使用dropins的插件安装方式
    常见的HTTP 状态代码
    使用python操作FTP上传和下载
    Python操作redis
    Ubuntu14.04安装redis和简单配置
  • 原文地址:https://www.cnblogs.com/wen-kang/p/9387800.html
Copyright © 2011-2022 走看看