python: 使用socket实现局域网不同主机通信。解决ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。
目錄
- 1 socket的使用
- 1.1 TCP方法
- 1.2 UDP方法
- 2 局域網內連接
- 2.1
- 總結
1 socket的使用
1.1 TCP方法
在socket中使用socket.socket建立會話,如果是服務器,需要綁定服務器地址和端口號,然后進行循環監聽,當有客戶端連接時再接收數據。
代碼如下:
在客戶端,使用send方法向服務器發送一次數據
import socketdef tcpSend(address,port,message):server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server.connect((address, port))server.send(message.encode("utf-8"))data = server.recv(1024)server.close()return dataif __name__ == '__main__':address = 'localhost'port = 8686message = 'message'receive = tcpSend(address,port,message)print('receive: ', receive)1.2 UDP方法
UDP方法面向無連接,在socket設置會話的屬性時參數修改為socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
服務器端接收數據是一次接收數據和端口地址,代碼如下:
客戶端
import socketdef udpSend(address,port,message):server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)server.connect((address, port))server.send(message.encode("utf-8"))data = server.recv(1024)server.close()return dataif __name__ == '__main__':address = 'localhost'port = 8686message = 'message'receive = tcpSend(address,port,message)print('receive: ', receive)2 局域網內連接
當將服務器ip地址替換address時,在兩臺主機上測試,往往會發生這樣的錯誤
ConnectionResetError: [WinError 10054] 遠程主機強迫關閉了一個現有的連接
其中一個很大的原因就是個人主機對局域網的連接有防火墻設置。
解決方法:在服務器端通過 控制面板->系統和安全->Windows Defender 防火墻->高級設置->入站/出站規則(入站和出站都要),找到文件和打印機共享(回顯請求 - ICMPv4-In/Out) 域中,啟用規則,域表示當前局域網。客戶端無需設置,即可實現兩臺主機的測試。
2.1
在客戶端,接收來自服務器的數據后,未關閉會話時不能print(data),會導致輸入輸出錯誤。
def tcpSend(address,port,message):server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server.connect((address, port))server.send(message.encode("utf-8"))data = server.recv(1024)print(data) # 會在這里陷入等待server.close()return data總結
簡述了TCP和UDP兩種方法的應用,以及解決服務器端防火墻導致局域網內兩臺主機不能成功連通的問題。但是對于服務器還有更多的內容需要設置,沒有學,在此不深究。
總結
以上是生活随笔為你收集整理的python: 使用socket实现局域网不同主机通信。解决ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数独java界面基础_java版数独游戏
- 下一篇: SM4算法