day 27

1.OSI七层协议
   互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层
osi七层是:应 表 会 传 网 数 物 (应用层,表示层,会话层,传输层,网络层,数据链路层,物理层)
tcp/ip 五层是: 应 传 网 数 物 (应用层,传输层,网络层,数据链路层,物理层)
tcp/ip四层: 应 传 网 网络接口层 (应用层,传输层,网络层,网络接口层:数据链路层和物理层)
 
物理层: 光缆,电缆,双绞线,无线电波
数据链路层:  以太网协议, 分成报头head和数据data两个部分,head里面包含mac地址(本机和另一条主机的mac地址),来进行广播
网络层: ip协议和arp协议
传输层: 建立端口到端口的通信(端对端通信), 端口范围 0-65535, 0-1023为系统占用端口.
127.0.0.1是本机程序间进行通信的地址,就是自己玩自己, 不和别人玩.
tcp协议: 面向连接,数据可靠,传输效率低,面向字节流,数据包长度没有限制
udp协议:面向无连接,数据不可靠,传输效率高,面向报文,总长度不超过65535字节.
在传输层有连接时候的三层握手和四次分手:简单的了解这意思. 
三次握手是:客户端发送给服务端一个请求,服务端返回给客户端一个信息,之后服务端确认信息在发给服务端,确立建立好连接.
四次分手是:客户端发送分手的请求给服务端,服务端接收到消息先给客户端发送一个信息等待处理客户端的信息,客户端信息处理完成之后在发送给客户端确认分手的信息,客户端在给服务端的一个确认信息.
2.tcp和udp协议下的socket的区别:
socket又称套接字,也是一个模块,我们通常用模块中已经实现的方法建立两个进程之间的连接和通信.
socket 套接字有两种:基于文件型和基于网络型
 1.基于文件类型的套接字家族: AF_UNIX
   unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据
 2.基于网络型的套接字家族:AF_INET(主要用的)
TCP:可靠的,面向连接的协议,传输效率低(发送缓存&接受缓存),面向字节流.使用TCP的应用;Web浏览器;文件传输程序.
UDP:不可靠的,无连接的服务,传输效率高(发送前延迟小),一对一,一对多,多对一,多对多,面向报文(数据包),尽量女里服务,无拥塞控制.使用UDP的应用:域名系统(DNS);视频流;IP语音(VoIP).
1.TCP协议下的socket通讯流程图片:
tcp服务端
import socket

server = socket.socket()
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 端口号可以多次使用
ip_port = ('127.0.0.1',8001)

server.bind(ip_port)
server.listen(3) ##在客户端连接后,还可以连接3个

while 1:
    conn,addr = server.accept()
    while 1:
        from_client_msg = conn.recv(1024)
        print('来自客户端的消息:',from_client_msg.decode('utf-8'))

        if from_client_msg.decode('utf-8') == 'byebye':
            break

        to_client_msg = input('来自服务端说:')
        conn.send(to_client_msg.encode('utf-8'))

tcp客户端

import socket
 
client = socket.socket()
client.connect(('127.0.0.1',8001))
 
while 1:
    to_server_msg = input('客户端说:')
    client.send(to_server_msg.encode('utf -8'))
    if to_server_msg == 'byebye':
        break
    from_sever_msg = client.recv(1024)
    print('来自服务端的消息:',from_sever_msg.decode('utf-8'))
 
client.close()
2.udp协议下的socket通讯流程图片:
udp一个服务端对应一个客户端的:
一个服务端:
import socket

udp_server = socket.socket(type=socket.SOCK_DGRAM)
ip_port = ('127.0.0.1',8002)
udp_server.bind(ip_port)

from_client_msg,client_add = udp_server.recvfrom(1024)

udp_server.sendto(b'gunduzi',client_add)
一个客户端:
import socket
udp_client = socket.socket(type=socket.SOCK_DGRAM)
ip_port =('127.0.0.1',8002)
udp_client.sendto(b'hello',ip_port)

from_server_msg,server_addr = udp_client.recvfrom(1024)
print(from_server_msg,server_addr)
udp一个服务端对应多个客户端的:
服务端:
import socket

udp_server = socket.socket(type=socket.SOCK_DGRAM)

ip_port =('127.0.0.1', 8002)

udp_server.bind(ip_port)

while 1:
    from_client_msg, client_addr = udp_server.recvfrom(1024)
    print(from_client_msg.decode('utf-8'),client_addr)

    to_client_msg = input('服务端说:')
    udp_server.sendto(to_client_msg.encode('utf-8'),client_addr) ##填写地址是区分一下你对应的端口
客户端:
import socket

udp_client = socket.socket(type=socket.SOCK_DGRAM)

ip_port = ('127.0.0.1',8002)

while 1:
    to_server_msg = input("客户端说;")
    udp_client.sendto(to_server_msg.encode('utf-8'), ip_port)
    from_server_msg,server_addr = udp_client.recvfrom(1024)
    print('服务端说:',from_server_msg.decode('utf -8'),server_addr)
这里我们列出两个简易描述socket各个参数和方法的图,
socket 类型:
socket各个方法的解释:
 
posted @ 2019-01-14 19:33  杨洪涛  阅读(194)  评论(0编辑  收藏  举报