文章目錄
使用Socket發送和接收訊息
在ASP.NET應用程式中,可以通過Socket發送和接收訊息。發送的訊息可以是常值內容、檔案或其他類型的資料。本執行個體介紹使用System.Net.Sockets名字空間中的方法發送和接收檔案的方法。
技術要點
本執行個體介紹如何使用ASP.NET通過System.Net.Sockets名字空間中的方法發送和接收檔案。在發送過程中,首先介紹讀取檔案的方法,並把檔案讀取到位元組中,然後使用Sockets中的Send()方法傳送檔案的資料。
跟我做
1.建立新ASP.NET應用程式
在Visual Studio .NET 2003整合式開發環境中建立新的ASP.NET Web應用程式,命名為Example_12_7。
2.設計頁面MySocket.aspx
把應用程式Example_12_7的預設頁面WebForm1.aspx重新命名為MySocket.aspx,並在該頁面上添加,頁面MySocket.aspx的設計介面12-19所示。
圖12-19 頁面MySocket.aspx的設計介面
頁面MySocket.aspx的HTML設計代碼如下:
<%@ Page language="c#" Codebehind="MySocket.aspx.cs" AutoEventWireup="false" Inherits="Example_12_7.MySocket" %>
<HTML>
<HEAD>
<title>Example_12_7:使用Socket發送和接收訊息</title>
</HEAD>
<asp:Label id="LabelMessage" runat="server">網頁正在發送資料,請等待……</asp:Label>
<asp:Button ID="ReceiveBtn" Runat="server" Text="接收資料"></asp:Button>
<asp:Label id="LabelData" runat="server"></asp:Label></td>
</HTML>
3.添加Socket名字空間
由於頁面MySocket.aspx在發送和接收資訊時需要使用Socket類實現HTTP等一些屬性,它們被包含在名字空間System.Net和System.Net.Sockets中,因此需要引入這些名字空間。程式碼如下:
//引入名字空間
using System.Net;
using System.IO;
using System.Net.Sockets;
4.建立被發送的檔案myFile.txt
在應用程式Example_12_7的根目錄下建立使用Socket發送的檔案myFile.txt,它為一個text類型的文字檔,其內容12-20所示。
圖12-20 被發送的myFile.txt檔案
5.設計頁面MySocket.aspx的事件和函數
頁面MySocket.aspx調用函數Page_Load(object sender,System.EventArgs e)初始化,該函數調用函數SocketSend()傳送檔案資訊。函數SocketSend()首先建立發送資訊的Socket對象,並定義發送的IP地址和連接埠,然後讀取myFile.txt檔案的資訊,最後再調用函數Send()傳送檔案的資料。函數Page_Load(object sender, System.EventArgs e)和函數SocketSend()的程式碼如下:
private void Page_Load(object sender, System.EventArgs e)
{
if (!Page.IsPostBack)
{
//發送資料
SocketSend();
}
}
private void SocketSend()
{
//建立發送資料的Socket
Socket sendsocket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
//設定發送資料的地址
IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 80);
//建立讀取檔案的流
FileStream fileSteam = new FileStream(Server.MapPath("myFile.txt"),
FileMode.OpenOrCreate, FileAccess.Read);
//檔案大小
Byte[] fsSize = new Byte[fileSteam.Length - 1];
//讀取檔案的二進位流
BinaryReader reader = new BinaryReader(fileSteam);
//讀取資料
reader.Read(fsSize, 0, (int)fileSteam.Length - 1);
//連結目的地
sendsocket.Connect(endPoint);
//發送資料
sendsocket.Send(fsSize);
//關閉檔案流
fileSteam.Close();
//關閉發送資料的Socket
sendsocket.Shutdown(SocketShutdown.Send);
sendsocket.Close();
}
單擊頁面MySocket.aspx中的【接收資料】按鈕觸發事件ReceiveBtn_Click(object sender, System.EventArgs e),該事件調用函數SendReceiveData()接收從函數SocketSend()發送的資料。函數SendReceiveData()首先建立用來接收資料的Socket對象,並設計接收資料的IP地址和連接埠,最後把接收的資料寫入檔案並儲存。函數SendReceiveData()和事件ReceiveBtn_Click(object sender, System. EventArgs e)的程式碼如下:
private void ReceiveBtn_Click(object sender, System.EventArgs e)
{
//接收資料
SendReceiveData();
}
private void SendReceiveData()
{
//建立接收資料的Socket
Socket receiveSocket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
//設定接收資料的地址
IPEndPoint hostPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 80);
//設定連接埠
receiveSocket.Bind(hostPoint);
//監聽
receiveSocket.Listen(2);
//設定接收資料緩衝區的大小
Byte[] recData = new Byte[300000000];
Socket hostSocket = receiveSocket.Accept();
//接收資料
hostSocket.Receive(recData);
if (hostSocket.Receive(recData) > 0)
{
//顯示接收資料的資訊
LabelData.Text = "網頁在" + DateTime.Now.ToString()
+ "接收的資料大小為:" + hostSocket.Receive(recData).ToString();
}
//建立一個新檔案儲存接收的資料
FileStream fileStream = new FileStream(Server.MapPath("myNewFile.dat"),
FileMode.OpenOrCreate);
BinaryWriter writer = new BinaryWriter(fileStream);
writer.Write(recData, 0, recData.Length - 1);
//關閉寫檔案流
fileStream.Close();
writer.Close();
//關閉接收資料的Socket
hostSocket.Shutdown(SocketShutdown.Receive);
hostSocket.Close();
}
運行效果
設定頁面MySocket.aspx為應用程式的起始頁面。按F5鍵運行,出現12-21所示的初始介面。
圖12-21 頁面MySocket.aspx的初始介面