---------------------- Windows Phone 7手機開發、 .Net教育訓練、期待與您交流! ----------------------
服務端與用戶端之間的通信:
服務端:
1. 啟動監聽
a. 建立監聽套接字
sokWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//使用ipv4尋址,使用流式套接字,使用Tcp協定
b. 擷取網絡節點
IPAddress address = IPAddress.Parse(txtIP.Text.Trim());
EndPoint endPoint = new IPEndPoint(IPAddress, port);
c. 監聽套接字綁定到網絡節點上
sokWatch.Bind(endPoint);
d. 啟動監聽服務
sokWatch.Listen();
e. 建立并開啟監聽線程
threadWatch = new Thread(StartWatch);
threadWatch.Start();
2. 負責監聽用戶端連接配接請求 (void StartWatch())
while (isWatch)
{
//監聽到用戶端連接配接請求,會傳回一個負責與該用戶端通信的新的套接字對象。否則在此阻斷線程。
sokConnection = sokWatch.Accept();
//獲得通信套接字的遠端 ip:port
string strRemoteEndPoint =sokConnection.RemoteEndPoint.ToString();
//将用戶端的ip:port 加入到listBox控件中
lbClients.Items.Add(strRemoteEndPoint);
//建立 通信管理類對象
SocketConnection connection = new SocketConnection(sokConnection, ShowMsg);
//将通信管理類對象 添加到集合中
dictConnection.Add(strRemoteEndPoint, connection);
//立即向 用戶端套接字發送一個消息資料
sokConnection.Send(System.Text.Encoding.Default.GetBytes("Hello~~!"));
}
3. 向指定用戶端發送消息
tring key = lbClients.Text; //得到listbox中標明的項(用戶端Ip端口)
if (!string.IsNullOrEmpty(key))
{
//獲得要發送的内容
string strMsg = txtSend.Text.Trim();
//通過集合中的鍵,找到對應通信套接字,來發送資料給對應的用戶端
dictConnection[key].SendMsg(strMsg);
}
else
{
MessageBox.Show("請選擇要發送的用戶端.........");
}
4. 群發消息
//獲得要發送的内容
string strMsg = txtSend.Text.Trim();
//循環泛型集合中的值
foreach (SocketConnection value in dictConnection.Values)
{
value.SendMsg(strMsg);
}
5. 向指定用戶端發送檔案
a. 選擇檔案(打開對話框)
b. 讀取檔案資料
c. 發送資料
using (FileStream fs = new FileStream(filePath, FileMode.Open))
{
//準備一個檔案緩沖區
byte[] arrFile = new byte[1024 * 1024 * 2];
//讀取檔案資料,獲得真實檔案長度
int length = fs.Read(arrFile, 0, arrFile.Length);
//建立一個比讀取的檔案長度多1位的新數組
byte[] arrFileNew = new byte[length + 1];
arrFileNew[0] = 1;//設定辨別位為1,代表發送的是檔案資料
//将老數組的資料追加到新數組裡
Buffer.BlockCopy(arrFile, 0, arrFileNew, 1, length);
sokConnection.Send(arrFileNew);
dgShowMsg("發送檔案成功!”);
}
6. 向指定用戶端發送閃屏消息
public void SendShack()
{
//準備一個緩沖區
byte[] arrFile = new byte[1];
arrFile[0] = 3;
sokConnection.Send(arrFile);
dgShowMsg("向" + sokConnection.RemoteEndPoint.ToString() + "發送閃屏成功!”);
}
用戶端:
1. 向服務端 發送連接配接請求
2. 循環接收服務端發來的資料
3. 顯示消息到文本框
4. 向伺服器發送消息
5. 閃屏
向服務端 發送連接配接請求:
sokClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //執行個體化套接字
IPAddress addreass = IPAddress.Parse(txtIP.Text.Trim());
IPEndPoint endpoint = new IPEndPoint(addreass, int.Parse(txtPort.Text.Trim()));
//向指定的 ip端口發送連接配接請求
sokClient.Connect(endpoint);
循環接收服務端發來的資料
while (isRecMsg)
{
byte[] msgRec = new byte[1024 * 1024 * 2];
int recLength = sokClient.Receive(msgRec);
switch(msgRec[0])
{
case 1://接收到檔案
SaveFileDialog sfd = new SaveFileDialog();
if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
using (FileStream fs = new FileStream(sfd.FileName, FileMode.Create))
{
fs.Write(msgRec, 1, recLength - 1);
}
ShowMsg("檔案儲存完畢" + sfd.FileName);
}
break;
case 2://接收到字元串資訊
{
//轉換為字元串
string strRec = System.Text.Encoding.Default.GetString(msgRec, 1, recLength-1);
//将接收到的資料顯示在文本框中
ShowMsg(strRec);
break;
}
case 3://接收到閃屏指令
{
ShakeWindow();
break;
}
}
}
顯示消息到文本框:
void ShowMsg(string msg)
{
txtMsg.AppendText(msg + "\r\n");
}
閃屏:
private void ShakeWindow()
{
Random ran = new Random();
//儲存窗體原坐标
System.Drawing.Point point = this.Location;
for (int i = 0; i < 30; i++)
{
//随機坐标
this.Location = new System.Drawing.Point(point.X + ran.Next(8), point.Y + ran.Next(8));
System.Threading.Thread.Sleep(15);//暫停15毫秒
this.Location = point;//還原原坐标
System.Threading.Thread.Sleep(15);//暫停15毫秒
}
}
---------------------- Windows Phone 7手機開發、 .Net教育訓練、期待與您交流! ----------------------