第10單元 網(wǎng)絡編程_第1頁
第10單元 網(wǎng)絡編程_第2頁
第10單元 網(wǎng)絡編程_第3頁
第10單元 網(wǎng)絡編程_第4頁
第10單元 網(wǎng)絡編程_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第10單元網(wǎng)絡編程任務10.1簡易聊天程序任務10.2遙控小畫家學習目標知識目標技能目標素質(zhì)目標

了解計算機網(wǎng)絡的概念。

了解TCP/IP及網(wǎng)絡協(xié)議分層。

掌握IP地址和端口的含義。

掌握Socket網(wǎng)絡編程基本原理和流程步驟。

能夠使用Socket開發(fā)基本的網(wǎng)絡客戶端和服務器端應用。

能夠區(qū)分TCP和UDP兩種編程模型的使用場景。

能夠使用線程實現(xiàn)網(wǎng)絡數(shù)據(jù)包的收發(fā)工作。

培養(yǎng)標準化的編碼規(guī)范能力。

培養(yǎng)創(chuàng)新能力以及分析問題和解決問題的能力。

培養(yǎng)團隊意識和溝通能力。

培養(yǎng)知識產(chǎn)權和數(shù)據(jù)安全意識。教學內(nèi)容任務10.1簡易聊天程序一、任務描述在一臺計算機上同時運行服務器端A和客戶端B,模擬實現(xiàn)兩個人的聊天過程。B運行后自動連接到A,并向A發(fā)送文字信息。A收到后,回復信息給B,以此重復,直到B發(fā)送給A的內(nèi)容是“bye”時,雙方通信結束。

AB二、相關知識1.計算機網(wǎng)絡的誕生早期隨著個人計算機的普及,計算機之間數(shù)據(jù)交互的過程越來越受到重視,最初,兩臺計算機之間交互數(shù)據(jù)的過程相當煩瑣。計算機網(wǎng)絡通信技術的發(fā)展(即計算機與計算機之間的通信線路連接),逐步解決了這個問題,這樣人們可以很輕松地即時讀取另一臺計算機中的數(shù)據(jù),從而極大地縮短了傳輸數(shù)據(jù)的時間。二、相關知識兩個人使用同一種語言交談,他們必然遵循某種特定“規(guī)則”(協(xié)議,比如漢語的語法就是一種協(xié)議)。兩臺計算機可以借助TCP/IP協(xié)議規(guī)則進行通信,以便互發(fā)數(shù)據(jù)。2.TCP/IP網(wǎng)絡通信協(xié)議計算機收發(fā)數(shù)據(jù)通信的過程,與人們在生活中的“信件”收發(fā)相似,這也是TCP/IP協(xié)議的基本原理二、相關知識兩個人使用同一種語言交談,他們必然遵循某種特定“規(guī)則”(協(xié)議,比如漢語的語法就是一種協(xié)議)。兩臺計算機可以借助TCP/IP協(xié)議規(guī)則進行通信,以便互發(fā)數(shù)據(jù)。2.TCP/IP網(wǎng)絡通信協(xié)議(1)寫好信的內(nèi)容并放入信封,對應圖中的步驟①(2)在信封上寫上收信人,對應圖中的步驟②(3)在信封上寫上收信地址,對應圖中的步驟③(4)將信封交給寫信人所在地的郵局,對應圖中的步驟④(5)收信人所在地的郵局收到信件,對應圖中的步驟⑤(6)郵局將信件送往收信地址,對應圖中的步驟⑥(7)郵局工作人員將信件轉交到收信人,對應圖中的步驟⑦(8)收信人拆開信封并閱讀信件內(nèi)容,對應圖中的步驟⑧二、相關知識通過“姓名”或“身份證號”可以標識社會中的每一個人,網(wǎng)絡中的計算機也需要通過某種特定手段來標識,這就是IP地址。為了在一臺機器上識別是哪個程序發(fā)送或接收的數(shù)據(jù),使用端口號來對應一個唯一的程序,類似于公司內(nèi)部的電話分機號碼。3.IP地址和端口二、相關知識Socket看作一種網(wǎng)絡間不同計算機上的進程通信的一種方法,簡化了應用層的網(wǎng)絡通信編程。Socket會以符合指定的協(xié)議格式組織數(shù)據(jù)進行收發(fā)工作,這些可以通過調(diào)用用socker庫方便地完成。4.Socket網(wǎng)絡編程在服務器端:(1)創(chuàng)建套接字并綁定到本地IP地址與端口s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)s.bind()(2)開始監(jiān)聽連接s.listen()(3)接受客戶端的連接請求s.accept()(4)接收傳來的數(shù)據(jù),或者發(fā)送數(shù)據(jù)給對方s.recv()和s.sendall()(5)傳輸完畢后,關閉套接字s.close()在客戶端:(1)創(chuàng)建套接字,連接服務器地址s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)s.connect()(2)連接后發(fā)送數(shù)據(jù)和接收數(shù)據(jù)s.sendall()和s.recv()(3)傳輸完畢后,關閉套接字s.close()三、任務分析

