day31

           socket

一:什么是socket(套接字)

socket是一个模块,把复杂的tcp/ip协议隐藏在socket接口后面.  位置处于应用层与tcp/ip协议通信的中间软件抽象层,是一组接口,符合socket就相当于符合了tcp/ip协议.

                     socket在OSI模型中的位置

二.为什么需要socket

在osi模型中 若想实现通讯  需要打通七层结构  十分繁琐.

socket就是把传输层以下的协议封装起来,方便使用  只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。

三.socket中两种类型

1> 基于文件类型的  AF_UNIX

unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信

2>基于网络类型的   AF_INET

socket默认指定AF_INET   因为绝大多数是基于网络通讯的

四.Python中socket

主要分为客户端和服务器

服务器版本

# 当成一个买手机接听电话的过程
# 接收收据可能会出错 故放在try里尝试

import socket

server= socket.socket()  # 买手机

server.bind(('127.0.0.1',1999))  # 插卡 指定自己地址 和 端口 默认127.0.0.1是自身地址, 端口就是一个整数 注意:这时是元祖

server.listen() # 手机监听过程

while True:
   client_socket,client_addr = server.accept()  # 接电话
   buffer_size = 1024  # 设定缓存区域
   while True:
       try:
           data =client_socket.recv(1024)  # 收数据
           if not data:
               client_socket.close()  # 如果没有接收到数据 意味着对方下线 就关闭通道
               break
           print('收到了数据',data.decode('utf-8'))   # 接收到的都是二进制格式 需要转化
           client_socket.send(data.upper())  # 发数据
       except:  # 上面运行错了就运行下面的 上面没错就运行上面的下面的步骤不走了
           client_socket.close()   # # 如果对方下线了 那服务器也应该关闭对应的客户端对象
           break

 

客户端版本

#  相当于买手机通话
# 发送数据和接受数据容易出错 放在try里尝试

import socket

client = socket.socket()  # 买个手机
# 不需要插卡 是系统自动分配地址的 故不用插卡操作

client.connect(('127.0.0.1',1999))  # 连接到ip和端口

while True:
   msg = input('输入内容(q退出)').strip()
   if msg == 'q':
       break
   if not msg:
       continue
       # 发送的顺序要和服务器相反
   client.send(msg.encode('utf-8')) # 发送数据
   print('sending')
   data = client.recv(1024)  # 接受数据
   print(data.decode('utf-8'))

client.close()  # 运行完关闭通道

 

posted @ 2019-05-28 20:37  呼吸决定丶  阅读(85)  评论(0)    收藏  举报