socket通訊

socket通訊的僞代碼流程:

 

socket簡單的示例代碼

client端的代碼:

 1 import socket
 2 
 3 client = socket.socket()
 4 client.connect(('localhost',3001))
 5 
 6 client.send(b'hhhh')
 7 data = client.recv(1024)
 8 print('recv:',data)
 9 
10 client.close()
1 客戶端結果
2 >>> recv: b'HHHH'

 

server端的代碼:

 1 import socket
 2 
 3 server = socket.socket()
 4 
 5 server.bind(('localhost',3001)) #綁定要監聽端口
 6 server.listen()                 #監聽
 7 
 8 print('開始等待數據....')
 9 
10 #conn表示客戶端鏈接到服務端生成的一個鏈接實例
11 conn,addr = server.accept() #等待數據
12 
13 print(conn,addr)
14 
15 
16 print('數據來了')
17 data = conn.recv(1024)
18 print('recv:',data)
19 
20 conn.send(data.upper())
21 
22 server.close()
1 服務端結果
2 >>> 開始等待數據....
3 >>> <socket.socket fd=296, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 3001), raddr=('127.0.0.1', 54373)> ('127.0.0.1', 54373)
4 >>> 數據來了
5 >>> recv: b'hhhh'

 socket多用戶鏈接:

client端的代碼:

 1 import socket
 2 import os
 3 
 4 client = socket.socket()
 5 client.connect(('localhost', 3001))
 6 while True:
 7     #讓用戶本身輸入要發送的信息msg,由於涉及到中文,所已用encode和decode進行轉換
 8     msg = input(">>>:").strip()
 9     if len(msg) == 0:
10         continue
11     client.send(msg.encode("utf-8"))
12     data = client.recv(1024)
13     print('recv:', data.decode())
14 
15 client.close()

server端的代碼:

 1 import socket
 2 import os
 3 
 4 server = socket.socket()  # 建立套接字
 5 server.bind(('localhost', 3001))  # 綁定要監聽端口
 6 server.listen(1)  # 監聽,數據表明容許多少個連接
 7 
 8 print('開始等待數據....')
 9 # conn表示客戶端鏈接到服務端生成的一個鏈接實例
10 # 先說第二個while,循環接收客戶端數據,當客戶端數據沒有發送,服務端收到數據爲空的時候跳出循環,這麼作是由於這個程序若是想要一直接收客戶端數據,就須要進行循環操做,可是若是收到數據爲空,該循環就會進入一個死循環,因此須要斷定條件,當客戶端結束髮送數據,而後結束鏈接;
11 # 而後第一個while,由於這裏考慮測試多人單線程鏈接server,若是不加while,當客戶端數據沒有發送,server會直接斷開鏈接,不接收下個新用戶的請求數據,因此將一個鏈接實例放在循環裏,當一個用戶斷開鏈接,回到上層,而後再接收新用戶的數據。
12 while True:
13     conn, addr = server.accept()  # 等待數據
14     print(conn, addr)
15     print('數據來了')
16     while True:
17         data = conn.recv(1024)
18         print('recv:', data)
19         if not data:
20             print('The client did not respond')
21             break
22          conn.send(data.upper())
23 
24 server.close()

socket簡單的shell實現:

client端的代碼:

import socket
import os

client = socket.socket()
client.connect(('localhost', 3001))
while True:
    #讓用戶本身輸入要發送的信息msg,由於涉及到中文,所已用encode和decode進行轉換
    msg = input(">>>:").strip()
    if len(msg) == 0:
        continue
    client.send(msg.encode("utf-8"))
    data = client.recv(1024)
    #print('recv:', data.decode())
    print(data.decode())

client.close()

server端的代碼:

import socket
import os

server = socket.socket()  # 建立套接字
server.bind(('localhost', 3001))  # 綁定要監聽端口
server.listen(1)  # 監聽,數據表明容許多少個連接

print('開始等待數據....')
while True:
    conn, addr = server.accept()  # 等待數據
    print(conn, addr)
    print('數據來了')
    while True:
        data = conn.recv(1024)
        print('recv:', data)
        if not data:
            print('The client did not respond')
            break
        res = os.popen(data.decode()).read()  #py3 裏socket發送的只有bytes,os.popen又只能接受str,因此要decode一下
        conn.send(res.encode("utf-8"))

server.close()
相關文章
相關標籤/搜索