TCP

TCP

查看文件大小:字節大小linux

import os

size = os.path.getsize('0909.py')

print(size)

1、簡單的雙向通訊

  1. servershell

    import socket
    soc = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    soc.bind(('127.0.0.1',8080))
    soc.listen(5)
    conn,addr = soc.accept()
    data = conn.recv(1024)
    print('客戶端發送過來的:',data)
    data = data.upper()
    conn.send(data)
    conn.close()
    soc.close()
  2. clientwindows

    import socket
    # 192.168.11.152
    # 192.168.11.126
    # 127.0.0.1
    soc = socket.socket()
    soc.connect(('192.168.11.152',8080))
    soc.send('我'.encode())
    data = soc.recv(1024)
    print(data)
    soc.close()

2、通訊循環

  1. server
import socket

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

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

soc.listen(5)

conn, addr = soc.accept()

while True:
    data = conn.recv(1024)
    print(data.decode())

conn.close()
soc.close()
  1. client
import socket
soc = socket.socket()
soc.connect(('127.0.0.1',8080))
while True:
    in_s = input('請輸入要法送的數據:')
    soc.send(in_s.encode())

2.1實現倆我的之間的通訊

  1. server
import socket

soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
soc.bind(('192.168.11.44',8080))  #192.168.11.44
soc.listen(5)
print('等待鏈接')
conn, addr = soc.accept()
print('客戶鏈接',addr)
for i in range(100):
    data = conn.recv(1024)
    data = data.decode()
    print('客戶端發送過來的:', data)
    data1 = input('請輸入:')
    conn.send(data1.encode())
conn.close()
soc.close()
  1. client
import socket
soc = socket.socket()
soc.connect(('192.168.11.44',8080))
for i in range(100):
    data1 = input('請輸入:')
    soc.send(data1.encode())
    data = soc.recv(1024)
    print('服務端回覆的:', data.decode())
soc.close()

3、套接字鏈接循環

  1. server網絡

    import socket
    #生成一個socket對象
    soc=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    #綁定地址跟端口號
    soc.bind(('127.0.0.1',8001))
    #監聽(半鏈接池的大小),不是鏈接數
    soc.listen(3)
    #等着客戶端來鏈接,conn至關於鏈接通道,addr是客戶端的地址
    while True:
        print('等待客戶端鏈接')
        conn,addr=soc.accept()    #卡主,若是沒有客戶端鏈接,會一直卡在這,當有鏈接,才繼續往下走
        print('有個客戶端鏈接上了',addr)
        while True:
            try:
                #windows若是客戶端斷開,會報錯,加了try
                #linux若是客戶端,斷開,不會報錯,會收到空,
                # 全部當data爲空時,也break
                #等待接收,最大收取1024個字節
                data=conn.recv(1024)    #會卡主,當客戶端有數據過來,纔會執行
                if len(data)==0:  #處理linux客戶端斷開,
                    # 若是在window下這段代碼根本不會執行
                    # (即使是客服端發了空,這個地方也不會走到)
                    break
                print(data)
            except Exception:
    
                break
        # 關閉通道
        conn.close()
    
    
    # 關閉套接字
    soc.close()
  2. client多線程

    import socket
    soc = socket.socket()
    soc.connect(('127.0.0.1',8080))
    
    while True:
        in_s = input('請輸入要發送的數據:')
        soc.send(in_s.encode())

4、模擬ssh功能

  1. serverssh

    import socket
    import subprocess
    soc=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    soc.bind(('127.0.0.1',8001))
    soc.listen(3)
    while True:
        print('等待客戶端鏈接')
        conn,addr=soc.accept()
        print('有個客戶端鏈接上了',addr)
        while True:
            try:
                data=conn.recv(1024)
                if len(data)==0:
                    break
                print(data)
                obj = subprocess.Popen(str(data,encoding='utf-8'), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
                #執行正確的結果 b 格式,gbk編碼(windows平臺)
                msg=obj.stdout.read()
                #把執行的結果經過網絡傳給c端
                conn.send(msg)
            except Exception:
    
                break
        # 關閉通道
        conn.close()
    
    
    # 關閉套接字
    soc.close()
  2. clientsocket

    import socket
    
    soc=socket.socket()
    
    soc.connect(('127.0.0.1',8001))
    while True:
        in_s=input('請輸入要執行的命令:')
        soc.send(in_s.encode('utf-8'))
        data=soc.recv(1024)
        print(str(data,encoding='gbk'))
    
    
    #粘包:tcp會把數據量較小,時間間隔較短的數據,當作同一個包發送
  3. 補充的subprocess模塊tcp

    #ssh 是遠程執行命令
    #subprocess 執行系統命令的模塊
    import subprocess
    #執行系統dir命令,把執行的正確結果放到管道中
    # obj=subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE)
    obj=subprocess.Popen('tasklistdd',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
    #拿到正確結果的管道,讀出裏面的內容
    ss=obj.stdout.read()
    err=obj.stderr.read()
    print('錯誤信息',str(err,encoding='gbk'))
    #由於windows用的gbk編碼,用gbk解碼
    # print(str(ss,encoding='utf-8'))
    print(str(ss,encoding='gbk'))

socketserver開始多線程

TCP能夠開始多線程編碼

  1. server

    #使用socketserver寫服務端
    #導入模塊
    import socketserver
    
    #本身定義一個類,必須繼承BaseRequestHandler
    class MyTcp(socketserver.BaseRequestHandler):
        #必須重寫handle方法
        def handle(self):
            try:
                while True :  #通訊循環
                    # print(self)
                    #給客戶端回消息
                    #conn對象就是request
                    #接收數據
                    print(self.client_address)
                    data=self.request.recv(1024)
                    print(data)
                    if len(data)==0:
                        return
                    #發送數據
                    self.request.send(data.upper())
            except Exception:
                pass
    
    
    if __name__ == '__main__':
        #實例化獲得一個tcp鏈接的對象,Threading意思是說,只要來了請求,它自動的開線程來處理鏈接跟交互數據
        #第一個參數是綁定的地址,第二個參數傳一個類
        server=socketserver.ThreadingTCPServer(('127.0.0.1',8009),MyTcp)
        #一直在監聽
        #這麼理解:只要來一個請求,就起一個線程(造一我的,作交互)
        server.serve_forever()
  2. client1

    import socket
    soc = socket.socket()
    soc.connect(('127.0.0.1',8009))
    while True:
        soc.send('xxx'.encode('utf8'))
        print(soc.recv(1024))
  3. client2

    import socket
    soc = socket.socket()
    soc.connect(('127.0.0.1',8009))
    while True:
        soc.send('xxx'.encode('utf8'))
        print(soc.recv(1024))
相關文章
相關標籤/搜索