Почему я получаю сообщение об ошибке 32: ошибка сломанной трубы при подключении к общедоступной сети? - PullRequest
1 голос
/ 24 мая 2019

В настоящее время я создаю сеть, и всякий раз, когда я пытаюсь соединить два моих устройства в школьной сети, устройства отказываются соединяться друг с другом. Однако я использую ту же самую программу в моей домашней сети, и она прекрасно подключается. Я не уверен, почему возникает проблема, и я искал решение по всему Интернету, но не смог найти.

Сначала я думал, что ошибка была результатом медленного интернет-соединения в моей школьной сети, поэтому я попытался включить цикл while вокруг частей, которые отвечали за соединение клиента и сервера. Программа не смогла подключиться после нескольких попыток подключения в моей школьной сети. Проблема не в каком-либо из моего кода, потому что я могу выполнить его в своей домашней сети без проблем, так как оба устройства могут подключаться к серверу.

Клиентская программа:

class Network:
    def __init__(self):
        self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server = 'Insert IPv4 Address Here'
        self.port = 5555
        self.addr = (self.server, self.port)

    def getServer(self):
        return self.server

    def make_Connection(self):
        try:
            self.client.connect(self.addr)  # Connect the client to the server
            return pickle.loads(self.client.recv(2048))  
        except socket.error as e:
            print(e)

    def send_and_receive(self, data):
        try:
            self.client.send(pickle.dumps(data))  
            return pickle.loads(self.client.recv(2048))  
        except socket.error as e:
            print(e)


### --- Client --- ###
network = Network()
output = network.Make_Connection()
print(output)
output= network.send_and_receive('Hello World')
print(output)

Серверная программа:

from _thread import *
import socket
import pickle

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
    s.bind(('', 5555))
except socket.error as e:
    print(e)

s.listen(2)

# functions #
def ThreatedClient(conn, player):
    conn.send(pickle.dumps('Connection Established'))
    while True:
        try:
            new_data = pickle.loads(conn.recv(2048))  
            if not new_data:
                print('Disconnected...')
                break
            else:
                if player == 0:
                    reply = pickle.dumps('This is Player 1') 
                else:
                    reply = pickle.dumps('This is Player 2')

            conn.sendall(reply)  # Send reply to clients
        except:
            break

    print('Connection Lost ... ')
    conn.close()

### --- Thread Starts Here --- ###
current_player = 0
while True:
    c, address = s.accept()  # Accepts connection from client
    print('Connected to:', address)

    start_new_thread(ThreatedClient, (c, current_player))
    current_player += 1

На сервере ожидаемый результат должен быть:

Connected to: ('IPv4 Address', Port)

В клиенте ожидаемый результат должен быть:

Connection Established
This is Player 1

для игрока 1 и:

Connection Established
This is Player 2

для игрока 2.

Когда я запускаю ту же программу в моей школьной сети, вывод будет ошибочным 32: Broken Pipe

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...