python socket編程

Python 提供了兩個基本的 socket 模塊。
第一個是 Socket,它提供了標準的 BSD Sockets API。

第二個是 SocketServer, 它提供了服務器中心類,可以簡化網絡服務器的開發。

socket類型

套接字格式:

socket(family,type[,protocal])
使用給定的地址族、套接字類型、協議編號(默認爲0,一般不寫)來創建套接字。

地址族:

socket類型 描述
socket.AF_UNIX 單一個unix進程間通信
socket.AF_INET 服務器之間的通信
scoket.AF_INET6 IPV6使用

套接字類型:

socket類型 描述
socket.SOCK_STREAM 流式 for TCP
socket.SOCK_DGRAM 報文式數據包 for UDP
scoket.SOCK_RAW 原始套接字,普通的套接字無法處理ICMP、IGMP等網絡報文,而SOCK_RAW可以;其次,SOCK_RAW也可以處理特殊的IPv4報文;此外,利用原始套接字,可以通過IP_HDRINCL套接字選項由用戶構造IP頭。
socket.SOCK_SEQPACKET 可靠的連續數據包格式

服務端與客戶端不能直接發送列表,元組,字典。需要字符串化repr(data)。

創建TCP服務器示例:

思路:
1、創建socket對象
tcpSerSock=socket(AF_INET,SOCK_STREAM) #創服務器套接字
2、綁定主機和端口,應當是一個元組
tcpSerSock.bind(ADDR) #套接字與地址綁定
3、監聽
tcpSerSock.listen(5) #監聽連接,傳入連接請求的最大數
4、等待連接
conn,addr = tcpSerSock.accept() addr是IP地址,conn是發送來的數據對象
5、接受數據
data = conn.recv() 需要用conn這個對象來操作
6、發送數據
conn.send(data) or conn.sendall(data)
7、關閉套接字
conn.close()
tcpSerSock.close()
*這裏用的decode和encode是python3創建socket時需要bytes數據
發送的時候,需要使用encode(),對端接收到,需要使用decode()

*

#創建TCP服務器
from socket import *
from time import ctime
import subprocess

HOST=''
PORT=21567
BUFSIZ=1024
ADDR=(HOST,PORT)

tcpSerSock=socket(AF_INET,SOCK_STREAM) #創服務器套接字
tcpSerSock.bind(ADDR) #套接字與地址綁定
tcpSerSock.listen(5)  #監聽連接,傳入連接請求的最大數

while True:
    print('waiting for connection...')
    tcpCliSock,addr =tcpSerSock.accept()
    print('...connected from:',addr)

    while True:
        data =tcpCliSock.recv(BUFSIZ).decode()
        if not data:
           continue
        print('command=',data)
        status,result = subprocess.getstatusoutput(data)
        if result.strip() == 0:

            tcpCliSock.send(('[%s] create a dir or file finish! ' %(ctime())).encode())
        else:
            tcpCliSock.send(('[%s] %s' %(ctime(),result)).encode())
    tcpCliSock.close()
tcpSerSock.close()

TCP客戶端示例:
思路:
1、創建socket對象
tcpCliSock=socket(AF_INET,SOCK_STREAM) #創服務器套接字
2、連接主機,應當是一個元組
tcpCliSock.connect(ADDR) #套接字與地址綁定
3、發送數據
tcpCliSock.send(data) or sendall(data)
4、接收數據
tcpCliSock.recv(1024)
5、關閉
tcpCliSock.close()


from socket import *

HOST = 'localhost' #  or 'localhost'
PORT = 21567
BUFSIZ = 1024
ADDR=(HOST,PORT)

tcpCliSock = socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR)

while True:
    data = input('> ')
    #print('data=',data);
    if not data:
        break
    tcpCliSock.send(data.encode())
    data = tcpCliSock.recv(BUFSIZ).decode()
    if not data:
        break
    print(data)

tcpCliSock.close()

創建UDP服務器

UDP協議則不需要事先建立連接,直接互相發送數據即可。
UDP服務端示例:
思路:
1、創建socket套接字
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
2、綁定
host=("",8000)
s.bind(host)
3、接受連接
s.recvfrom(1024)
4、發送數據
s.sendto(data,addr) 第二個參數爲客戶端IP
5、關閉
s.close()

import socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
host=("",8000)
s.bind(host)
while True:
    data,address = s.recvfrom(1024)
    print(data.decode(),address)
    senddata = "this is a udp server"
    s.sendto(senddata.encode(),address)

c.close()

UDP客戶端示例:
1、創建套接字
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
2、連接
host=("127.0.0.1",8000)
s.connect(host)
3、發送數據
s.send(data)
4、接收數據
s.recv(1024)
5、關閉

import socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
host=("127.0.0.1",8000)
s.connect(host)
while True:
    message = input("message:")
    s.send(message.encode())
    data = s.recv(1024)
    print(data.decode())

sl.close()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章