온라인 음악 플레이어의 시뮬레이션 (데이터베이스 + 소켓 (TCP 프로토콜))
1은 C / S 아키텍처 설계를 사용하여, 각각의 클라이언트와 서버 프로그램을 작성하는
2, 클라이언트 연결된 서버 후, 서버는 사용자가 선택한 후 (오디오 파일을 로컬로 저장 될 수있다) 재생을 시작하도록 선택할 수 있습니다 사용자에게 노래 목록을 묻는 메시지를 표시합니다. 당신은 일시 정지, 노래 및 기타 기능에 필요하지 않습니다
도 3에서, 패키지들은 공통 툴 모듈 (평 파일)로서 기능해야하며 통화 실시
데이터베이스의 데이터를 만들기 1
. 1 1. 데이터베이스 만들기. (2)를 작성 데이터베이스 노래; . 3 사용 의 노래; . 4 . 5 2 . 테이블을 만듭니다 . (6) 작성 테이블 (t_list를 . 7 ID INT 차 키 AUTO_INCREMENT, . 8 이름 VARCHAR ( 32 ) 아니 널 , . 9 링크 VARCHAR ( 2000 ) 아니 널 (null) (10) )
. 11 . 3 . 데이터베이스 데이터를 호출)는 (나중에 재생 파일을 컴퓨터에 로컬 링크 경로 음악 파일을 넣어 후자 필드 필요성을 삽입 (12) 삽입 에 t_list (이름, 링크) 값 ( ' stay_with_me ' , ' /Users/.../StayWithMe.mp3 ' ); (13) 삽입 에 t_list (이름, 링크) 값 ( ' 가상 폭동 리프트 Me_Up ' , ' /Users/.../VirtualRiotLiftMe_Up.mp3 ' ); (14) 삽입 에 t_list (이름, 링크) 값 ( ' 阿刁' , ' /Users/.../阿刁.MP3 ' );
몇 가지 간단한 패키지를 할 수있는 데이터베이스의 기능 평 파일 2. (db_helper.py)
. 1 가져 오기 pymysql 2 3. 4. DEF get_conn () : #은 개별 포장하기 위해 데이터베이스에 연결 . 5 = CON을 pymysql.connect ( . 6 호스트 = ' 로컬 호스트를 ' , . 7 사용자 = ' 루트 ' , . 8 암호를 = '123123을 ' , . 9 DB = ' 노래 ' , 데이터베이스 이름 # DB 조회의 목표 값과 동일한 10 캐릭터 = ' UTF8 ' . 11 ) (12)가 복귀 CON 13 인 14 15 DEF의 search_s (SQL) # 패키지 기능하도록 데이터베이스를 쿼리 16 CON이 = get_conn () . (17)는 커서 = con.cursor ()가 18 인 cursor.execute (SQL) . 19 데이터 = cursor.fetchall () (20)는 리턴 데이터 (21)가 22 인 23을 DEF instert_s (SQL) 데이터베이스에 데이터를 삽입 # 1 (이하에서 본) 패키지를 만드는 24 CON = get_conn () 25 커서 = con.cursor () (26)는 cursor.execute (SQL) 27 con.commit ()
3. 쓰기 소켓 서버
주요 기능 : 소켓 클라이언트 통신과 노래의 클라이언트 데이터베이스 목록으로 전송이 곡 번호는 사용자가 선택한 로컬 경로로 데이터베이스에서 서버 쿼리는 클라이언트에 노래에 해당하는
. 1 에서 소켓 가져 오기 * 2 에서 db_helper 가져 오기 * 평 파일 이름 db_helper #은 패키지 데이터베이스 기능 이상 . 3 가져 오기 구조체 . 4 . 5 . 6 서버 = 일반 설정 소켓 () # 소켓 서버 . 7 server.setsockopt (SOL_SOCKET의 SO_REUSEADDR ,. 1 ) . 8 server.bind (( '' , 8081 )) 9. server.listen (5. ) 10 (11). 인쇄 ( " 서버 시작 ... ' ) (12)는 13가 그동안 참 : 14 LST =[] (15) 합계 = ' 16 . 17 newsocket, ADDR = server.accept () 18이다 recv_data = newsocket.recv (1024 ) . 19 20 DB_DATA = search_s ( ' SELECT ID, t_list에서 이름 ' ) db_helper에서 # 전화 질의에있어서, 데이터베이스 ID 곡으로부터 취득 (21)가 22 것은 대한 I 에 DB_DATA : 23는 새로운 신규 STR = (I [0]) + ' ' + I [1. ] 24 lst.append (새로운 신규) (25) (26)는 총 = ' & ' .join을 (LST) 27 = name_len 렌 (총) (28) (29) 길이 다음 struct.pack = ( ' I ' 는 name_len) 클라이언트에 문자열 # 구조체 패키지의 길이는 (서버가 문제를 딥 패키지를 해결 소켓) (30) newsocket.send (길이) (31)는 newsocket .send (total.encode는 ()) (32) (33)는 선택 1 = newsocket.recv (1024 ) 34되는 S = select1.decode () 35 db_data1의 search_s = (F ' {S} WHERE ID =로부터 링크 t_list SELECT ' 취득한 사용자 #) 곡 ID를 선택한 후, 링크에 대응하는 곡 데이터베이스 쿼리하는 36 37 클라이언트 링크 newsocket.send (db_data1 [0] [0] 함수 .encode ())를 송신한다 #
4. 소켓 클라이언트
통신은 서버 소켓 현지 음악 파일을 재생을 시작, 서버 및 인쇄에 의해 전송 된 데이터가 서버에 곡 번호를 선택하도록 사용자에게 보내 수신 링크에 액세스 : 주요 기능
1 임포트 소켓 2 임포트 서브 프로세스 (3) 수입 구조체 4 5 LST = [] 6 7 클라이언트 = socket.socket () 소켓 #客户端常规设置 8 client.connect (( ' 127.0.0.1 ' , 8081 )) (9) (10) 동안 참 : 11 client.send ( ' song_list ' 함수 .encode ()) 12 recv_num = client.recv (4 ) 13 TOTAL_SIZE struct.unpack = ( ' I ' , recv_num) [0] 14 15 recv_size = 0 16 recv_msg = B ' (17) (18) 동안 recv_size < TOTAL_SIZE : 19 20 every_recv client.recv = (1,024 ) 21 recv_msg + = every_recv 22 recv_size + = LEN (every_recv) 23 24 DATA1 = recv_msg.decode () 25 26 lst1 data1.split = ( ' & ' ) (27) (28) 에 대한 I 에서 lst1 : 29 프린트(i)는 상기 서버로부터 수신 # 노래리스트를 출력하는 30 BREAK 31이고 32 은 try : 33 선택 = INPUT ( " ID를 입력 ' ) .strip ()을 (34)가 35 client.send (choose.encode ()) 36 파일명 = 클라이언트 .recv (1024 ) .decode ()는 서버로부터 송신되는 노래 # 로컬 경로를 가져 37 38은 인쇄 ( " 노래 재생 ... ' ) 39 return_code의 subprocess.call = ([ " afplay " , 파일명]) (40) (41)가된다 client.close () (42)가 43 인 제외 예외 : 44 인 통과하다