Python 은 Socket 을 바탕 으로 간단 한 다 중 채 팅 방 의 예제 코드 를 실현 합 니 다.
소켓(Sockets)은 양 방향 통신 채널 의 점 이다.소켓 은 하나의 프로 세 스 내 에서 같은 기계 의 프로 세 스 사이 또는 서로 다른 호스트 의 프로 세 스 사이 에서 통신 할 수 있 습 니 다.호스트 는 인터넷 을 연결 하 는 모든 기계 일 수 있 습 니 다.
소켓 은 유 닉 스 도 메 인 소켓,TCP,UDP 등 다양한 채널 형식 을 통 해 이 루어 질 수 있 습 니 다.소켓 라 이브 러 리 는 공공 전송 을 처리 하 는 특정 클래스 와 나머지 부분 을 처리 하 는 유 니 버 설 인 터 페 이 스 를 제공 합 니 다.
소켓 모듈:
소켓 을 만 들 려 면 소켓 모듈 의 socket.socket()함 수 를 사용 해 야 합 니 다.이 함 수 는 일반 문법 을 가지 고 있 습 니 다.
s = socket.socket (socket_family, socket_type, protocol = 0)
매개 변수묘사 하 다.
socket_family
그것 의 값 은:AFUNIX 또는 AFINET,앞에서 말 한 바 와 같다.
socket_type
그것 의 값 은:SOCKSTREAM 또는 SOCKDGRAM。
protocol
이것 은 보통 생략 되 고 기본 값 은 0 이다.
상용 방법:
번호
방법.
묘사 하 다.
1
s.bind()
이 방법 은 주소(호스트 이름,포트 번호 쌍)를 소켓 에 연결 합 니 다.
2
s.recvfrom()
이 방법 은 UDP 메 시 지 를 수신 합 니 다.반환 값 은 한 쌍(바이트,주소)입 니 다.그 중에서 바이트 는 받 은 데 이 터 를 대표 하 는 바이트 대상 이 고 주 소 는 데 이 터 를 보 내 는 소켓 의 주소 입 니 다.
3
s.sendto()
이 방법 은 UDP 메 시 지 를 보 내 소켓 에 데 이 터 를 보 냅 니 다.이 소켓 은 원 격 소켓 에 연결 해 서 는 안 됩 니 다.대상 소켓 은 address 에서 지정 하기 때 문 입 니 다.
4
s.close()
이 방법 은 소켓 을 닫 습 니 다.소켓 대상 의 모든 작업 이 실 패 됩 니 다.원 격 은 더 이상 데 이 터 를 받 지 않 습 니 다.소켓 은 쓰레기 수 거 시 자동 으로 닫 힙 니 다.
5
socket.gethostname()
호스트 이름 을 되 돌려 주 고 현재 Python 해석 기 를 실행 하고 있 는 컴퓨터 의 호스트 이름 을 포함 하 는 문자열 을 되 돌려 줍 니 다.
예시 1
서버 쪽
#sever.py
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
host = socket.gethostname()
port = 8088
s.bind((host,port))
try:
while True:
receive_data,addr = s.recvfrom(1024)
print(" " + str(addr) + " :")
print(receive_data.decode('utf-8'))
msg = input('please input send to msg:')
s.sendto(msg.encode('utf-8'),addr)
except:
s.close()
클 라 이언 트
#client.py
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
try:
while True:
host = socket.gethostname()
port = 8088
send_data = input('please input msg:')
s.sendto(send_data.encode('utf-8'),(host,port))
msg,addr = s.recvfrom(1024)
print(" " + str(addr) + " :")
print(msg.decode('utf-8'))
except:
s.close()
서버 예제클 라 이언 트 예제
간단 한 UDP 채 팅 이 이 루어 졌 으 니 예 시 를 최적화 해 보 자.
예시 2
서버:
#server.py
import socket
import logging
def main():
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # socket
addr = ('127.0.0.1', 9999)
s.bind(addr) #
logging.info('UDP Server on %s:%s...', addr[0], addr[1])
user = {} # {addr:name}
while True:
try:
data, addr = s.recvfrom(1024) # 2 data addr
if not addr in user: # addr user
for address in user: # user address
s.sendto(data + ' ...'.encode('utf-8'), address) # user data address
user[addr] = data.decode('utf-8') # utf-8 user , addr
continue # addr user ,
if 'EXIT'.lower() in data.decode('utf-8'):# EXIT data
name = user[addr] #user addr name
user.pop(addr) # user addr
for address in user: # user address
s.sendto((name + ' ...').encode(), address) # name address
else:
print('"%s" from %s:%s' %(data.decode('utf-8'), addr[0], addr[1]))
for address in user: # user address
if address != addr: #address addr
s.sendto(data, address) # data address
except ConnectionResetError:
logging.warning('Someone left unexcept.')
if __name__ == '__main__':
main()
클 라 이언 트:
#clinet.py
import socket
import threading
def recv(sock, addr):
'''
UDP
send , win
'''
sock.sendto(name.encode('utf-8'), addr)
while True:
data = sock.recv(1024)
print(data.decode('utf-8'))
def send(sock, addr):
'''
:
sock: socket
server: IP
'''
while True:
string = input('')
message = name + ' : ' + string
data = message.encode('utf-8')
sock.sendto(data, addr)
if string.lower() == 'EXIT'.lower():
break
def main():
'''
,
'''
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server = ('127.0.0.1', 9999)
tr = threading.Thread(target=recv, args=(s, server), daemon=True)
ts = threading.Thread(target=send, args=(s, server))
tr.start()
ts.start()
ts.join()
s.close()
if __name__ == '__main__':
print("----- , 'EXIT( )'-----")
name = input(' :')
print('-----------------%s------------------' % name)
main()
여러 명의 간단 한 채 팅 방 예 시 를 지원 하고 여러 클 라 이언 트 가 한 서버 를 통 해 통신 합 니 다.파 이 썬 이 Socket 을 기반 으로 간단 한 다 중 채 팅 방 을 실현 하 는 예제 코드 에 관 한 글 은 여기까지 소개 되 었 습 니 다.더 많은 파 이 썬 Socket 다 중 채 팅 방 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 저 를 많이 응원 해 주세요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.