본문 바로가기
조회 수 28845 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print
** socket() Module Function
: socket을 생성하기 위해 socket.socket() 함수를 사용한다.

형식: socket(socket_family, socket_type, protocol=0)

- socket_family: AF_UNIX (file-based), AF_INET (network-oriented)
- socket_type: SOCK_STREAM (tcp), SOCK_DGRAM (udp)
- protocol: 보통 생략한다. 기본값은 0

ex) TCP/IP 소켓 및 UDP/IP 소켓 객체 생성하기

>>> import socket
>>> tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

>>> type(tcpSock)
<class 'socket._socketobject'>

socket 모듈의 속성을 이름공간으로 가져와서 긴 이름 (module.function 및 module.attribute)대신 모듈을 제외한 function, attribute 이름만 사용하려면 아래와 같이 import 한다.

>>> from socket import *
>>> tcpSock = socket(AF_INET, SOCK_STREAM)


** Socket 객체의 내부 메소드

- 서버 Socket 메소드
s.bind() : 주소(hostname, port)를 소켓에 바인드
s.listen() : start TCP listener
s.accept()

- 클라이언트 Socket 메소드
s.connect()
s.connect_ex()

- 일반 Socket 메소드
s.recv()
s.send()
s.sendall()
...

- Blocking-Oriented Socket 메소드
s.setblocking()
s.settimeout()
s.gettimeout()

- File-Oriented Socket Methods
s.fileno()
s.makefile()

- Data Attributes
s.family()
s.type()
s.proto()

##################################################
# socket() 모듈을 사용해 TCP Server, client 생성
##################################################

** TCP Server pseudocode

ss = socket() # 서버소켓 생성
ss.bind() # 소켓을 주소와 바인딩
ss.listen() # 연결 listening
inf_loop: # 서버 무한루프
cs = ss.accept() # 클라이언트 요청수락
comm_loop: # 통신 루프
        cs.recv()/cs.send() # 송수신
    cs.close() # 클라이언트 소켓종료
ss.close() # 서버소켓 종료


** TCP timestamp 서버 예제
: 클라이언트의 요청을 받고 timestamp prefix를 리턴하는 서버

#!/usr/bin/python

from socket import *
from time import ctime <------ time.ctime() 함수를 import. 모듈이름 생략하고 ctime()이름으로 호출가능

HOST = '' <------ 공백으로 두어 bind() 메소드가 아무 가능한 주소를 사용할 수 있게 함
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)

tcpSerSock = socket(AF_INET, SOCK_STREAM) <------ tcp 서버소켓 할당. 객체생성
tcpSerSock.bind(ADDR) <------- 소켓을 주소로 바인딩
tcpSerSock.listen(5) <------ listening 시작. 최대 클라이언트 연결 수 5개

while True:
	print 'waiting for connection...'
	tcpCliSock, addr = tcpSerSock.accept()
	print '...connected from:', addr
	
	while True: <-------- 클라이언트 연결이 오면 이 dialog 루프로 들어가서 데이터가 수신을 기다림
		data = tcpCliSock.recv(BUFSIZ)
		if not data:
			break <------- 클라이언트 메시지가 공백이면 quit하고 다시 wait 상태로
		tcpCliSock.send('[%s] %s' % (ctime(), data)) <----- 데이터가 있으면 ctime()값과 data를 송신
	tcpCliSock.close() <------ 클라이언트 세션 종료
tcpSerSock.close() <------- 위 루프가 끝나지 않으므로 이 라인은 실행되지 않는다. just a remainder of close()

---------- output -------------
$ ./socket_test.py
waiting for connection...
...connected from: ('127.0.0.1', 55878)
waiting for connection...

------- from other terminal --------
$ netstat -an|grep 21567
tcp4       0      0  *.21567                *.*                    LISTEN     
$ telnet localhost 21567
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
TEST
[Wed Mar 27 05:07:24 2013] TEST
TEST2
[Wed Mar 27 05:07:29 2013] TEST2

