码迷,mamicode.com
首页 > 其他好文 > 详细

TCP

时间:2021-06-07 20:37:46      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:接受   inf   break   encode   对象   bre   挥手   客户端连接   源码   

TCP :语言聊天,视频聊天,线下缓存视频,远程控制,发邮件

  • 需要先建立连接,然后通信

  • 占用连接、可靠(消息不会丢失)、面向连接实时性高、全双工的通信、慢

  • 建立连接 三次握手 全双工通信 SYN请求建立连接发送信息,ACK确认

    • 思路:

      1. 客户段向服务器发送SYN请求
      2. 服务端向客户段回复ACK并发送SYN请求
      3. 客户段接受到请求之后
        ,在回复ACK表示建立连接
      4. 由socket源码中客户段的connect + 服务端的accept完成
    • 技术图片

    • # 服务端
      import socket
      sk=socket.socket()
      sk.bind((‘127.0.0.1‘,1321)) #申请操作系统的资源
      sk.listen()   #等着别人连接
         #等待一个客户端连接
      
      conn,addr=sk.accept()  #conn里存储的是一个客户段和一个服务端连接的信息
      conn.send(b‘hello‘)  #服务端对客户端说话用send
      msg=conn.recv(1024)  #客户段跟服务端说话用recv
      print(msg)
      conn.close()    #挥手断开连接
      sk.close()     #归还申请操作系统的资源
      
      #客户段
      import socket
      sk=socket.socket()
      sk.connect((‘127.0.0.1‘,1321)) #绑定服务端方法地址,此处是元组
      mag=sk.recv(1024)   #接受信息
      print(mag)
      sk.send(b‘shoudao‘)  #回信息
      sk.close()        #关闭对话
      
    • tcp server端与多个client端连接,发送多条信息,发Q断开server端与client端连接

      • 服务端
      import socket
      #调用socket对象
      sk=socket.socket()
      # 申请操作系统的资源
      sk.bind((‘127.0.0.1‘,7899))
      # 等待客户端连接
      sk.listen()
      while True:  #可以与多个客户端建立连接
          # 同意建立连接
          conn,addr=sk.accept()
          print(conn)
          while True:   #可以接受多个客户端信息
              # 接受客户端信息
              msg=conn.recv(1024).decode(‘utf-8‘)
              if msg.upper()==‘Q‘:break
              print(msg)
              #向客户段发送信息
              msg_seng=input(‘向客户端发送信息:‘)
              conn.send(msg_seng.encode(‘utf-8‘))
              if msg_seng.upper() == ‘Q‘: break
              # 挥手断开连接
          conn.close()
          # 归还操作系统的资源
      sk.close()
      
      • 客户端
      import socket
      #调用socket()对象
      sk=socket.socket()
      # 绑定服务端方法地址,建立连接
      sk.connect((‘127.0.0.1‘,7899))
      while True:
          # 向服务端发送信息
          msg_seng=input(‘向服务端发送信息:‘)
          sk.send(msg_seng.encode(‘utf-8‘))
          if msg_seng.upper() == ‘Q‘: break
          # 接受服务端的信息
          msg=sk.recv(1024).decode(‘utf-8‘)
          if msg.upper()==‘Q‘:break
          print(msg)
      sk.close()
      
  • 断开连接 四次挥手

    • 思路:
      1. 服务端向客户段发送FIN请求断开连接
      2. 客户段接受到请求后回复ACK确认
      3. 客户段向服务端发送FIN请求断开连接
      4. 服务端接受到请求后回复ACK并断开连接
      5. 由socket源码中客户端的close+服务端的clos完成的
    • 技术图片
  • 为什么建立连接是三次,断开连接是四次?

    • 因为不确定在断开连接的时候数据时候全部发送完成,所以要发四次

TCP

标签:接受   inf   break   encode   对象   bre   挥手   客户端连接   源码   

原文地址:https://www.cnblogs.com/xiaoxiannvdbky/p/14858396.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!