本任務首先要啟動服務器端A,然后啟動客戶端B并建立到服務器端的通信連接。連接之后,服務器端和客戶端各自持有一個到對方的socket對象,并通過socket對象來收發(fā)數(shù)據(jù)。假定B連接到A后,B先向A發(fā)送一條信息,當B接收到A的回復信息后,整個通信過程就宣告結束。當然,也可以根據(jù)需要調(diào)整A、B互發(fā)消息的步驟。四、任務實現(xiàn)(1)在PyCharm中,選擇“File”→“NewProject…”,在彈出的對話框中將項目命名為“chapter10”,單擊“Create”按鈕,創(chuàng)建新項目。(2)在PyCharm中,右擊左側列表中的項目名稱“chapter10”,選擇“New”→“PythonFile”,在彈出的對話框中將文件命名為“ServerA.py”,按“Enter”鍵,進入代碼編輯界面。(3)在新建的ServerA.py文件中,導入socket庫,設定服務器端監(jiān)聽的IP地址和端口,然后創(chuàng)建一個綁定IP地址和端口的socket對象,再通過listen()啟動對端口的監(jiān)聽,調(diào)用accept()等待客戶端的連接。importsocketip_port=('',9999)sock=socket.socket() #創(chuàng)建套接字sock.bind(ip_port) #綁定服務地址sock.listen(5) #開始監(jiān)聽連接請求print('啟動socket服務,等待客戶端連接...')conn,address=sock.accept() #等待連接,此處會自動阻塞四、任務實現(xiàn)(4)當客戶端連接過來后,需要使用conn來接收客戶端發(fā)送過來的數(shù)據(jù),也可以將數(shù)據(jù)發(fā)送給客戶端。下面的代碼用于實現(xiàn)服務器端收到客戶端的數(shù)據(jù)后,回送一個“bye”字符串,然后關閉與客戶端的連接,結束通信。至此,ServerA.py的代碼就完成了。(5)在PyCharm中,右擊左側列表中的項目名稱“chapter10”,選擇“New”→“PythonFile”,在彈出的對話框中將文件命名為“ClientB.py”,按“Enter”鍵,進入代碼編輯界面。data=conn.recv(1024).decode() #接收客戶端信息,1024代表接收緩沖區(qū)大小print("來自%s的客戶端向你發(fā)來信息:%s"%(address,data))conn.sendall('bye'.encode()) #返回信息給客戶端conn.close() #關閉連接四、任務實現(xiàn)(6)在新建的ClientB.py文件中,同樣導入socket庫,設定需要連接的服務器端IP地址和端口(取決于A所在計算機的IP地址和監(jiān)聽的端口),然后創(chuàng)建一個socket對象,調(diào)用connect()函數(shù)連接到服務器。(7)當客戶端成功連接到服務器后,A、B各自“持有”一個能夠發(fā)送和接收數(shù)據(jù)的socket對象。在這個例子中,客戶端B先向服務器端A發(fā)送一個數(shù)據(jù),然后等待服務器端A返回一個數(shù)據(jù),收到A返回的數(shù)據(jù)后即斷開網(wǎng)絡連接。importsocketip_port=('',9999)sock=socket.socket() #創(chuàng)建套接字sock.connect(ip_port) #連接到服務器inp=input("請輸入要發(fā)送的信息:").strip()sock.sendall(inp.encode()) #將數(shù)據(jù)發(fā)送給服務器reply=sock.recv(1024).decode()#等待接收服務器器發(fā)回的數(shù)據(jù),1024代表接收緩沖區(qū)大小print(reply)sock.close()#關閉連接四、任務實現(xiàn)(8)在服務器端和客戶端的代碼都準備好之后,需要先運行ServerA.py程序,然后運行ClientB.py程序。然后在ClientB輸入需要發(fā)送的信息如“hello”并按“Enter”鍵,此時可以看到ServerA程序運行的終端上顯示“hello”,同時ClientB程序運行的終端上顯示“bye”后結束。四、任務實現(xiàn)(9)上面代碼完成的只是一個最基本的網(wǎng)絡通信過程,只有一次信息交互。如果要實現(xiàn)聊天功能,可以在ServerA和ClientB的代碼中各增加一個循環(huán),在B向A發(fā)出一個信息后,A同時也給B回一個信息,即“一發(fā)一回”,重復執(zhí)行這個過程,直到B發(fā)出的信息是“bye”時結束循環(huán)。importsocketip_port=('',9999)sock=socket.socket() #創(chuàng)建套接字sock.bind(ip_port) #綁定服務地址sock.listen(5) #開始監(jiān)聽連接請求print('啟動socket服務,等待客戶端連接...')conn,address=sock.accept() #等待連接,此處會自動阻塞whileTrue:#通過一個死循環(huán)不斷接收客戶端的數(shù)據(jù),并回送信息