(참고)
The final line is never executed; it is there as a reminder to the reader that a close() call should be made if a handler is written to allow for a more graceful exit, as we discussed earlier.


** TCP Client pseudocode

cs = socket() # create client socket
cs.connect() # 위에서 socket을 생성한 후 바로 서버 연결
comm_loop: # 연결 후 통신 루프 시작
    cs.send()/cs.recv() # 송수신
cs.close() # close client socket


** TCP Timestamp Client

#!/usr/bin/env python

from socket import * <------ socket 모듈에서 모든 속성을 import

HOST = 'localhost'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT) <------ tuple

tcpCliSock = socket(AF_INET, SOCK_STREAM) <---- socket 함수로 객체 생성
tcpCliSock.connect(ADDR) <----- 서버연결

while True:
	data = raw_input('> ') <------ 무한루프 시작 및 데이터입력 받기
	if not data: <------ 입력받은 데이터가 없으면 break
		break
	tcpCliSock.send(data) <------ 입력받은 데이터 서버로 전송
	data = tcpCliSock.recv(BUFSIZ) <------- 서버에서 전송받은 데이터를 data에 저장
	if not data:
		break
	print data
	
tcpCliSock.close()


---- from server -----
$ ./tsTserv3.py 
waiting for connection...
...connected from: ('127.0.0.1', 62758)
waiting for connection...

---- from client -----
$ ./tsTclnt.py 
> test
[Thu Mar 28 08:26:31 2013] test


** 참고: 정상적으로 세션을 close() 메소드를 이용해 종료하기
: 서버의 while 루프안에 try-except 문을 넣고 EOFError 또는 KeyboardInterrupt 예외를 모니터하는 것이다. 이 예외들이 발생하면 except 또는 finally 문에서 close() 메소드로 세션을 종료한다.


Title
List of Articles
번호 제목 글쓴이 날짜 조회 수
58 Python 2.7 in CentOS with no issue (setuptools, pip, virtualenv) Hojung 2014.08.31 3953
57 GUI 기본 file Hojung 2013.04.06 6163
56 Gmail SMTPx2, POP, IMAP Script Hojung 2013.04.06 3936
55 E-Mail 작성 및 발송 스크립트 Hojung 2013.04.06 4268
54 Interactive IMAP4 Script Hojung 2013.04.06 3605
53 SMTP and POP3 Script Hojung 2013.04.06 2646
52 Interactive POP3 Script file Hojung 2013.04.06 3151
51 Interactive SMTP Script Hojung 2013.04.06 2588
50 FTP Download Script Hojung 2013.04.06 7689
49 SocketServer 모듈을 사용해 TCP Server/Client 작성 Hojung 2013.04.06 6006
48 Network Programming - socket() 모듈을 사용해 UDP Server, client 생성 Hojung 2013.04.06 5766
» Network Programming - socket() 모듈을 사용해 TCP Server, client 생성 Hojung 2013.04.06 28845
46 brew install python on Mac OS X + pyqt, lxml and spynner Hojung 2013.03.29 5528
45 Regular Expression (search vs match 그리고 Greediness) file Hojung 2013.03.26 2831
44 Regular Expression - Extension Notations (?...) Hojung 2013.03.26 2651
43 Regular Expression (문자열을 RE를 이용 list 리턴) - split() Hojung 2013.03.26 3577
42 Regular Expression (찾기 및 바꾸기) - sub() and subn() Hojung 2013.03.26 2863
41 Regular Expression (찾기) - findall() and finditer() Hojung 2013.03.26 3791
40 Regular Expression (matching vs searching) Hojung 2013.03.23 9341
39 How to install pip, spynner, macports and py-pyqt4 Hojung 2013.03.22 3987
Board Pagination ‹ Prev 1 2 3 Next ›
/ 3

Designed by sketchbooks.co.kr / sketchbook5 board skin

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5