什么是socket

-- 通过各种协议,发送和接收数据,实现网络通信

-- 在python3中,网络发送只能发二进制数据

OSI七层模型是什么?

应用

表示

会话

传输

网络              ip地址

数据链路       mac地址

物理层

什么是TCPUDP协议?

-- TCP           -- 面向连接,三次握手,4次断开

-- UDP           -- 面向无连接

对于socket通信的两个通信端有哪些工作?

客户端:

-- 导入 socket

-- 声明协议 TCP

-- 连接(远程ip和端口)

-- 发送数据 send

-- 关闭 close

服务端:

-- 导入 socket

-- 声明协议 TCP

-- 绑定监听(ip,端口号)

-- 等待 accept()

-- 接收 recv()

- 发送 send

什么是地址簇?

-- .AF_UNIX                              -- unix本机进程进行通信

-- .AF_INET  IPV4                     -- ipv4

-- .AF_INET6  IPV6                   -- ipv6

socket有哪些类型?

-- .SOCK_STREAM                          -- TCP

-- .SOCK_DGRAM                           -- UDP

-- .SOCK_RAM                                -- 修改和构造ip地址头,伪造ip地址

如何实现socket通信?

-- 不能发送空数据,服务器和客户端都需要对空数据进行判断,空数据来源于客户端输入空数据和服务器端出现错误

服务端:

 import socket      

 server = socket.socket()                 # 声明协议,默认ipv4,tcp协议

 server.bind(('localhost',6969))          # 绑定监听端口

 server.listen(5)                         # 开始监听,最大支持5个挂起

 con, addr = server.accept()              # 获得监听实例和来源ip和端口

 data = con.recv(1024)                    # 接收数据,1024是发送大小,最多8192,不准确

 con.send(data.upper())                   # 发送数据

 server.close()                           # 关闭服务,理论上服务是永久运行下去的

客户端:

 import socket

 client = socket.socket()                      # 声明协议,返回对象

 client.connect(('localhost',6969))            # 连接服务器

 client.send(b'hello word!')                   # 发数据

 data = client.recv(1024)                      # 收数据

 client.close()                                # 关闭客户端

-- 以上只是实现了一次对话,如何实现客户端多次和服务端进行交互?

服务器端:

 import socket

 client = socket.socket()                      # 声明协议,返回对象

 client.connect(('localhost',6969))            # 连接服务器

 while True:                                  # 循环接收一个客户端请求

 client.send(b'hello word!')                   # 发数据

 data = client.recv(1024)                      # 收数据

 client.close()                                # 关闭客户端

客户端:

 import socket

 client = socket.socket()

 client.connect(('localhost',6969))

 while True:                                  # 循环发

   data_1 = input('>>>:').strip()            # 用户输入

     if len(data_1) == 0:                      # 输入为空时候,重新输入

       continue

     client.send(data_1.encode('utf-8'))

     data = client.recv(1024)

     print(data.decode('utf-8'))

 client.close()

以上只实现了和一个客户端交互,如何和多个客户端进行交互?

服务器端:

 import socket

 server = socket.socket()

 server.bind(('localhost',6969))
 server.listen(5)

 while True:
        con, addr = server.accept()
        while True:
             try:
                 data = con.recv(1024)
             except ConnectionResetError as e:        # 远程连接断开异常
                   break
             con.send(data.upper())
             print(data)
 server.close()

以上实现了和多个连接,但是多个客户端会进入排队状态

假如发送大数据,如何解决传送大数据和黏包问题?

服务器端

    -- 先打开文件,读取进来

    while True:                                # 进行下面步骤循环

      -- 发送文件的大小 len(文件),整数不能encode,先str转换成字符串

      -- 收到客户端的答应,发送数据一份数据

      -- .sendall()          --自动循环发送大文件

      -- 接收客户端收完数据答应,准备发送下一份数据

客户端:

-- 接收到服务器发来的文件大小数据,返回一个数据说,我收到了

-- 循环进行接收(初始化空数据长度,然后大小与原数据进行比较)

黏包文件解决?

-- 最主要是最后一次收的时候,多收了

-- low方法1:      time.sleep()

-- 高级方法2:

  服务器端:

    两个send之间加一个 client_ack = conn.recv(1024)          一种阻塞状态,接收客户端收完指令,确定客户端是否收完

客户端:

收完之后,返回指令给客户端

  -- 高级方法3: --永远不可能黏包

服务器端:

只发送文件大小

客户端:

只接收文件大小的数据

如何做到?

while 收到文件大小  < 文件大小:          # 确定把文件收完,至少多收1次

if 文件大小 – 收到文件大小 > 1024      # 大于1024至少收一次

size = 1024                                      # 动态接收

else:

size = 文件大小 – 收到文件大小     # 只接收剩余大小的文件

data = client.recv(size)                     # 通过上面的判断变成动态size

