서버측 코드:
# -*- coding: cp936 -*- import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#初始化socket sock.bind(("127.0.0.1", 8001))#绑定本机地址,8001端口 sock.listen(5)#等待客户连接 while True: print "waiting client connection..." connection,address = sock.accept()#接收客户连接请求 print "a client have connected..." while True: try: connection.settimeout(5) #设置超时时间 buf = connection.recv(1024) #接收数据 if buf == "1": connection.send("you have send me 1!welcome to server!") elif buf=="2": connection.send("you have send me 2!I have recv!") elif buf=="3": connection.send("close the connection!") break else: connection.send("unknow command!") except socket.timeout: print "time out" connection.close() print "a client exit..."
클라이언트측 코드:
import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(("127.0.0.1", 8001)) import time time.sleep(2) while True: data=raw_input("input command:"); sock.send(data) print sock.recv(1024) if data=="3": break sock.close()
1. 먼저 두 개의 IDLE을 열고 서버측 코드와 클라이언트측 코드를 각각 엽니다.
2.F5는 서버 측 코드를 실행하고 클라이언트 연결 대기가 나타납니다...
3.F5는 클라이언트 측 코드를 실행하고 다음 명령이 나타납니다.
4. 서버와 클라이언트가 연결되었습니다. 이제 그림과 같이 정상적인 통신이 가능합니다.
5. 서버 측 코드를 다시 실행하면 오류가 발생합니다. 이번에는 작업 관리자를 사용하여 pythonw를 변경할 수 있습니다. .exe 프로세스가 끝난 후 다시 열고 컴파일하세요!
클라이언트:
import socket s=socket.socket() host = socket.gethostname() port = 1234 s.connect((host, port)) print s.recv(1024)
서버:
import socket s = socket.socket() host = socket.gethostname() port = 1234 s.bind((host, port)) s.listen(5) while True: c, addr = s.accept() print 'Got connection from', addr c.send('Thank you for connecting') c.close()
http 프로그래밍
from urllib import urlopen webpage = urlopen('http://www.python.org')
+정규 표현식
import re text = webpage.read() m = re.search('<a href="([^"]+)" .*?>about</a>', text, re.IGNORECASE) m.group(1)
urllib
urllib2
SocketServer 기반 소규모 서버의 예:
from SocketServer import TCPServer, StreamRequestHandler >>> class Handler(StreamRequestHandler): def handle(self): addr = self.request.getpeername() print 'Got connection from', addr self.wfile.write('Thank you for connecting') >>> server = TCPServer(('',1234), Handler) >>> server.serve_forever()
포킹 및 스레딩에 SocketServer 사용
포킹 서버:
from SocketServer import TCPServer,ForkingMinIn, StreamRequestHandler class Server(ForkingMinIn, TCPServer):pass class Handler(StreamRequestHandler): def handle(self): addr = self.request.getpeername() print 'Got connection from',addr self.wfile.write('Thank you for connection') server = Server(('',1234),Handler) server.serve_forever()
스레드 서버:
from SocketServer import TCPServer, ThreadingMixIn, StreamRequestHandler class Server(ThreadingMixIn, TCPServer):pass class Handler(StreamRequestHandler): def handle(self): addr = self.request.getpeername() print 'Got connection from',addr self.wfile.write('Thank you for connecting') server = Server(('',1234),Handler) server.serve_forever()
선택 및 풀을 사용하는 비동기 I/O
선택 서비스:
import socket, select s = socket.socket() host = socket.gethostname() prot = 1234 s.bind((host,port)) s.listen(5) inputs = [s] while True: rs,ws,es = select.select(inputs,[],[]) for r in rs: if r is s: c, addr = s.accept() print 'Got connection from',addr inputs.append(c) else: try: data = r.recv(1024) disconnected = not data except socket.error: disconnected = True if disconnected: print r.getpeername(), 'disconnected' inputs.remove(r) else: print data
풀 서버:
import socket, select s = socket.socket() host = socket.gethostname() port = 1234 s.bind((host, port)) fdmap = {s.fileno():s} s.listen(5) p = select.poll() p.register(s) while True: events = p.poll() for fd, event in events: if fd in fdmap: c, addr = s.accept() print 'Got connection from', addr p.register(c) fdmap[c.fileno()]=c elif event & select.POLLIN: data = fdmap[fd].recv(1024) if not data: print fdmap[fd].getpeername(),'disconnected' p.unregister(fd) del fdmap[fd] else: print data
더 보기 Python 네트워크 프로그래밍 공통 코드에 관한 기사는 PHP 중국어 웹사이트를 주목하세요!