python學習之網路

2021-09-26 23:47:15 字數 3982 閱讀 3045

1、udp網路程式傳送流程

import socket

def main():

#1、建立socket物件

udp_socket = socket.socket(socket.af_inet,socket.sock_dgram)

#2、socket收發資料

#發資料.注sendto(b"內容",用元組形式寫ip和埠號)

udp_socket.sendto(b"hello world!",("192.168.17.132",7908))

#python3中input返回值是str型通過encode轉換成bytes型別

send_data = input("請輸入\n")

udp_socket.sendto(send_data.encode("gbk"),("192.168.0.103",8080))

#關閉socket

udp_socket.close();

if __name__=="__main__":

main()

**解析:

socket():

第乙個引數是:address family,可以選擇 af_inet(用於 internet 程序間通訊) 或者 af_unix(用於同一臺機器程序間通訊),實際工作中常用af_inet

第二個引數:type,套接字型別,可以是 sock_stream(流式套接字,主要用於 tcp 協議)或者 sock_dgram(資料報套接字,主要用於 udp 協議)

sendto():

第乙個引數是:傳送的內容是bytes型別

第二個引數:是目的ip和埠是元組型別

2、udp接收資料流程

import socket

def main():

#1、建立套接字

udp_socket = socket.socket(socket.af_inet,socket.sock_dgram)

#2、繫結程式埠號及ip

udp_localaddr = ("",7908)

udp_socket.bind(udp_localaddr)

#3、接收資料udp_receive_msg(接受的資料,(傳送方的ip,埠號))

udp_receive_msg = udp_socket.recvfrom(1024)

udp_receive_data = udp_receive_msg[0]

udp_receive_addr = udp_receive_msg[1]

#4、處理資料(列印)

print("%s:%s"%(str(udp_receive_addr),udp_receive_data.decode("gbk")))

#5、關閉套接字

udp_socket.close()

if __name__ == "__main__":

main()

**解析:

udp_localaddr = ("",7908):代表本機的ip

recvfrom():返回值是乙個元組,元組第乙個元素是接收的內容,bytes型別。第二個元素是傳送方的ip及埠,會阻塞知道收到資料為止

1、tcp客戶端網路程式流程

示例**:

import socket

def main():

#建立套接字

tcp_socket = socket.socket(socket.af_inet,socket.sock_stream)

#連線伺服器

server_ip = input("請輸入server ip:")

server_port = int(input("請輸入server port:"))

server_addr = (server_ip,server_port)

tcp_socket.connect(server_addr)

#傳送接收資料

send_data = input("請輸入要傳送的內容:")

tcp_socket.send(send_data.encode("utf_8"))

#關閉套接字

tcp_socket.close()

if __name__ == "__main__":

main()

2、tcp伺服器流程

示例**:

import socket

def main():

#建立套接字(socket)

tcp_sever_socket = socket.socket(socket.af_inet,socket.sock_stream)

#繫結埠及ip(bind)

server_ip = ""

server_port = 7788

server_addr = (server_ip,server_port)

tcp_sever_socket.bind(server_addr)

#將套接字設定成監聽模式(listen)

while true:

tcp_sever_socket.listen(128)

#等待客戶端連線(accept)

print("阻塞1,等待客戶端連線(accept)")

new_client_socket,new_client_socket_addr = tcp_sever_socket.accept()

#收發資料(send/recv)

print("阻塞2,等待客戶端傳送的資料(recv)")

receive_data = new_client_socket.recv(1024)

print("%s: %s" %(str(new_client_socket_addr),receive_data.decode("utf-8")))

#關閉客戶端套接字(close)

new_client_socket.close()

if __name__ == "__main__":

main()

**解析:

listen():將套接字改為被動監聽模式,tcp伺服器必須改為被動模式

accept():返回值有兩個,第乙個是為連線進來的客戶端建立新的套接字物件(new_client_socket),之後與該客戶端收發用的套接字都是該套接字fa,而開始建立的套接字(tcp_sever_socket)是伺服器用來監聽的套接字,第二個引數是連線進來的客戶端的ip及埠,是元組型別,accept當沒客戶端連線進來時會阻塞,知道有客戶端連線進來時接阻塞。

recv():返回值只有接收到的內容(不像recvfrom那樣還帶有傳送方的ip及埠)是bytes型別

tcp注意點

1、tcp伺服器一般情況下都需要繫結,否則客戶端找不到這個伺服器

2、tcp客戶端一般不繫結,因為是主動鏈結伺服器,所以只要確定好伺服器的ip、port等資訊就好,本地客戶端可以隨機

3、tcp伺服器中通過listen可以將socket建立出來的主動套接字變為被動的,這是做tcp伺服器時必須要做的

4、當客戶端需要鏈結伺服器時,就需要使用connect進行鏈結,udp是不需要鏈結的而是直接傳送,但是tcp必須先鏈結,只有鏈結成功才能通訊

5、當乙個tcp客戶端連線伺服器時,伺服器端會有1個新的套接字,這個套接字用來標記這個客戶端,單獨為這個客戶端服務

listen後的套接字是被動套接字,用來接收新的客戶端的鏈結請求的,而accept返回的新套接字是標記這個新客戶端的

6、關閉listen後的套接字意味著被動套接字關閉了,會導致新的客戶端不能夠鏈結伺服器,但是之前已經鏈結成功的客戶端正常通訊。

7、關閉accept返回的套接字意味著這個客戶端已經服務完畢

8、當客戶端的套接字呼叫close後,伺服器端會recv解堵塞,並且返回的長度為0,因此伺服器可以通過返回資料的長度來區別客戶端是否已經下線

Python之網路爬蟲學習筆記

大資料時代資料獲取的方式 1 企業生產的使用者資料 大型網際網路公司有海量使用者,所以他們積累資料有天然的優勢 有資料意識的中小企業,也開始積累資料。2 資料管理諮詢公司 通常這樣的公司有很龐大的資料採集團隊,一般會通過市場調研 問卷調查 固定的樣本檢測和各行各業的公司進行合作 專家對話 資料積累很...

Python學習筆記之 網路程式設計

客戶端 import socket 建立乙個socket s socket.socket socket.af inet,socket.sock stream 建立連線 s.connect 127.0.0.1 9999 接受或傳送 s.send s.recv 1024 s.close af inet指...

python網路爬蟲學習筆記之之正規表示式

1.表達很多字串 可以直接使用乙個正規表示式 2.表達無窮多個字串時 比如 py 就表示p後邊跟乙個y或者無窮多個y時的情況 3.比如一組字串有某種特點,很難將它們列舉出來就可以使用正規表示式來進行 比如說 一組字串需要以 py 開頭 後續存在不多於10個字串,後續字串不得出現 p 或者 y 當然你...