data=conn.recv(1024).decode() #接收客戶端信息

print("來自%s的客戶端向你發(fā)來信息:%s"%(address,data))ifdata=="bye":breakinp=input("請輸入要發(fā)送給B的信息:").strip()conn.sendall(inp.encode()) #回送信息給客戶端conn.close() #關閉連接ServerA代碼四、任務實現(xiàn)(9)上面代碼完成的只是一個最基本的網(wǎng)絡通信過程,只有一次信息交互。如果要實現(xiàn)聊天功能,可以在ServerA和ClientB的代碼中各增加一個循環(huán),在B向A發(fā)出一個信息后,A同時也給B回一個信息,即“一發(fā)一回”,重復執(zhí)行這個過程,直到B發(fā)出的信息是“bye”時結束循環(huán)。importsocketip_port=('',9999)sock=socket.socket() #創(chuàng)建套接字sock.connect(ip_port) #連接到服務器端whileTrue:#通過一個死循環(huán)不斷發(fā)送數(shù)據(jù)給服務器端,并接收回送的信息

inp=input("請輸入要發(fā)送給A的信息:").strip()sock.sendall(inp.encode()) #將數(shù)據(jù)發(fā)送給服務器端

ifinp=="bye":breakreply=sock.recv(1024).decode() #等待接收服務器端返回的數(shù)據(jù)

print(reply)sock.close() #關閉連接ClientB代碼任務10.2遙控小畫家一、任務描述分別編寫客戶端和服務器端程序,使用鼠標在客戶端的窗體中模仿畫筆進行繪圖操作,服務器端則按照客戶端相同的動作進行繪圖。Socket編程通常可分為TCP和UDP兩種,其中TCP是帶連接的可靠傳輸服務,傳輸?shù)臄?shù)據(jù)會被校驗,所以TCP是一種可靠的數(shù)據(jù)傳輸,這也是使用最廣的通用模式之一。二、相關知識1.Socket詳解UDP是一種無連接的非可靠數(shù)據(jù)傳輸方式,它的工作方式簡單、粗暴,對發(fā)送出去數(shù)據(jù)不加控制和檢查,因為少了一些步驟,所以傳輸速度相比TCP更快,但可能會造成部分數(shù)據(jù)丟失。撥打電話時,要對方確認才能通話信件寄出時對方不知道,可能會丟失二、相關知識2.Socket相關使用方法創(chuàng)建TCPSocket的代碼sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)(1)

socket對象的創(chuàng)建創(chuàng)建UDPSocket的代碼sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)二、相關知識(2)socket對象常用方法Socket網(wǎng)絡通信程序運行時,必須服務端先啟動,然后客戶端才能正常連接,兩者順序不能顛倒。二、相關知識(2)socket對象常用方法三、任務分析這項任務要解決兩個問題。1.啟動一個客戶端窗體,使用鼠標指針進行簡單的繪圖操作,類似于Windows畫筆程序;2.將客戶端鼠標指針移動時的坐標值,通過socket發(fā)送給服務器端,然后服務器端按照同樣的坐標進行繪圖,得到和客戶端一樣的軌跡線條,從而實現(xiàn)所謂的“遙控”功能。四、任務實現(xiàn)(1)新建Python文件,設置文件名為“PainterA.py”,導入turtle庫,設置海龜?shù)男螤詈皖伾?。接下來,調(diào)用ondrag()方法將鼠標(即鼠標指針)的“拖動事件”與繪圖函數(shù)綁定,這樣在拖動鼠標時就能夠自動發(fā)出運行繪圖函數(shù)的命令。importturtleast #導入海龜作圖庫t.shape(“turtle”) #設置海龜形狀和畫筆顏色t.color("blue")t.pendown() #設置落筆以便繪圖defmove_turtle(x,y):t.goto(x,y)t.ondrag(move_turtle,1) #1表示鼠標左鍵t.mainloop()四、任務實現(xiàn)(2)為了讓服務器端能夠按照客戶端的軌跡繪圖,需將客戶端窗體上的鼠標指針移動過程中產(chǎn)生的坐標值發(fā)送給服務器端(方便起見,這里給出完整代碼)。importturtleast #導入海龜作圖庫importsocketip_port=('',8888)sock=socket.socket() #創(chuàng)建套接字sock.connect(ip_port) #連接到服務器t.shape("turtle") #設置海龜形狀t.color("blue")t.pendown() #設置落筆以便繪圖defmove_turtle(x,y):t.goto(x,y)xy=(x,y)sock.sendall(xy.__str__().encode())#將數(shù)據(jù)發(fā)送給服務器端

