オンライン音楽プレーヤーのシミュレーション(データベース+ソケット(TCPプロトコル))
1、クライアントとサーバーのプログラムを記述するために、それぞれ、C / Sアーキテクチャ設計を使用して、
図2は、クライアントリンクサーバーた後、サーバは、ユーザが選択した後(オーディオファイルがローカルに保存することができます)再生を開始するかを選択することができ、ユーザに曲のリストを要求します。あなたは、一時停止、曲や他の機能には必要ありません。
図3に示すように、パッケージは、共通のツールモジュール(の.pyファイル)として機能する必要があり、通話に供します
データベースのデータを作成します。1.
1 1。データベースの作成。 2を 作成し 、データベースソング; 3 使用ソング; 4 5。 2 テーブルを作成する。 6。 作成 テーブル(t_listを 7。 ID INT 主 キーAUTO_INCREMENT、 8。 名VARCHAR(32)はありません ヌル、 9。 リンクVARCHAR(2000)ていない ヌル 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 ')。
いくつかの簡単なパッケージを行うには、データベース内の関数の.pyファイル2.(db_helper.py)
1 インポートpymysql 2 3。 4。 DEF get_conn():個別に包装するためにデータベースに#接続 5。 CON = pymysql.connect( 6。 HOST = ' ローカルホストを' 、 7。 ユーザー= ' ルート' 、 8。 パスワード= '123123 ' 、 9。 DB = ' 歌' 、データベース名は、#DBクエリーの所望の値に等しい 10 のcharset = ' UTF8 ' 。11 ) 12であり、 リターンCON 13のIS 14 15 DEF SEARCH_S(SQL):#はパッケージの機能を行うためにデータベースに照会 16 CON = get_conn() 17。 カーソル= con.cursor() 18は cursor.execute(SQL) 19。 データ= cursor.fetchall() 20が リターンデータ である21 22がある 23のIS DEF instert_s(SQL):#パッケージを製造するためにデータベースにデータを挿入する(以下で存在する) 24 CON = get_conn() 25 カーソル= con.cursor() 26は cursor.execute(SQL) 27 (con.commit)
3.書き込みソケットサーバ
主な機能:ソケットクライアント通信と、曲のクライアントデータベースのリストに送信され、ユーザーが選択した曲の数、データベースからサーバークエリクライアントに歌に対応するローカルパスに
1 からソケットインポート * 2 から db_helper インポート *#の.pyファイル名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であり 、一方TRUE: 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であり、 (I [0])=新しい新しいSTR + ' ' + I [1 ] 24 lst.append(新しい新しい) 25 26である 合計= ' &' .join (LST) 27 = name_len LEN(合計) 28 29 長struct.packは=(' I ' クライアントに文字列#構造体のパッケージの長さによって、name_len)(サーバが問題のDIPパッケージを解決するためのソケット) 30 newsocket.send(長さ) 31がある newsocket .send(total.encode()) 32 33は、 SELECT1 = newsocket.recv(1024 ) 34である S = select1.decode() 35 db_data1 SEARCH_S =(F ' ID = {S}からSELECT t_listリンク' )、取得したユーザ#楽曲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 ながらTRUE: 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(1024 ) 21 recv_msg + = every_recv 22 recv_size + = LEN(every_recv) 23 24 DATA1 = recv_msg.decode() 25 26 LST1 = data1.split(' &' ) 27 28 のために私にLST1: 29 プリントソングリストを印刷するために、サーバから受信した(I)# 30 BREAK 31は、 32 トライ: 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であります パス