有個需求,就是在windows上看見一篇介紹linux相關的文章,想在區域網內的另外一臺linux電腦上嘗試一下, 於是就需要把該網頁鏈接發送給linux,不想一點一點敲鏈接,又苦於沒有找到其它好的方法。 想起之前學習電腦網路時瞭解到的socket,於是再次打開課本,代碼(python3)如下: ...
有個需求,就是在windows上看見一篇介紹linux相關的文章,想在區域網內的另外一臺linux電腦上嘗試一下,
於是就需要把該網頁鏈接發送給linux,不想一點一點敲鏈接,又苦於沒有找到其它好的方法。
想起之前學習電腦網路時瞭解到的socket,於是再次打開課本,代碼(python3)如下:
客戶端(windows)代碼:
# 區域網內的windows客戶端 from socket import * #導入socket里的所有東西 serverName = '127.0.0.1' #換成區域網內伺服器端IP即可實現區域網內通信 serverPort = 12001 #伺服器埠,除了已知的被占用埠都可,一般建議10000-65535 clientSocket = socket(AF_INET,SOCK_DGRAM) #UDP連接 #ipv4 udp while True: message = input('please input: \n') if (message == '0'): #輸入0時結束髮送 break clientSocket.sendto(message.encode(),(serverName,serverPort)) #向伺服器發送消息,使用socket時,只能以位元組形式傳送,故需要encode() reply,serverAddress = clientSocket.recvfrom(2048) #接收伺服器返回的消息和地址 print (reply) clientSocket.close() #關閉連接
伺服器端(linux)代碼:
# 如果是區域網內的linux作為伺服器端執行該代碼,註意先關閉防火牆 from socket import * serverPort = 12001 serverSocket = socket(AF_INET,SOCK_DGRAM) serverSocket.bind(('',serverPort)) #註意bind方法括弧內為一個元組,引號預設表示為127.0.0.1,即監聽本地埠 print('ready') while True: message,clientAddress = serverSocket.recvfrom(2048) #接收客戶端發來的消息 print(message) serverSocket.sendto('have received'.encode(),clientAddress) #使用socket時,只能以位元組形式傳送,故需要encode()
上述代碼參考《電腦網路自頂向下方法》,代碼很簡潔,而且基本上能滿足需求。
值得強調的一點是,在實現上述代碼時,建議先在本機(即在windows上跑上面兩個腳本),成功了以後再把serverName從'127.0.0.1' 變為 '區域網內伺服器端IP'。
而且在linux端實現伺服器端代碼時,一定要先關閉防火牆!凡是涉及到區域網內linux與其它主機通信的都要考慮防火牆的問題,比如ftp之類!(這一點對於小白來講怎樣強調都不為過,雖然我之前知道也這一點,但是這次在運行該代碼時,再次犯了這樣的錯誤,找原因也浪費了挺長時間,最後想起是防火牆的原因又懊惱不已,懷著悲傷的心情寫下了這個小結)