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 다 중 채 팅 방 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 저 를 많이 응원 해 주세요!

좋은 웹페이지 즐겨찾기