파이썬 패키지를 윈도우 cmd 터미널 창에서 설치할 수 있듯이, 파이참 내부에서도 해당 동일한 터미널 환경을 제공한다. 이를 이용해 pip 명령어로 패키지 설치가 가능하다. 또한 GUI환경으로 손쉽게 어떤 패키지가 설치되어있는지 알려주고 없는 패키지를 설치 할 수 있다.
<<터미널로 설치>>
1. 하단에 Terminal을 클릭하면, 터미널 환경으로 바뀐다.
2. 테스트로 numpy 패키지를 설치해봤다.
pip install numpy
이런식으로 손쉽게 설치가 가능하다.
<<GUI 로 설치>>
1. File - Settings
2. Project탭에 Python Interpreter를 선택하면, 어떤 패키지가 설치되어있는지 항목과 버전이 나온다.
하나의 컴퓨터가 서버로 코드를 구동하면, 여러 클라이언트들이 접속해서 대화를 나눌 수 있다.
아래는 소스코드
(서버 코드)
import socketserver
import threading
HOST = '192.168.219.104' # 서버의 ip를 열음. (이 서버의 ip로 클라이언트가 접속을 해야 한다), 그전에 ping을 먼저 확인하도록.
PORT = 9009 # 포트번호 (같아야 함)
lock = threading.Lock() # syncronized 동기화 진행하는 스레드 생성
class UserManager: # 사용자관리 및 채팅 메세지 전송을 담당하는 클래스
# ① 채팅 서버로 입장한 사용자의 등록
# ② 채팅을 종료하는 사용자의 퇴장 관리
# ③ 사용자가 입장하고 퇴장하는 관리
# ④ 사용자가 입력한 메세지를 채팅 서버에 접속한 모두에게 전송
def __init__(self):
self.users = {} # 사용자의 등록 정보를 담을 사전 {사용자 이름:(소켓,주소),...}
def addUser(self, username, conn, addr): # 사용자 ID를 self.users에 추가하는 함수
if username in self.users: # 이미 등록된 사용자라면
conn.send('이미 등록된 사용자입니다.\n'.encode())
return None
# 새로운 사용자를 등록함
lock.acquire() # 스레드 동기화를 막기위한 락
self.users[username] = (conn, addr)
lock.release() # 업데이트 후 락 해제
self.sendMessageToAll('[%s]님이 입장했습니다.' % username)
print('+++ 대화 참여자 수 [%d]' % len(self.users))
return username
def removeUser(self, username): # 사용자를 제거하는 함수
if username not in self.users:
return
lock.acquire()
del self.users[username]
lock.release()
self.sendMessageToAll('[%s]님이 퇴장했습니다.' % username)
print('--- 대화 참여자 수 [%d]' % len(self.users))
def messageHandler(self, username, msg): # 전송한 msg를 처리하는 부분
if msg[0] != '/': # 보낸 메세지의 첫문자가 '/'가 아니면
self.sendMessageToAll('[%s] %s' % (username, msg))
return
if msg.strip() == '/quit': # 보낸 메세지가 'quit'이면
self.removeUser(username)
return -1
def sendMessageToAll(self, msg):
for conn, addr in self.users.values():
conn.send(msg.encode())
class MyTcpHandler(socketserver.BaseRequestHandler):
userman = UserManager()
def handle(self): # 클라이언트가 접속시 클라이언트 주소 출력
print('[%s] 연결됨' % self.client_address[0])
try:
username = self.registerUsername()
msg = self.request.recv(1024)
while msg:
print(msg.decode())
if self.userman.messageHandler(username, msg.decode()) == -1:
self.request.close()
break
msg = self.request.recv(1024)
except Exception as e:
print(e)
print('[%s] 접속종료' % self.client_address[0])
self.userman.removeUser(username)
def registerUsername(self):
while True:
self.request.send('로그인ID:'.encode())
username = self.request.recv(1024)
username = username.decode().strip()
if self.userman.addUser(username, self.request, self.client_address):
return username
class ChatingServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
pass
def runServer():
print('+++ 채팅 서버를 시작합니다.')
print('+++ 채텅 서버를 끝내려면 Ctrl-C를 누르세요.')
try:
server = ChatingServer((HOST, PORT), MyTcpHandler)
server.serve_forever()
except KeyboardInterrupt:
print('--- 채팅 서버를 종료합니다.')
server.shutdown()
server.server_close()
runServer()
반응형
서버 사용 방법.
cmd로 해당 파이썬 파일을 실행시키며 구동.
서버 구동.
1. cmd 입력
2. 내 ip주소 확인
ipconfig
서버의 ip주소를 192.168.219.104 로 한다.
3. 해당 ip주소로 파이썬 server.py 코드를 수정해준다.
4. 해당 디렉터리로 이동해서 명령 프롬프트로 아래와 같이 쓰면 서버가 실행된다.
python server.py
클라이언트 사용 방법.
cmd로 해당 파이썬 파일을 실행시키며 구동.
(클라이언트 소스코드)
import socket
from threading import Thread
HOST = '192.168.219.104' # 내가 접속할 서버의 ip주소
PORT = 9009 # 서버의 포트 번호 (서로 같아야 연결 가능)
def rcvMsg(sock):
while True:
try:
data = sock.recv(1024)
if not data:
break
print(data.decode())
except:
pass
def runChat():
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
sock.connect((HOST, PORT))
t = Thread(target=rcvMsg, args=(sock,))
t.daemon = True
t.start()
while True:
msg = input()
if msg == '/quit':
sock.send(msg.encode())
break
sock.send(msg.encode())
runChat()
클라이언트 구동.
1. cmd 입력
2. 접속할 서버의 ip주소로 파이썬 client.py 코드를 수정해준다.
3. 그리고 같은 공유기 망에 있는 어떤 컴퓨터든 간에 명령프롬프트로 client.py를 실행시키면 접속이 된다.
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('192.168.109.226', 9008)) # ip주소, 포트번호 지정
server_socket.listen(0) # 클라이언트의 연결요청을 기다리는 상태
client_socket, addr = server_socket.accept() # 연결 요청을 수락함. 그러면 아이피주소, 포트등 데이터를 return
data = client_socket.recv(65535) # 클라이언트로 부터 데이터를 받음. 출력되는 버퍼 사이즈. (만약 2할 경우, 2개의 데이터만 전송됨)
print("받은 데이터:", data.decode()) # 받은 데이터를 해석함.
반응형
클라이언트 코드
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('192.168.109.226', 9008)) # 접속할 서버의 ip주소와 포트번호를 입력.
sock.send('Hello'.encode()) # 내가 전송할 데이터를 보냄.
내부망(공유기)으로 2대의 컴퓨터나 가상머신으로 테스트해보면 된다.
본인 ip주소는 ipconfig로 찾고, 포트는 안쓰는 포트 아무거나 적어서 테스트 해본다.
import math
from sympy import symbols, Limit # pip install sympy
x, a, h = symbols('x, a, h')
fx = 3 * (x**2) - 4 * x + 1 # 함수 f(x) 정의
fxa = fx.subs({x: a}) # f(x)에 x = a 대입
fxh = fx.subs({x: a + h}) # f(x)에 x = a + h 대입
result = Limit( (fxh - fxa)/h, h, 0 ).doit() # 극한값(미분계수) 계산
print(fx)
print(fxa)
print(fxh)
print("미분 Result:", result)