복붙노트

[PYTHON] 파이썬에서 "connection refused"오류가 발생하는 이유는 무엇입니까? (소켓)

PYTHON

파이썬에서 "connection refused"오류가 발생하는 이유는 무엇입니까? (소켓)

나는 소켓에 대해 처음이야, 이해가 부족하다는 것을 완전히 용서해주십시오.

나는 서버 스크립트 (server.py)를 가지고있다 :

#!/usr/bin/python

import socket #import the socket module

s = socket.socket() #Create a socket object
host = socket.gethostname() #Get the local machine name
port = 12397 # Reserve a port for your service
s.bind((host,port)) #Bind to the port

s.listen(5) #Wait for the client connection
while True:
    c,addr = s.accept() #Establish a connection with the client
    print "Got connection from", addr
    c.send("Thank you for connecting!")
    c.close()

및 클라이언트 스크립트 (client.py) :

#!/usr/bin/python 

import socket #import socket module

s = socket.socket() #create a socket object
host = '192.168.1.94' #Host i.p
port = 12397 #Reserve a port for your service

s.connect((host,port))
print s.recv(1024)
s.close

바탕 화면의 터미널로 이동하여 다음을 입력하여 스크립트를 시작합니다.

python server.py

그 후에, 나는 랩톱 단말기로 가서 클라이언트 스크립트를 시작한다.

python client.py

하지만 다음과 같은 오류가 발생합니다 :

나는 아무 소용이 다른 포트 번호를 사용하여 시도했다. 그러나 클라이언트 스크립트에서 동일한 IP 및 gethostname () 메소드를 사용하여 호스트 이름을 가져올 수 있었고 데스크탑 (서버)에 ping을 수행 할 수있었습니다.

해결법

  1. ==============================

    1.대신에

    대신에

    host = socket.gethostname() #Get the local machine name
    port = 12397 # Reserve a port for your service
    s.bind((host,port)) #Bind to the port
    

    너는 해봐야 해.

    port = 12397 # Reserve a port for your service
    s.bind(('', port)) #Bind to the port
    

    그래서 청취 소켓은 너무 제한되지 않습니다. 그렇지 않은 경우 수신은 로컬 네트워크와 관련이없는 하나의 인터페이스에서만 발생합니다.

    하나의 예는 127.0.0.1만을 수신하므로 다른 호스트에서 연결할 수 없습니다.

  2. ==============================

    2.이 오류는 어떤 이유로 클라이언트가 서버 스크립트를 실행중인 컴퓨터의 포트에 연결할 수 없음을 의미합니다. 이것은 목적지에 대한 라우팅 부족과 같은 몇 가지 문제로 인해 발생할 수 있지만 서버에 ping을 수행 할 수 있기 때문에 그렇게해서는 안됩니다. 다른 이유는 클라이언트와 서버 사이의 방화벽이 서버 자체 또는 클라이언트에있을 수 있기 때문일 수 있습니다. 귀하의 네트워크 주소 지정을 감안할 때, 나는 서버와 클라이언트가 모두 동일한 LAN에 있다고 가정하므로 트래픽을 차단할 수있는 라우터가 있어서는 안됩니다. 이 경우 다음을 시도해 보겠습니다.

    이 오류는 어떤 이유로 클라이언트가 서버 스크립트를 실행중인 컴퓨터의 포트에 연결할 수 없음을 의미합니다. 이것은 목적지에 대한 라우팅 부족과 같은 몇 가지 문제로 인해 발생할 수 있지만 서버에 ping을 수행 할 수 있기 때문에 그렇게해서는 안됩니다. 다른 이유는 클라이언트와 서버 사이의 방화벽이 서버 자체 또는 클라이언트에있을 수 있기 때문일 수 있습니다. 귀하의 네트워크 주소 지정을 감안할 때, 나는 서버와 클라이언트가 모두 동일한 LAN에 있다고 가정하므로 트래픽을 차단할 수있는 라우터가 있어서는 안됩니다. 이 경우 다음을 시도해 보겠습니다.

    그 결과를 저희에게 알려주십시오.

  3. ==============================

    3.

    host = socket.gethostname()  # Get the local machine name
    port = 12397                 # Reserve a port for your service
    s.bind((host,port))          # Bind to the port
    

    이 오류는 DNS 확인과 관련이 있다고 생각합니다. 이 문장의 host = socket.gethostname ()은 호스트 이름을 얻지 만 운영 체제가 호스트 이름을 로컬 주소로 해석 할 수없는 경우 오류가 발생합니다. 리눅스 운영 체제는 / etc / hosts 파일을 수정하고 그 안에 한 줄을 추가 할 수 있습니다. 아래처럼 보입니다 ( 'hostname'은 socket.gethostname ()이 가진 것입니다).

    127.0.0.1   hostname
    
  4. ==============================

    4.터미널에서 다음 명령을 시도하십시오.

    터미널에서 다음 명령을 시도하십시오.

    sudo ufw enable
    ufw allow 12397
    
  5. ==============================

    5.s = socket.socket ()이라고 가정합니다. 서버는 다음과 같은 방법으로 바인딩 될 수 있습니다. 방법 1 :

    s = socket.socket ()이라고 가정합니다. 서버는 다음과 같은 방법으로 바인딩 될 수 있습니다. 방법 1 :

    host = socket.gethostname()
    s.bind((host, port))
    

    방법 2 :

    host = socket.gethostbyname("localhost")  #Note the extra letters "by"
    s.bind((host, port))
    

    방법 3 :

    host = socket.gethostbyname("192.168.1.48")
    s.bind((host, port))
    

    클라이언트 측에서 똑같은 메소드를 정확하게 사용하지 않으면, 에러가 발생합니다 : socket.error errno 111 connection refused.

    따라서 서버에서와 마찬가지로 클라이언트 측에서 정확히 동일한 방법으로 호스트를 가져와야합니다. 예를 들어 클라이언트의 경우 다음과 같은 방법을 사용합니다.

    방법 1 :

    host = socket.gethostname() 
    s.connect((host, port))
    

    방법 2 :

    host = socket.gethostbyname("localhost") # Get local machine name
    s.connect((host, port))
    

    방법 3 :

    host = socket.gethostbyname("192.168.1.48") # Get local machine name
    s.connect((host, port))
    

    희망이 문제를 해결합니다.

  6. ==============================

    6.host = socket.gethostname () 대신 server.py 파일의 make : host = '192.168.1.94'

    host = socket.gethostname () 대신 server.py 파일의 make : host = '192.168.1.94'

  7. from https://stackoverflow.com/questions/16130786/why-am-i-getting-the-error-connection-refused-in-python-sockets by cc-by-sa and MIT license