久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      網(wǎng)絡(luò)編程實(shí)例教程

      第1章互聯(lián)網(wǎng)常見(jiàn)架構(gòu):

      C/S:客戶(hù)端和服務(wù)端

      常見(jiàn):wechat/qq

      B/S:瀏覽器和服務(wù)器

      常見(jiàn):所有瀏覽器都是BS架構(gòu)

      第2章什么是socket?

      Socket就是一系列接口,把傳輸層一下的協(xié)議都封裝成了簡(jiǎn)單的接口

      2.1為什么要用套接字?

      目的是要編寫(xiě)一個(gè)CS架構(gòu)的軟件

      server端必須具備的特點(diǎn):

      1.一直對(duì)外服務(wù)

      2.必須綁定一個(gè)固定的地址

      3.支持并發(fā)

      2.2套接字的類(lèi)型:

      1.基于文件類(lèi)型的套接字:AF_UNIX

      兩個(gè)文件同時(shí)位于一個(gè)機(jī)器上,則可以共用一個(gè)文件系統(tǒng)來(lái)進(jìn)行通信

      2.基于網(wǎng)絡(luò)類(lèi)型的套接字:AF_INET

      2.3套接字的工作流程:

      先從服務(wù)端說(shuō)起,服務(wù)端先初始化socket,然后與端口綁定,對(duì)端口進(jìn)行監(jiān)聽(tīng),調(diào)用accept阻塞,等待客戶(hù)端連接,在這時(shí)如果有個(gè)客戶(hù)端初始化一個(gè)socket,然后連接服務(wù)器connect,如果連接成功,這時(shí)客戶(hù)端與服務(wù)端的連接就建立了,客戶(hù)端發(fā)送數(shù)據(jù)請(qǐng)求,服務(wù)端接受請(qǐng)求并處理請(qǐng)求,然后把數(shù)據(jù)發(fā)送給客戶(hù)端,客戶(hù)端讀取數(shù)據(jù),最后關(guān)閉連接,一次交互結(jié)束

      2.4關(guān)于套接字的方法:

      服務(wù)端套接字函數(shù):

      s.bind()綁定(主機(jī),端口號(hào))到套接字
      s.listen()開(kāi)始TCP監(jiān)聽(tīng)
      s.accept()被動(dòng)接受TCP客戶(hù)的連接,(阻塞式)等待連接的到來(lái)

      客戶(hù)端套接字函數(shù):

      s.connect()主動(dòng)初始化TCP服務(wù)器連接
      s.connect_ex() connect()函數(shù)的擴(kuò)展版本,出錯(cuò)時(shí)返回出錯(cuò)碼,而不是拋出異常

      公共用途的套接字函數(shù):

      s.recv()接收TCP數(shù)據(jù)
      s.send()發(fā)送TCP數(shù)據(jù)(send在待發(fā)送數(shù)據(jù)量大于己端緩存區(qū)剩余空間時(shí),數(shù)據(jù)丟失,不會(huì)發(fā)完)
      s.sendall()發(fā)送完整的TCP數(shù)據(jù)(本質(zhì)就是循環(huán)調(diào)用send,sendall在待發(fā)送數(shù)據(jù)量大于己端緩存區(qū)剩余空間時(shí),數(shù)據(jù)不丟失,循環(huán)調(diào)用send直到發(fā)完)
      s.recvfrom()接收UDP數(shù)據(jù)
      s.sendto()發(fā)送UDP數(shù)據(jù)
      s.getpeername()連接到當(dāng)前套接字的遠(yuǎn)端的地址
      s.getsockname()當(dāng)前套接字的地址
      s.getsockopt()返回指定套接字的參數(shù)
      s.setsockopt()設(shè)置指定套接字的參數(shù)
      s.close()關(guān)閉套接字

      面向鎖的套接字方法:

      s.setblocking()設(shè)置套接字的阻塞與非阻塞模式
      s.settimeout()設(shè)置阻塞套接字操作的超時(shí)時(shí)間
      s.gettimeout()得到阻塞套接字操作的超時(shí)時(shí)間

      2.5基于tcp的socket通信

      服務(wù)端:

      importsocket

      server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
      server.bind(('127.0.0.1',8080))
      server.listen(3)
      10

      print('來(lái)自客戶(hù)端的請(qǐng)求')
      print(addr)
      data=conn.recv(1024)
      print('來(lái)自客戶(hù)端的消息:',data)
      conn.send(data.upper())
      conn.close()

      客戶(hù)端:

      importsocket
      client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
      client.connect(('127.0.0.1',8080))

      client.send(bytes('nihao',encoding='utf-8'))
      data=client.recv(1024)
      print('來(lái)自服務(wù)端的數(shù)據(jù):',data)
      client.close()

      2.6通信循環(huán)問(wèn)題

      服務(wù)端:

      importsocket

      server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
      server.bind(('127.0.0.1',8080))
      server.listen(3)

      conn,addr=server.accept()
      print(addr)
      while True:
      data=conn.recv(1024)
      iflen(data) ==0:break
      print('來(lái)自客戶(hù)端的消息:',data)
      conn.send(data.upper())
      conn.close()

      客戶(hù)端:

      importsocket

      client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

      client.connect(('127.0.0.1',8080))

      while True:
      msg=input('>>: ').strip()
      iflen(msg) ==0:continue
      client.send(bytes(msg,encoding='utf-8'))
      data=client.recv(1024)
      print(data)

      client.close()

      2.7循環(huán)鏈接問(wèn)題

      importsocket

      server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

      server.bind(('127.0.0.1',8080))

      server.listen(5)

      while True:
      conn,addr=server.accept()

      while True:
      try:
      data=conn.recv(1024)
      iflen(data) ==0:break
      print(data)
      conn.send(data.upper())
      exceptConnectionRefusedErrorase:
      break
      conn.close()

      2.8tcp版ssh客戶(hù)端

      服務(wù)端:

      importsocket

      importsubprocess

      server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

      server.bind(('127.0.0.1',8080))

      server.listen(5)

      while True:
      conn,addr=server.accept()

      while True:
      try:
      data=conn.recv(1024)
      iflen(data) ==0:break
      obj=subprocess.Popen(data.decode('utf-8'),
      shell=True,
      stderr=subprocess.PIPE,
      stdout=subprocess.PIPE
      )
      stdout=obj.stdout.read()
      stderr=obj.stderr.read()
      conn.send(stdout+stderr)
      exceptConnectionRefusedErrorase:
      break
      conn.close()
      server.close()

      客戶(hù)端:

      importsocket

      client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

      client.connect(('127.0.0.1',8080))

      while True:
      msg=input('>>: ').strip()
      iflen(msg) ==0:continue
      client.send(bytes(msg,encoding='utf-8'))
      data=client.recv(1024)
      print(data.decode('utf-8'))

      client.close()

      第3章粘包問(wèn)題

      要知道:只有tcp有粘包現(xiàn)象,UDP則永遠(yuǎn)沒(méi)有

      3.1什么是粘包?

      就是接受方不知道消息之間的界限,不知道一次性提取多少字節(jié)所造成的

      3.2解決辦法:

      問(wèn)題的根源在于,接受端不知大發(fā)送端將要傳送的字節(jié)流的長(zhǎng)度,所以解決粘包的方法就是圍繞,如何讓發(fā)送端在發(fā)送數(shù)據(jù)前把自己將要發(fā)送的字節(jié)流總大小讓接收端知曉,然后接收端來(lái)一個(gè)死循環(huán)接受所有數(shù)據(jù)即可

      解決粘包問(wèn)題服務(wù)端:

      importsocket
      importstruct

      importsubprocess

      server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

      server.bind(('127.0.0.1',8080))

      server.listen(5)

      while True:
      conn,addr=server.accept()

      while True:
      try:
      data=conn.recv(1024)
      iflen(data) ==0:break
      obj=subprocess.Popen(data.decode('utf-8'),
      shell=True,
      stderr=subprocess.PIPE,
      stdout=subprocess.PIPE
      )
      stdout=obj.stdout.read()
      stderr=obj.stderr.read()

      #發(fā)送固定長(zhǎng)度的報(bào)頭
      total_size=len(stdout) +len(stderr)
      conn.send(struct.pack('i',total_size))

      #真實(shí)數(shù)據(jù)
      conn.send(stdout+stderr)
      exceptConnectionRefusedErrorase:
      break
      conn.close()
      server.close()

      客戶(hù)端:

      importsocket
      importstruct

      client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

      client.connect(('127.0.0.1',8080))

      while True:
      msg=input('>>: ').strip()
      iflen(msg) ==0:continue
      client.send(bytes(msg,encoding='utf-8'))
      #接受數(shù)據(jù)長(zhǎng)度
      header=client.recv(4)
      total_size=struct.unpack('i',header)[0]
      recv_size=0
      res=b''
      whilerecv_size < total_size:
      recv_data=client.recv(1024)
      res+=recv_data
      recv_size+=len(recv_data)
      print(res.decode('utf-8'))

      client.close()

      第4章一個(gè)簡(jiǎn)單的基于UDP的socket客戶(hù)端和服務(wù)端

      服務(wù)端:

      importsocket

      server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
      server.bind(('127.0.0.1',8080))

      while True:
      data,client_addr=server.recvfrom(1024)
      print('===>',data,client_addr)
      server.sendto(data.upper(),client_addr)
      server.close()

      客戶(hù)端:

      importsocket

      client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

      while True:
      msg=input('>>: ').strip()
      client.sendto(msg.encode('utf-8'),('127.0.0.1',8080))
      data,server_addr=client.recvfrom(1024)
      print(data)
      client.close()

      第5章socketserver實(shí)現(xiàn)并發(fā)的效果

      5.1TCP服務(wù)端:

      5.2UDP服務(wù)端:

      贊(0)
      分享到: 更多 (0)
      ?
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)