티스토리 뷰

Server :
※HOST정보는 알아서 수정. 서버측은 자신을 가르킨다고 생각하며 됨.
자신의 컴퓨터에서 서버와 클라이언트 다 돌린다고 한다면,
HOST = "127.0.0.1"
로 해도 무방하다.
import socket

HOST = "192.168.8.1"
PORT = 4000

mysocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
mysocket.bind((HOST, PORT)) #Server Binding...
hosts = [] #접속된 클라이언트들의 주소를 담는 부분

while 1:
    print "Listening...\n"
    packet, address = mysocket.recvfrom(1024)
    if not(hosts.count(address)): #접속된 클라이언트가 리스트에 없으면..
        hosts.append(address) # 정보를 리스트에 넣는다.

    print "Connect hosts : ",hosts
    print "Packet recevied"
    print "From : %s, port : %s"%(address[0],address[1])
    print "Length : ",len(packet)
    print "Content : ",packet

    if (packet == "quit"):
        mysocket.sendto("quit",address)
        hosts.remove(address) # 클라이언트에서 종료하면 리스트에서 뺀다.
        if not(len(hosts)):break # 리스트에 아무것도 없으면 서버도 종료.
    else:
        print "\nEcho data!"
        mysocket.sendto(packet,address)

mysocket.close()

Client :

import socket
HOST = "192.168.8.1"
PORT = 4000
 
mysocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
 
while 1:
        packet = raw_input("Packet >>> ")
        print "\nSending data >>> ",packet
        mysocket.sendto(packet,(HOST,PORT))
        print "Packet sended.."
 
        packet, address = mysocket.recvfrom(1024)
        if(packet == "quit"):
                print "quit!!"
                break
 
        print "Packet recevied!"
        print "From : %s, Port : %s"%(address[0],address[1])
        print "Length : ",len(packet)
        print "Packet : ",packet       
        print "\n"
 
mysocket.close()

비연결 지향은 재미있게도, 백로그를 지정하여 서버측에서 리스닝을 하지 않는다. 그런 점은 클라이언트 프로그램을 이용하여 구나 서버가 Binding되어 있으면 접속하여 작업요청을 수행 할 수 있다는 점이다.

서버는 한군데 돌리고, 여러군데에서 클라이언트 프로그램을 돌려도 모두 서버에 접속되고 동작가능하다.

어드레스 리스트를 이용해서 접속된 클라이언트들을 확인할 수 있다.

어드레스 리스트에 정보가 없으면 종료!
댓글
댓글쓰기 폼