print(xy.__str__())t.ondrag(move_turtle,1) #1表示鼠標左鍵t.mainloop()四、任務實現(xiàn)(3)新建“PainterB.py”文件,監(jiān)聽8888端口接收客戶端發(fā)送來的坐標值。網(wǎng)絡代碼要放在一個線程中,防止因阻塞導致繪圖窗體的代碼無法運行,從而不能顯示繪圖窗體。importturtleastimportsocketimportthreading#導入threading庫defaction():ip_port=('',8888)sock=socket.socket()#創(chuàng)建套接字

sock.bind(ip_port)#綁定服務地址

sock.listen(5)#開始監(jiān)聽連接請求

print('啟動socket服務,等待客戶端連接...')conn,address=sock.accept()#等待連接,此處會自動阻塞

whileTrue:#通過一個死循環(huán)不斷接收客戶端的數(shù)據(jù),并回送信息

data=conn.recv(1024).decode()#接收客戶端數(shù)據(jù)

print("收到的繪圖坐標:%s"%data)t.goto(100,100)#這里暫不處理坐標,直接將海龜移動至(100,100)位置#創(chuàng)建線程以接收來自客戶端的繪圖指令(即坐標值)四、任務實現(xiàn)(3)新建“PainterB.py”文件,監(jiān)聽8888端口接收客戶端發(fā)送來的坐標值。網(wǎng)絡代碼要放在一個線程中,防止因阻塞導致繪圖窗體的代碼無法運行,從而不能顯示繪圖窗體。(4)現(xiàn)在客戶端和服務器端的功能代碼已經(jīng)初步完成,可以嘗試運行一下這兩個程序。注意,應先啟動服務器端PainterB程序,然后啟動客戶端PainterA程序,進行簡單的繪圖。#創(chuàng)建線程以接收來自客戶端的繪圖指令(即坐標值)thread=threading.Thread(target=action)thread.start()#顯示繪圖窗體t.shape("turtle")t.color("blue")t.pendown()t.mainloop()四、任務實現(xiàn)(5)修改客戶端的程序(PainterA.py),將發(fā)送的坐標值格式修改為類似“10#20,”的形式。在服務器端(PainterB.py)中,按照客戶端發(fā)送的數(shù)據(jù)格式將坐標值解析出來,然后用它去同步更新海龜圖標的位置。defmove_turtle(x,y):t.goto(x,y)xy="{}#{},".format(x,y)sock.sendall(xy.encode())#將數(shù)據(jù)發(fā)送給服務器端

print(xy)①替換PainterA.py程序中的move_turtle()函數(shù)為下面的內(nèi)容四、任務實現(xiàn)defaction():...whileTrue:#通過一個死循環(huán)不斷接收客戶端的數(shù)據(jù),并回送信息

data=conn.recv(1024).decode()#接收客戶端數(shù)據(jù)

print("收到的繪圖坐標:%s"%data)xys=data.split(",") #將收到的坐標數(shù)據(jù)使用逗號分隔(可能是多組坐標值)forxyinxys:iflen(xy)==0: #忽略空字符串

continuem=xy.split("#") #將每一組坐標值用#號進行分隔

x=float(m[0]) #得到x坐標

y=float(m[1]) #得到y(tǒng)坐標

t.goto(x,y)②替換PainterB.py程序中的action()函數(shù)為下面的內(nèi)容(主要修改了while循環(huán)的代碼)四、任務實現(xiàn)(7)修正之后的服務端和客戶端代碼運行的效果如下。綜合實訓10班級聊天室編程任務項目背景:某班為方便交流,計劃開發(fā)一個類似QQ群功能的聊天程序,以實現(xiàn)多人同時聊天的功能??紤]到不增加復雜性,所有數(shù)據(jù)交互直接在命令提示符窗口中進行。當在命令提示符窗口中輸入文字信息發(fā)送給服務器時,服務器就把收到的信息轉發(fā)至所有已連接到服務器上的客戶端,從而達到多人群聊的目的。編程任務:根據(jù)背景描述,分別編寫一個客戶端和一個服務器端程序。需要注意的是,每個客戶端輸入的內(nèi)容發(fā)送給服務器端后,服務器端在此充當中轉的角

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論