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 當然你...