栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 socket

def 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':
            break
    server.close()
    print('Server close')

if __name__ == "__main__":
    address = "localhost"
    port = 8686
    tcpServer(address,port)

在客户端,使用send方法向服务器发送一次数据

import socket

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)
    server.close()
    return data

if __name__ == '__main__':
    address = 'localhost'
    port = 8686

	message = 'message'
    receive = tcpSend(address,port,message)
    print('receive: ', receive)
1.2 UDP方法

UDP方法面向无连接,在socket设置会话的属性时参数修改为socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
服务器端接收数据是一次接收数据和端口地址,代码如下:

import socket

def 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':
            break
    server.close()
    print('Server close')

if __name__ == "__main__":
    address = "localhost"
    port = 8686
    udpServer(address,port)

客户端

import socket

def 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 data

if __name__ == '__main__':
    address = 'localhost'
    port = 8686

	message = '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两种方法的应用,以及解决服务器端防火墙导致局域网内两台主机不能成功连通的问题。但是对于服务器还有更多的内容需要设置,没有学,在此不深究。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/283106.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号