1. 程式人生 > >Python基礎---網絡編程2

Python基礎---網絡編程2

之間 ip地址 soc 字節 ets 抽象層 文件的 utf connect

1.socket套接字發展史

  套接字起源於20世紀70年代加利福尼亞大學伯克利分校版本的Unix,即人們所說的 BSD Unix。 因此,有時人們也把套接字稱為“伯克利套接字”或“BSD 套接字”。一開始,套接字被設計用在同 一臺主機上多個應用程序之間的通訊。這也被稱進程間通訊,或 IPC。套接字有兩種(或者稱為有兩個種族),分別是基於文件型的和基於網絡型的。

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

  unix一切皆文件,基於文件的套接字調用的就是底層的文件系統來取數據,兩個套接字進程運行在同一機器,可以通過訪問同一個文件系統間接完成通信.

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

  還有AF_INET6被用於ipv6,還有一些其他的地址家族,不過,他們要麽是只用於某個平臺,要麽就是已經被廢棄,或者是很少被使用,或者是根本沒有實現.在所有地址的家族中,AF_INET是使用最廣泛的一個,python支持很多種地址家族,但是大部分時候我們都使用AF_INET.

2.基於TCP協議的socket簡單通信

  python中的socket模塊是一個與網絡通信相關的模塊,是在應用層與傳輸層中間的一個抽象層,socket就像一個接口,通過這個接口可是實現簡單的網絡通信.

server端:

import socket

server 
= socket.socket(socket.AF_INET,socket.SOCK_STREAM) server.bind((IP地址, 端口)) server.listen() conn,addr = server.accept() from_client_data = conn.recv(1024) print(from_client_data.decode(utf-8)) conn.send(from_client_data)        # 回傳給客戶端,以字節傳輸 conn.close() server.close()

client端:

import
socket client = socket.socket() client.connect((服務端ip, 服務端-端口)) client.send(哈哈.encode(utf-8)) from_server_data = client.recv(1024) print(from_server_data.decode(utf-8)) client.close()

3.循環通信,循環連接,

server端:

import socket
server = socket.socket(socket.AF_NET,socket.SOCK_STREAM)  # 默認可以不寫
server.bind((本地回環地址,端口))
server.listen(5)
while True:
    con,addr = server.accept()                  # 實現了循環連接
    while True:                          # 實現了循環通信
        try:
            client_data = con.recv(1024)            
            print(client_data.decode(utf-8))
            ret = input(>>>).strip()
            con.send(ret.encode(utf-8))
        except Exception:
            break
    con.close()
server.close()

client端:

import socket
client = socket.socket(socket.AF_NET,socket.SOCK_STREAM)
client.connect((服務器ip,服務器端口))
while True:
    msg = input(>>>)
    if msg.upper() == Q: break
    client.send(msg.encode(utf-8))
    server_data = client.recv(1024)
    print(data.decode(utf-8))
client.close()

4.利用subprocess實現遠程操控

  客戶端輸入一個命令,通過網絡傳輸至服務器,服務器後端運行此命令,將此命令通過網絡傳輸返回給客戶.

server端:

import socket
import subprocess
server = socket.socket()
server.bind((回環地址, 端口))
server.listen(5)
while True:
    conn,addr = server.accept()
    while True:
        try:
            cmd = conn.recv(1024).decode(utf-8)
            obj = subprocess.Popen(cmd,
            shell=True,
          stdout=subprocess.PIPE,
          stderr=subprocess.PIPE
          )
        right_msg = obj.stdout.read()
        error_msg = obj.stderr.read()
     except Exception:
       break
  conn.close()

client端:

import socket
client = socket.socket()
client.connect((服務端ip,端口號))
while True:
    try:
        cmd = input(>>>).strip()
        if cmd.upper() == Q: break
        client.send(cmd.encode(utf-8))
        msg = client.recv(1024)
        print(msg.decode(gbk))    # 在subprocess中,服務端返回的信息默認編碼為gbk
    except Exception:
        break
client.close()

5.socket的更多方法

服務端套接字函數
s.bind()    綁定(主機,端口號)到套接字
s.listen()  開始TCP監聽
s.accept()  被動接受TCP客戶的連接,(阻塞式)等待連接的到來

客戶端套接字函數
s.connect()     主動初始化TCP服務器連接
s.connect_ex()  connect()函數的擴展版本,出錯時返回出錯碼,而不是拋出異常

公共用途的套接字函數
s.recv()            接收TCP數據
s.send()            發送TCP數據
s.sendall()         發送TCP數據
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()        創建一個與該套接字相關的文件

Python基礎---網絡編程2