<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      網絡編程之Socket套接字介紹,套接字工作流程,基于TCP協議的套接字程序

      為何學習socket套接字一定要先學習互聯網協議:

      1.首先:要想開發一款自己的C/S架構軟件,就必須掌握socket編程
      2.其次:C/S架構的軟件(軟件屬于應用層)是基于網絡進行通信的
      3.然后:網絡的核心即一堆協議,協議即標準,你想開發一款基于網絡通信的軟件,就必須遵循這些標準。

      socket套接字是什么

      Socket是應用層與TCP/IP協議族通信的中間軟件抽象層,它是一組接口。在設計模式中,Socket其實就是一個門面模式,它把復雜的TCP/IP協議族隱藏在Socket接口后面,對用戶來說,一組簡單的接口就是全部,讓Socket去組織數據,以符合指定的協議。
      所以,無需深入理解tcp/udp協議,socket已經封裝好了,只需要遵循socket的規定去編程,寫出的程序自然就是遵循tcp/udp標準的。

      基于文件類型的套接字家族的名字:AF_UNIX

      基于網絡類型的套接字家族的名字:AF_INET

      套接字工作流程

      基于TCP套接字通信的流程圖:

      img

      先從服務器端說起。服務器端先初始化Socket,然后與端口綁定(bind),對端口進行監聽(listen),調accept阻塞,等待客戶端連接。在這時如果有個客戶端初始化一個Socket,然后連接服務器(connect),如果連接成功,這時客戶端與服務器端的連接就建立了。客戶端發送數據請求,服務器端接收請求并處理請求,然后把回應數據發送給客戶端,客戶端讀取數據,最后關閉連接,一次交互結束

      1、socket套接字的用法:

      import socket
      socket.socket(socket_family,socket_type,protocal=0)
      socket_family 可以是 AF_UNIX 或 AF_INET。socket_type 
      			  可以是 SOCK_STREAM 或 SOCK_DGRAM。protocol 一般不填,默認值為 0。
      
      獲取tcp/ip套接字
      tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      
      獲取udp/ip套接字
      udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
      
      由于 socket 模塊中有太多的屬性。我們在這里破例使用了'from module import *'語句。
      使用 'from socket import *',我們就把 socket 模塊里的所有屬性都帶到我們的命名空
      間里了,這樣能 大幅減短我們的代碼。
      例如tcpSock = socket(AF_INET, SOCK_STREAM)
      

      2、socket套接字函數

      服務端套接字函數
      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()        創建一個與該套接字相關的文件
      

      基于TCP的套接字

      tcp是基于鏈接的,必須先啟動服務端,然后再啟動客戶端去鏈接服務端

      tcp服務端

      ss = socket()  # 創建服務器套接字
      ss.bind()   # 把地址綁定到套接字
      ss.listen()  # 監聽鏈接
      inf_loop:        # 服務器無限循環
          cs = ss.accept() # 接受客戶端鏈接
          comm_loop:   # 通訊循環
              cs.recv()/cs.send() # 對話(接收與發送)
          cs.close()    # 關閉客戶端套接字
      ss.close()       # 關閉服務器套接字(可選)
      

      tcp客戶端

      1 cs = socket()    # 創建客戶套接字
      2 cs.connect()    # 嘗試連接服務器
      3 comm_loop:        # 通訊循環
      4     cs.send()/cs.recv()    # 對話(發送/接收)
      5 cs.close()            # 關閉客戶套接字
      

      基于Tcp的socket套接字(重點)

      服務端

      
      
      # 導入socket模塊
      import socket
      import time
      # 第一個socket是模塊名,第二個socket是類名
      #類實例化得到對象,得到一個socket對象
      # server=socket.socket(family=socket.AF_INET,type=socket.SOCK_STREAM)
      #不寫默認就是他
      server=socket.socket()
      
      # 綁定地址跟端口  ,傳一個元組,監聽的地址,監聽的端口
      server.bind(('192.168.11.28',8008))
      #監聽
      # 半連接池是5,可以緩沖5個
      server.listen(5)
      
      #等待用戶連接(看源碼,有兩個返回結果)
      # sock是連接對象,以后這個服務端和客戶端交互,使用這個對象交互
      # addr是客戶端地址(ip和端口)
      sock,addr=server.accept()
      
      # 接收客戶端發給我的消息
      data=sock.recv(1024)
      # 打印
      print(data)
      
      #服務端給客戶端發送消息(必須是byte格式)
      sock.send(b'helloworld')
      time.sleep(1)
      # 關閉連接對象
      sock.close()
      
      #關閉服務
      server.close()
      

      客戶端

      
      import socket
      
      # 創建socket對象
      client=socket.socket()
      # 連接服務端
      client.connect(('127.0.0.1',8008))
      #給服務端發了一個sb
      client.send(b'sb')
      # 收到了服務端給我的
      data=client.recv(1024)
      
      print(data)
      # 關閉
      client.close()
      

      加入鏈接循環的套接字服務端

      服務端

      
      '''
      
      2.1 基于文件類型的套接字家族
      套接字家族的名字:AF_UNIX
      unix一切皆文件,基于文件的套接字調用的就是底層的文件系統來取數據,兩個套接字進程運行在同一機器,可以通過訪問同一個文件系統間接完成通信
      
      
      2.2 基于網絡類型的套接字家族
      套接字家族的名字:AF_INET
      
      (還有AF_INET6被用于ipv6,還有一些其他的地址家族,不過,他們要么是只用于某個平臺,要么就是已經被廢棄,或者是很少被使用,或者是根本沒有實現,所有地址家族中,AF_INET是使用最廣泛的一個,python支持很多種地址家族,但是由于我們只關心網絡編程,所以大部分時候我么只使用AF_INET)
      
      
      
      '''
      
      import socket
      #實例化得到一個對象
      #type=socket.SOCK_STREAM   TCP服務端
      #type=socket.SOCK_DGRAM   UDP服務端
      server=socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
      
      # 綁定地址和端口
      server.bind(('127.0.0.1',80))
      
      # listen:監聽
      
      server.listen(1)
      
      # 等待用戶連接
      print('開始等待客戶端連接了')
      while True:
          sock,addr=server.accept()
      
          print(sock)
          print('客戶端的地址是:',addr)
      
          data=sock.recv(1024)
          print(data)
      
          # 這不是字符串的upper
          sock.send(data.upper())
      
          sock.close()
      server.close()
      
      

      客戶端

      import socket
      
      client=socket.socket()
      client.connect(('127.0.0.1',80))
      
      client.send('sb'.encode('utf-8'))
      
      data=client.recv(1024)
      print(data)
      
      client.close()
      

      加入通信循環的套接字服務端

      服務端

      
      import socket
      server=socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
      
      server.bind(('127.0.0.1',81))
      
      
      server.listen(1)
      
      print('開始等待客戶端連接了')
      while True:
      
          sock,addr=server.accept()
          print(sock)
          print('客戶端的地址是:',addr)
      
      
          # 等待客戶端發送過來的數據,如果客戶端沒有發送數據,會一直等著
          while True:
              try:
                  data=sock.recv(1024)
                  if len(data)==0: # 這個表示客戶端正常斷開了,結束通信循環
                      break
                  print(data.decode('utf-8'))
                  sock.send(data.upper())
              except Exception as e:
                  print(e) #客戶端非正常斷開,需要異常捕獲
                  break
      
      
          sock.close()
      server.close()
      
      

      客戶端

        
      import socket
      
      client=socket.socket()
      client.connect(('127.0.0.1',81))
      
      
      while True:
      
          input_data=input('請輸入發送給客戶端的內容(輸入q退出):')
      
          if input_data=='q':
              break
          client.send(input_data.encode('utf-8'))
      
          data=client.recv(1024)
          print(data.decode('utf-8'))
      
      client.close()
      

      基于UDP的套接字客戶端和服務端

      服務端

      
      import socket
      
      # udp的服務端
      server = socket.socket(type=socket.SOCK_DGRAM)
      
      # 監聽地址和端口
      server.bind(('127.0.0.1', 82))
      
      # 不需要listen,直接建立鏈接
      print('等待客戶端發送數據:')
      while True:
      #recvfrom回返回數據和客戶端的地址
          data,addr = server.recvfrom(1024)
          print(data)
          print(addr)
          server.sendto(data.upper(), addr)
      
      server.close()
      
      

      客戶端

      
      import socket
      
      client=socket.socket(type=socket.SOCK_DGRAM)
      client.sendto(b'sb',('127.0.0.1',82))
      # data,addr=client.recvfrom(1024)
      # data,_=client.recvfrom(1024)
      data=client.recv(1024)
      print(data)
      # print(addr)
      
      client.close()
      
      

      posted @ 2021-06-07 11:45  此用戶名不可用  閱讀(334)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲一区二区av高清| 精品无码一区二区三区的天堂| 中文字幕va一区二区三区| 极品蜜桃臀一区二区av| 国产精品女人毛片在线看| 亚洲欧美在线观看品| 精品人妻伦一二三区久久| 亚洲a∨国产av综合av| 欧美色综合天天久久综合精品| 国产精品国产三级国产试看| 国产精品一品二区三区日韩 | 日韩av裸体在线播放| 亚洲精品自拍在线视频| 老妇xxxxx性开放| 国产无套内射又大又猛又粗又爽| 亚洲天堂成人黄色在线播放| 无码毛片一区二区本码视频| 少妇高潮喷水正在播放| 国产一区二区黄色在线观看 | 亚洲高清国产成人精品久久| 亚洲精品麻豆一区二区| 高雄市| 黑人巨大粗物挺进了少妇| 精品视频在线观看免费观看| 宝贝腿开大点我添添公视频免| 日韩无人区码卡1卡2卡| 90后极品粉嫩小泬20p | 激情综合色区网激情五月| 久久精品蜜芽亚洲国产AV| 亚洲区一区二区三区精品| 国产中文字幕精品免费| 麻豆国产va免费精品高清在线| 最新国产精品好看的精品| 91久久夜色精品国产网站| 日韩高清国产中文字幕| a级国产乱理伦片在线观看al| 浪潮av色综合久久天堂| 大尺度国产一区二区视频| 亚洲码与欧洲码区别入口| 国产情侣激情在线对白| 久久人人爽人人爽人人av|