欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > python >内容正文

python

python: 使用socket实现局域网不同主机通信。解决ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。

发布时间:2024/7/23 python 52 豆豆
生活随笔 收集整理的这篇文章主要介绍了 python: 使用socket实现局域网不同主机通信。解决ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

目录

  • 1 socket的使用
    • 1.1 TCP方法
    • 1.2 UDP方法
  • 2 局域网内连接
    • 2.1
  • 总结


1 socket的使用

1.1 TCP方法

在socket中使用socket.socket建立会话,如果是服务器,需要绑定服务器地址和端口号,然后进行循环监听,当有客户端连接时再接收数据。
代码如下:

import socketdef tcpServer(address,port=8686):# stream代表tcp方式server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)server.bind((address, port))server.listen()print('Server start')while True:client, ad = server.accept()data = client.recv(1024)# 处理接收到的数据print('receive from : ',ad, ' data: ', data)# 回传数据给客户端client.send('I have received your data'.encode('utf-8'))# 如果接收到close则关闭服务器c =[chr(data[i]) for i in range(5)]if ''.join(c) == 'close':breakserver.close()print('Server close')if __name__ == "__main__":address = "localhost"port = 8686tcpServer(address,port)

在客户端,使用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 udpServer(address,port=8686):# dgram代表udp方式server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)server.bind((address, port))print('Server start')while True:data, ad = server.recvfrom(1024)# 处理接收到的数据print('receive from : ', ad, ' data: ', data)server.sendto('I have received your data'.encode('utf-8'),ad)c = [chr(data[i]) for i in range(5)]if ''.join(c) == 'close':breakserver.close()print('Server close')if __name__ == "__main__":address = "localhost"port = 8686udpServer(address,port)

客户端

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] 远程主机强迫关闭了一个现有的连接。的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。