計算機網絡實驗 Socket消息傳輸程序的實現(xiàn)
《計算機網絡實驗 Socket消息傳輸程序的實現(xiàn)》由會員分享,可在線閱讀,更多相關《計算機網絡實驗 Socket消息傳輸程序的實現(xiàn)(14頁珍藏版)》請在裝配圖網上搜索。
1、河南科技大學 計算機網絡A實驗報告 —信息工程學院 物聯(lián)網183 實驗五Socket消息傳輸程序的實現(xiàn) 一、 實驗目的 1、學習掌握高級語言Socket編程的方法。 2、 掌握TCP/IP協(xié)議,了解套接字等概念。 3、 針對具體的應用要求(實時傳輸數(shù)據/文件/圖像/聊天室),編程實現(xiàn)。 二、 實驗原理 1、 網絡編程的基本模型就是客戶機到服務器模型,簡單的說就是兩個進程 之間相互通訊,然后其中一個必須提供一個固定的位置,而另一個則只需要知道 這個固定的位置。并去建立兩者之間的聯(lián)系,然后完成數(shù)據的通訊就可以了,這 里提供固定位置的通常稱為服務器,而建立聯(lián)系的通常叫做客戶端,基
2、于這個簡 單的模型,就可以進入網絡編程。 2、 客戶機/服務器模型是一個應用程序開發(fā)框架,該框架是為了將數(shù)據的表 示與其內部的處理和存儲分離開來而設計的??蛻魴C請求服務,服務器為這些請 求服務。請求通過網絡從客戶機傳遞到服務器。服務器所進行的處理對客戶機而 言是隱藏的。一個服務器可以為客戶機服務。 3、 一個服務器可以同時和多臺客戶機進行通訊。 三、 實驗條件 1. 軟件環(huán)境:windows操作系統(tǒng),VC++ 6.0編程軟件。 2. 硬件環(huán)境:1臺計算機。 四、 實驗學時 2學時 五、 實驗時間 第十四周周二19:00-21:00 六、 實驗地點 工科2軟件一機房和軟件二
3、機房 七、 實驗內容與完成情況 1. 實驗內容 (1) 掌握TCP原理。 (2) 用套接字(Socket)編程實現(xiàn)網絡文字傳輸。 2. 完成情況 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System
4、.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace jiwang { public partial class Form1 : Form { public Form1 () { InitializeComponent(); } Thread threadWatch = null; Socket socketWatch = null; private void Form1_Load(object sender, EventArgs e) { } privat
5、e void textBox1_TextChanged(object sender, EventArgs e) { } private void btnServerConn_Click(object sender, EventArgs e) { try { socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) IPAddress ipaddress = IPAddress.Parse(this.txtIP.Text.Trim()); IPEndPoint
6、 endpoint = new IPEndPoint(ipaddress, int.Parse(this.txtPort.Text.Trim())); socketWatch.Bind(endpoint); socketWatch.Listen(20); threadWatch = new Thread(WatchConnecting) threadWatch.IsBackground = true; threadWatch.Start(); txtMsg.AppendText(〃開始監(jiān)聽客戶端傳來的信息!〃 + 〃\r\n〃); this.btnServerConn.Enabled
7、= false;
}
catch (Exception ex)
{
txtMsg.AppendText(〃 服務端啟動服務失敗!〃 + 〃\r\n〃); this.btnServerConn.Enabled = true;
}
}
Socket socConnection = null;
///
8、endText(〃客戶端連接成功! 〃 + 〃\r\n〃);
ParameterizedThreadStart pts = new ParameterizedThreadStart(ServerRecMsg);
Thread thr = new Thread(pts);
thr.IsBackground = true;
thr.Start(socConnection);
}
}
///
9、d ServerSendMsg(string sendMsg)
{
try
{
byte[] arrSendMsg = Encoding.UTF8.GetBytes(sendMsg);
socConnection.Send(arrSendMsg);
txtMsg.AppendText(〃 服務器"+ GetCurrentTime() + 〃\r\n〃 + sendMsg
+ 〃\r\n〃);
}
catch (Exception ex)
{
txtMsg.AppendText(〃客戶端已斷開連接,無法發(fā)送信息! 〃 + 〃\r\n〃);
}
}
/// 10、ry>
///接收客戶端發(fā)來的信息
///
/// 客戶端套接字對象
private void ServerRecMsg(object socketClientPara)
{
Socket socketServer = socketClientPara as Socket;
while (true)
{
byte[] arrServerRecMsg = new byte[1024 * 1024];
try
{
int length = socketServer.Recei 11、ve(arrServerRecMsg);
string strSRecMsg = Encoding.UTF8.GetString(arrServerRecMsg,
0, length);
txtMsg.AppendText (〃天涯"+ GetCurrentTime() + 〃\r\n〃 +
strSRecMsg + 〃\r\n〃);
}
catch (Exception ex)
{
txtMsg.AppendText("客戶端已斷開連接! 〃 + 〃\r\n〃); break;
}
}
}
///
12、ry>
///
///
private void btnSendMsg_Click(object sender, EventArgs e)
{
ServerSendMsg(this.txtSendMsg.Text.Trim());
this.txtSendMsg.Clear();
}
///
13、name="e">
private void txtSendMsg_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
ServerSendMsg(txtSendMsg.Text.Trim());
this.txtSendMsg.Clear();
}
}
///
14、
{
DateTime currentTime = new DateTime();
currentTime = DateTime.Now;
return currentTime;
}
///
15、);
foreach (IPAddress IP in IpList)
{
if (IP.AddressFamily == AddressFamily.InterNetwork)
{
localIpv4 = IP;
else
{
continue;
}
}
return localIpv4;
///
///
///
///
///
16、_Click(object sender, EventArgs e) { IPAddress localIP = GetLocalIPv4Address(); this.txtIP.Text = localIP.ToString(); } using using using using using using 2.客戶端代碼 System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; using System.Net;
17、 using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace客戶端 { public partial class Form1 : Form { public Form1 () { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } Socke
18、t socketClient = null;
Thread threadClient = null;
///
19、 ProtocolType.Tcp); IPAddress ipaddress = IPAddress.Parse(this.txtIP.Text.Trim()); IPEndPoint endpoint = new IPEndPoint(ipaddress, int.Parse(this.txtPort.Text.Trim())); try { socketClient.Connect(endpoint); this.txtMsg.AppendText(〃客戶端連接服務端成功! 〃 + 〃\r\n〃); this.btnListenServer.Enabled = false;
20、
threadClient = new Thread(RecMsg);
threadClient.IsBackground = true;
threadClient.Start();
}
catch (Exception ex)
{
this.txtMsg.AppendText(〃遠程服務端斷開,連接失敗! " + 〃\r\n〃); } }
///
21、 byte[1024 * 1024]; int length = socketClient.Receive(arrRecMsg); string strRecMsg = Encoding.UTF8.GetString(arrRecMsg, 0, length); txtMsg.AppendText (〃服務端"+ GetCurrentTime() + 〃\r\n〃 + strRecMsg + 〃\r\n〃); } catch (Exception ex) { this.txtMsg.AppendText(〃遠程服務器已中斷連接! " + 〃\r\n〃); this.btnList
22、enServer.Enabled = true;
break;
}
}
}
///
23、endText (〃天涯"+ GetCurrentTime() + 〃\r\n〃 + sendMsg + 〃\r\n〃); } catch (Exception ex) this.txtMsg.AppendText(〃遠程服務器已中斷連接,無法發(fā)送消息! 〃 + 〃\r\n〃); } } private void btnSendMsg_Click(object sender, EventArgs e) { ClientSendMsg(this.txtClientSendMsg.Text.Trim()); this.txtClientSendMsg.Clear(); }
24、private void txtClientSendMsg_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
ClientSendMsg(this.txtClientSendMsg.Text.Trim());
this.txtClientSendMsg.Clear();
}
}
///
25、me() { DateTime currentTime = new DateTime(); currentTime = DateTime.Now; return currentTime; 網 C5ock_ChatServer IF 停止辟斤 退出I 八、實驗分析及總結 1. 實驗分析 (1) Socket消息傳輸?shù)墓ぷ髟恚? Socket是應用層與TCP/IP協(xié)議族通信的中間軟件抽象層,它是一組 接口。在設計模式中,Socket其實就是一個門面模式,它把復雜的 TCP/IP協(xié)議族隱藏在Socket接口后面,對用戶來說,一組簡單的接口 就是全部,讓Socket去組
26、織數(shù)據,以符合指定的協(xié)議。 (2) Socket消息傳輸特點是什么? 由于通常情況下socket連接就是TCP連接,因此socket連接一 旦建立,通信雙方即可開始相互發(fā)送數(shù)據內容,直到雙方連接斷開.但在 實際網絡應用中,客戶端到服務器之間的通信往往需要穿越多個中間節(jié) 點,例如路由器/網關/防火墻等,大部分防火墻默認會關閉長時間處于 非活躍狀態(tài)的連接,從而導致socket連接斷連,因此需要通過輪詢告 訴網絡,該鏈接處于活躍狀態(tài). 然而http連接使用的是'請求-響應'方式.不僅在請求時需要建立連接, 而且需要客戶端向服務器發(fā)送請求后,服務器才能回復數(shù)據. 在很多情況下,需要服務器端主動
27、向客戶端推送數(shù)據,保持客戶端與 服務器數(shù)據的實時與同步.此時若雙方建立的是socket連接,服務器就可以直接將數(shù)據傳送給客戶端;若雙方建立的是http連接,則服務器需 要等到客戶端發(fā)送一次請求后才能將數(shù)據傳回給客戶端,因此,客戶端定 時向服務器端發(fā)送連接請求,不僅可以保持在線,同時也是在'詢問’服務 器是否有新的數(shù)據,如果有就將數(shù)據傳給客戶端。 (3) TCP協(xié)議和UDP協(xié)議的區(qū)別? 1) TCP協(xié)議面向連接.UDP協(xié)議面向非連接(有無鏈接) 2) TCP協(xié)議傳輸速度慢.UDP協(xié)議傳輸速度快(傳輸速度) 3) TCP協(xié)議保證數(shù)據順序.UDP協(xié)議不保證(數(shù)據的有序性.在IP層 時.數(shù)據包
28、會變得無序) 4) TCP協(xié)議保證數(shù)據正確性.UDP協(xié)議可能丟包(TCP保證數(shù)據的可靠 性) 5) TCP協(xié)議對系統(tǒng)資源要求多.UDP協(xié)議要求少(TCP和UDP占用的資 源) 2. 實驗心得 socket即套接字,用于描述地址和端口,是一個通信鏈的句柄。應用程序 通過socket向網絡發(fā)出請求或者回應。 sockets(套接字)編程有三種,流式套接字(SOCK_STREAM),數(shù)據報套接字 (SOCK_DGRAM),原始套接字(SOCK_RAW);前兩種較常用?;赥CP的socket 編程是采用的流式套接字。 (1)SOCK_STREAM表示面向連接的數(shù)據傳輸方式。數(shù)據可以準確無
29、誤地到 達另一臺計算機,如果損壞或丟失,可以重新發(fā)送,但效率相對較慢。常用的 HTTP協(xié)議就使用SOCK_STREAM傳輸數(shù)據,因為要確保數(shù)據的正確性,否則網頁 不能正常解析。 (2)SOCK_DGRAM表示無連接的數(shù)據傳輸方式。計算機只管傳輸數(shù)據,不作 數(shù)據校驗,如果數(shù)據在傳輸中損壞,或者沒有到達另一臺計算機,是沒有辦法補 救的。也就是說,數(shù)據錯了就錯了,無法重傳。因為SOCK_DGRAM所做的校驗工 作少,所以效率比SOCK_STREAM高。 QQ視頻聊天和語音聊天就使用SOCK_DGRAM傳輸數(shù)據,因為首先要保證通信 的效率,盡量減小延遲,而數(shù)據的正確性是次要的,即使丟失很小的一部分
30、數(shù)據, 視頻和音頻也可以正常解析,最多出現(xiàn)噪點或雜音,不會對通信質量有實質的影 響。 服務端:建立socket,聲明自身的端口號和地址并綁定到socket,使用listen 打開監(jiān)聽,然后不斷用accept去查看是否有連接,如果有,捕獲socket,并通 過recv獲取消息的內容,通信完成后調用closeSocket關閉這個對應accept 到的socket,如果不再需要等待任何客戶端連接,那么用closeSocket關閉掉 自身的socket。 客戶端:建立socket,通過端口號和地址確定目標服務器,使用Connect連接 到服務器,send發(fā)送消息,等待處理,通信完成后調用closeSocket關閉socket。
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
5. 裝配圖網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。