OSError: [WinError 10038] 소켓이 아닌 항목에서 작업을 시도했습니다.
이 설명을 통해 우리는 서버와 클라이언트가 무엇인지, 서버와 클라이언트의 도움으로 애플리케이션을 생성하기 위해 소켓
모듈을 사용하는 방법을 배웁니다. 또한 Python에서 이러한 유형의 응용 프로그램을 만들 때 오류를 피하는 방법도 배웁니다.
Python에서 오류 없이 socket
모듈의 도움으로 애플리케이션 만들기
인터넷에서 노드는 서버 또는 클라이언트가 될 수 있습니다. 물론 모든 노드가 있고 서로 대화하는 클라이언트 대 클라이언트 네트워크일 수도 있습니다. 피어 투 피어 네트워크입니다.
우리는 클라이언트를 청취하는 인터넷에 서버를 가지고 있으며 클라이언트가 요청을 보내기를 기다리고 있습니다.
예를 들어 Google 서버인 google.com
으로 이동하여 Google 서버에 요청을 보내면 Google 서버는 페이지 또는 페이지를 찾을 수 없음
메시지와 같은 일부 응답을 보냅니다.
demo.py
와 client.py
라는 두 개의 Python 파일을 생성하여 시작하겠습니다. 서버에서 클라이언트로 메시지를 보내려고 합니다.
서버와 클라이언트는 서로 다른 위치에 있거나 네트워크 외부에 있을 수 있습니다.
서버를 만든 다음 메시지를 전달하고 이 클라이언트가 서버에서 메시지를 받는 방법을 확인합니다. 간단하게 하기 위해 localhost에서 수행하지만 다른 시스템에서도 수행할 수 있습니다.
가장 먼저 해야 할 일은 소켓
을 가져오고 인스턴스를 만드는 것입니다. 소켓 클래스를 호출한 다음 소켓 제품군을 지정합니다.
소켓 제품군은 AF_INET
이고 소켓 공식은 SOCK_STREAM
입니다.
다음 단계에서는 bind()
메서드를 사용하여 소켓을 포트의 호스트 이름에 바인딩해야 합니다. 이제 listen()
메서드를 사용하여 연결을 수신해야 합니다. 최대 연결 수는 5입니다.
import socket
SKT = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
SKT.bind((socket.gethostname(), 6060))
SKT.listen(5)
클라이언트와의 연결을 찾기 위해 클라이언트가 메시지를 받도록 서버에서 메시지를 보냅니다.
이를 위해 True
인 while
루프를 사용합니다. 이 루프에서 connect()
메서드를 사용하여 클라이언트 소켓이 될 또 다른 소켓을 생성합니다. client.py
파일에서 사용됩니다.
우리는 두 개의 값을 반환하는 accept()
메서드를 사용하고 있습니다. 그것이 들어오는 소켓과 들어오는 연결의 주소를 저장하는 두 개의 변수를 선언한 이유입니다. 이제 지정된 주소에서 연결이 설정되었음을 나타내는 메시지를 인쇄합니다.
while True:
Client_Socket, Adress = SKT.accept()
print(f"Connection has been established from {Adress}")
이제 메시지를 바이트 단위로 보내야 합니다. 인코딩은 utf-8
이며 소켓과 연결된 각 클라이언트로 전송됩니다.
Client_Socket.send(bytes("Welcome to the server!!!", "utf-8"))
Client_Socket.close()
우리의 소켓은 연결을 들을 준비가 되어 있습니다. 이제 client.py
파일에서 작업하고 connect()
메서드를 제외한 동일한 코드를 사용합니다.
connect()
메서드에서 동일한 호스트 이름, localhost 및 포트를 사용합니다.
이제 서버에서 오는 메시지를 받을 것입니다. recv()
메서드를 사용하여 2048바이트로 전달합니다.
메시지 수신 여부를 확인하기 위해 이 메시지를 인쇄합니다.
import socket
SKT = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
SKT.connect((socket.gethostname(), 6060))
MSG = SKT.recv(2048)
print(f"Message has been received {MSG}")
이제 응용 프로그램이 완료되었으므로 먼저 서버인 demo.py
파일을 실행합니다. 실행 중이지만 아무 일도 일어나지 않았습니다. client.py
로 이동하여 대화형 창에서 이 파일을 실행하면 이 파일이 동시에 실행될 때 콘솔에서 응답을 볼 수 있습니다.
OSError: [WinError 10038] 소켓이 아닌 항목에서 작업을 시도했습니다
이 응용 프로그램을 만들 때 오류가 발생하는 몇 가지 일반적인 이유가 있습니다. 한 가지 이유는 둘 다 하나의 파일을 실행하는 것을 잊었거나 어디서든 실수를 하고 있기 때문일 수 있습니다.
사용자에게 종종 이 오류가 발생하는 예를 살펴보겠습니다.
import socket
SKT = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
SKT.bind((socket.gethostname(), 6060))
SKT.listen(5)
while True:
Client_Socket, Adress = SKT.accept()
while True:
print(f"Connection has been established from {Adress}")
Client_Socket.send(bytes("Welcome to the server!!!", "utf-8"))
Client_Socket.close()
출력:
OSError: [WinError 10038] An operation was attempted on something that is not a socket
중첩된 while
루프를 실행 중이고 둘 다 True
이기 때문입니다. 외부 while
루프가 실행되면 클라이언트에서 들어오는 연결을 수락합니다.
내부 while
루프가 실행될 때 문제가 발생합니다.
내부 while
루프가 처음에는 True
이므로 이 루프는 완벽하게 실행되지만 두 번째 반복에서는 while
루프가 들어오는 연결을 수락해야 합니다. accept()
메소드는 절대 호출되지 않는 외부 루프에서 호출합니다. 이것이 소켓이 더 이상 존재하지 않는 이유입니다.
문제가 발생할 수 있는 또 다른 이유는 터미널에서 이 두 파일을 실행할 때입니다. VS 코드에서 작업하는 경우 이 두 파일을 (대화형 창의 현재 파일)에서 개별적으로 실행합니다.
완전한 demo.py
파일 코드:
import socket
SKT = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
SKT.bind((socket.gethostname(), 6060))
SKT.listen(5)
while True:
Client_Socket, Adress = SKT.accept()
print(f"Connection has been established from {Adress}")
Client_Socket.send(bytes("Welcome to the server!!!", "utf-8"))
Client_Socket.close()
Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.
LinkedIn관련 문장 - Python Error
- AttributeError 수정: Python에서 'generator' 객체에 'next' 속성이 없습니다.
- AttributeError 해결: 'list' 객체 속성 'append'는 읽기 전용입니다.
- AttributeError 해결: Python에서 'Nonetype' 객체에 'Group' 속성이 없습니다.
- AttributeError: 'Dict' 객체에 Python의 'Append' 속성이 없습니다.
- AttributeError: 'NoneType' 객체에 Python의 'Text' 속성이 없습니다.
- AttributeError: Int 객체에 속성이 없습니다.