如何进行md5验证?

-- 只能验证二进制数据

服务器端:

 import hashlib                      # 导入hash模块
 import socket

 server = socket.socket()
 server.bind(('localhoust', 9999))   # 绑定端口
 server.listen()

 while True:
     conn, addr = server.accept()    # 等待连接
     f = open('test.text','rb')      # 打开文件
     conn.send(str(len(f)).encode()) # 发送文件大小
     data = conn.recv()              # 等待收到确认提示
     m = hashlib.md5()       # 实例md5对象
     for line in f:          # 一行一行读文件
         m.update(line)      # 新加数据,进行md5值生成
         conn.send(line)     # 一行一行发
     f.close()
     conn.send(m.hexdigest().encode('utf-8'))  # 发送最后文件的md5

ftp server    

服务器端:

  -- 读取文件名

  -- 检查文件是否存在

  -- 打开文件

  -- 计算文件大小和md5值,并发送给客户端

  -- 发送文件给客户端

  -- 等待客户端确认

  -- 开始边读边发

计算大小的坑:

中文计算:

>>> a = '嘻嘻'

  >>> len(a)

  2

  >>> len(a.encode())

  6

  >>> len(a.encode('utf-8'))

  6

中文字符串转换成bytes类型,utf-8中每个中文占用3个字节

什么是socketserver

-- 一种更上层对socket的封装,简化socket程序编写

socketserver的框架是什么?

imoprt socketsever

class 处理请求类名a(socketserver.BaseRequestHandler):

      # 继承socketserver中BaseRequestHandler基础类

def handle(self):                                  # 重写BaseRequestHandler中handle方法

self.data = self.request.recv(1024)         # 等待收数据

print(self.client_addr)                              # 打印clinet的ip地址和端口号

self.request.send(self.data.upper())        # 发送处理后的数据给客户端

if __name__ == ‘__main__’:

HOST, PORT = ‘IP地址’, 端口号                   # 绑定监听端口

server = socketserver.TCPServer((HOST, PORT), 处理请求类名a)

server.server_forever()                                    # 服务永久运行下去

如何进行多线程处理请求?

server = socketserver.TCPServer((HOST, PORT), 处理请求类名a)

改成:

server = socketserver. ThreadingTCPServer ((HOST, PORT), 处理请求类名a)

python_20_socket的更多相关文章

随机推荐

  1. JQuery.lazyload 图片延迟加载

    1.引入  jquery.lazyload.js 2. 延时加载的方式 <script type="text/javascript">  $(function() {  ...

  2. WPF自定义Window样式(2)

    1. 引言 在上一篇中,介绍了如何建立自定义窗体.接下来,我们需要考虑将该自定义窗体基类放到类库中去,只有放到类库中,我们才能在其他地方去方便的引用该基类. 2. 创建类库 接上一篇的项目,先添加一个 ...

  3. IntelliJ IDEA运行慢解决方法

    今天在用IntelliJ IDEA运行项目时速度奇慢,上网找了一些解决方法,记录一下以供参考. 修改配置文件 IntelliJ IDEA\bin下idea.exe.vmoptions -server ...

  4. pl/sql command window 初步接触

    pl/sql command window基本操作 PL/SQL Developer应用两年了,今天第一次应用command window. command window类似于sqlplus窗口: 1 ...

  5. SQL Server-聚焦sp_executesql执行动态SQL查询性能真的比exec好?

    前言 之前我们已经讨论过动态SQL查询呢?这里为何再来探讨一番呢?因为其中还是存在一定问题,如标题所言,很多面试题也好或者有些博客也好都在说在执行动态SQL查询时sp_executesql的性能比ex ...

  6. mysql 半同步复制 插件安装以及测试

    mysql Server version:         5.5.18-log MySQL Community Server (GPL)   1.安装插件 检查mysql是否支持动态添加插件: ro ...

  7. 加速scp传输速度

    当需要在机器之间传输400GB文件的时候,你就会非常在意传输的速度了.默认情况下(约125MB带宽,网络延迟17ms,Intel E5-2430,本文后续讨论默认是指该环境),scp的速度约为40MB ...

  8. Coursera课程 Programming Languages, Part C 总结

    碎言碎语 和前面的 ML 和 Racket 感觉明显不一样了,一边学着一边觉得这真是一门奇怪的语言,有着各种奇怪的语法,不过真的算是一个奇妙的体验(相比前面的两门语言,Ruby 的学习资源多了不少). ...

  9. Zabbix实战-简易教程--动作(Actions)--自动注册

    一.概述 之前已经讲述了自动发现功能,自动注册和自动发现非常类似,但是比自动发现更精确.因为自动注册,是在Agent上自定义元数据,然后Agent将元数据发送给server进行匹配,如果匹配一致,则进 ...

  10. 微信第三方全网发布接入检测(PHP)

    官方文档  https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&ve ...