TCP

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

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

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

  • 注意事项:

    • 端口不能重名
    • 必须先起服务端,在起客户段
  • 建立连接 三次握手 全双工通信 SYN请求建立连接发送信息,ACK确认

    • 思路:

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

    • 思路:
      1. 服务端向客户段发送FIN请求断开连接
      2. 客户段接受到请求后回复ACK确认
      3. 客户段向服务端发送FIN请求断开连接
      4. 服务端接受到请求后回复ACK并断开连接
      5. 由socket源码中客户端的close+服务端的clos完成的
  •   # 服务端
      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()
    
  • 为什么建立连接是三次,断开连接是四次?

    • 因为不确定在断开连接的时候数据时候全部发送完成,所以要发四次
posted @ 2021-06-07 12:28  刘家小仙女  阅读(44)  评论(0编辑  收藏  举报