一 网络的原理

 1 客户端和服务端都是基于网路运行的。

 2 互联网协议:就是计算机界的英语

 3 五层协议:应用层,传输层,网络层,数据链路层,物理层这五层组成的

  物理层:internet:发送和接收电信号(高低电频)

  数据链路层:ethernet:一组电信号叫做数据帧,也叫数据报,数据报分为两个部分:报头(head)和数据(data)两部分。

    head包含的有:发送者/源地址:6个字节

           接收者/目标地址:6个字节

           数据类型:6个字节

   mac地址:每一个网卡在生产的时候就会产生一个mac地址。

   计算机的通信就是靠吼,也叫广播包,只限于局域网的使用。世界上的所有网络都是有很多的局域网组成的。

  网络层:ip地址:分为ipv4和ipv6.

    每一个IP地址都是有四个十进制数字组成

     ip协议:规定了网络的地址协议叫做ip协议,它定义的地址也叫做ip地址。

     子网地址:表示子网络特征的一个参数

     网关地址:为了跨子网的通信,能和外网之间进行通信。

      网关与网关之间的通信就叫做路由协议。

    mac地址:为了找到局域网络的位置。

    ip地址:为了确定子网的位置

    ARP协议:将局域网内的mac地址转成网关地址。

    mac地址和ip地址能找到世界上独一无二的一台机器。

  传输层:tcp协议和udp协议,每启动一个软件对应者一个端口。

   端口:确定软件在计算机上面的位置。

   ip地址加上端口:可以确定世界上一台计算机上的一个软件的位置。

  应用层:产生一个数据。

 发数据是一层一层的封包;收数据是一层一层的解包。

 tcp协议:首先发生链接的请求,建立好双向的链接,然后才能进行客户端和服务器端的传输,接收到数据以后回复确定后丢掉原有的数据再关闭链接。称为可靠协议。

 udp协议:不会建立连接,只有数据一发送出去,就会直接丢掉原有的数据。称为不可靠协议

二 socket模块

 1 socket模块就是一个接口,也是套接字模块。

  2 socket抽象层:就是一个编程接口。

   客户端/服务器架构

          即C/S架构

             在互联网中处处都是C/S架构,就相当我们是客户端,而服务端就是我们想要在电脑上查询的内容。

          为何学习socket一定要先学习互联网协议:

          1.首先:本节课程的目标就是教会你如何基于socket编程,来开发一款自己的C/S架构软件

          2.其次:C/S架构的软件(软件属于应用层)是基于网络进行通信的

          3.然后:网络的核心即一堆协议,协议即标准,你想开发一款基于网络通信的软件,就必须遵循这些标准。

          4.最后:就让我们从这些标准开始研究,开启我们的socket编程之旅    

  socket层                     

 3 socket模块的常用方法:

  AF_UNIX:一台机器直接的通信

  AF_INET:基于网路的通信

  socket.socket():获取套接字对象。

  listen:监听链接数量

  accept:等待客户端链接。

  connect:链接服务端

  socket.SOCK_STREAM:tcp协议,也是一个数据流

  send:发送消息

  recv:接收消息

  decode:解码

  encode:编码

  SO_REUSEADDR:重用ip和端口

服务器端:

import socket
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.bind(('127.0.0.1',8091))
phone.listen(5)
while True:
    conn,addr=phone.accept()
    while True:
        try:
            print(conn.recv(1024).decode('utf-8'))
            msg=input('>>>:')
            if not msg:continue
            conn.send(msg.encode('utf-8'))
        except Exception:
            break
    conn.close()
phone.close()

 客户端:

import socket
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.connect(('127.0.0.1',8091))
while True:
    msg=input('>>>')
    phone.send(msg.encode('utf-8'))
    if not msg:continue
    print(phone.recv(1024).decode('utf-8'))
phone.close()

 

服务端套接字函数
s.bind()    绑定(主机,端口号)到套接字
s.listen()  开始TCP监听
s.accept()  被动接受TCP客户的连接,(阻塞式)等待连接的到来

客户端套接字函数
s.connect()     主动初始化TCP服务器连接
s.connect_ex()  connect()函数的扩展版本,出错时返回出错码,而不是抛出异常

公共用途的套接字函数
s.recv()            接收TCP数据
s.send()            发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
s.sendall()         发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
s.recvfrom()        接收UDP数据
s.sendto()          发送UDP数据
s.getpeername()     连接到当前套接字的远端的地址
s.getsockname()     当前套接字的地址
s.getsockopt()      返回指定套接字的参数
s.setsockopt()      设置指定套接字的参数
s.close()           关闭套接字

面向锁的套接字方法
s.setblocking()     设置套接字的阻塞与非阻塞模式
s.settimeout()      设置阻塞套接字操作的超时时间
s.gettimeout()      得到阻塞套接字操作的超时时间

面向文件的套接字的函数
s.fileno()          套接字的文件描述符
s.makefile()        创建一个与该套接字相关的文件

       socket是什么  

      Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在

    Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

      所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。

posted on 2017-09-25 19:03  方少0410  阅读(180)  评论(0编辑  收藏  举报