程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> Windows 8開發中StreamSocket的使用

Windows 8開發中StreamSocket的使用

編輯:關於.NET

在Windows Store應用程序中使用Stram Socket與桌面客戶端進行通信,一直沒弄成功,總讓俺覺得很震精,怎麼會不成功呢。後來經過幾回測試發現,原來是在DataReader那裡出了問題,總算弄成了。

Stream Socket通常用於傳輸一些比較長的數據,如文件。但這裡為了使演示變得更容易理解,我傳輸了一段字符。

首先,我們用WinForm做一個服務器端。界面不復雜,目的是偵聽連接,收到傳入的客戶端連接後,向客戶端發送一條字符串消息。

處理的邏輯代碼如下:

using System;  
using System.Collections.Generic;  
using System.ComponentModel;  
using System.Data;  
using System.Drawing;  
using System.Linq;  
using System.Text;  
using System.Threading.Tasks;  
using System.Windows.Forms;  
using System.IO;  
using System.Net;  
using System.Net.Sockets;  
      
namespace TestServerApp  
{  
    public partial class Form1 : Form  
    {  
        TcpListener m_Listener = null;//用於監聽鏈接  
        TcpClient m_Client = null;//傳入的客戶端  
        public Form1()  
        {  
            InitializeComponent();  
            this.btnStart.Enabled = true;  
            this.btnStop.Enabled = false;  
        }  
      
        /// <summary>  
        /// 向客戶端發送字符串  
        /// </summary>  
        private void SendMessage(TcpClient client)  
        {  
            using (var stream = client.GetStream())  
            {  
                byte[] buffer = Encoding.UTF8.GetBytes("奔,不停地奔,奔向傳說中的荒原;飛,不停地飛,飛向天空的那一端。");  
                uint len = (uint)buffer.Length;  
                // 先發送長度  
                stream.Write(BitConverter.GetBytes(len), 0, sizeof(uint));  
                // 再發送數據  
                stream.Write(buffer, 0, buffer.Length);  
                      
            }  
        }  
      
        private async void btnStart_Click(object sender, EventArgs e)  
        {  
            if (this.m_Listener == null)  
            {  
                this.m_Listener = new TcpListener(IPAddress.Parse(this.txtAddr.Text), Convert.ToInt32(this.udPort.Value));  
            }  
            this.m_Listener.Start();  
            this.lblMsg.Text = "監聽已開始。";  
            this.btnStart.Enabled = false;  
            this.btnStop.Enabled = true;  
            try
            {  
                m_Client = await m_Listener.AcceptTcpClientAsync();  
                SendMessage(m_Client);  
            }  
            catch (SocketException se)  
            {  
                this.lblMsg.Text = se.Message;  
            }  
            catch (Exception ex)  
            {  
                this.lblMsg.Text = ex.Message;  
            }  
        }  
      
        private void btnStop_Click(object sender, EventArgs e)  
        {  
            if (m_Listener != null)  
            {  
                m_Listener.Stop();  
                this.lblMsg.Text = "監聽已停止。";  
            }  
            this.btnStart.Enabled = true;  
            this.btnStop.Enabled = false;  
        }  
    }  
}

接著是Win8 App客戶端。

因為我們要使用網絡連接,在創建項目後,把開清單文件,切換到【功能】選項卡,把和網絡連接有關的選項勾上。

打開主頁MainPage的XAML代碼編輯器(設計視圖),簡單布局一下界面。

<Page
    x:Class="WCleintApp.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:WCleintApp"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">  
      
    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">  
        <Grid.RowDefinitions>  
            <RowDefinition Height="Auto"/>  
            <RowDefinition Height="*"/>  
        </Grid.RowDefinitions>  
        <Grid Grid.Row="0" Margin="3">  
            <Grid.RowDefinitions>  
                <RowDefinition Height="auto"/>  
                <RowDefinition Height="auto"/>  
            </Grid.RowDefinitions>  
            <Grid.ColumnDefinitions>  
                <ColumnDefinition Width="auto"/>  
                <ColumnDefinition Width="*"/>  
            </Grid.ColumnDefinitions>  
            <TextBlock Grid.Row="0" Grid.Column="0" VerticalAlignment="Center" Text="服務器:"/>  
            <TextBlock Grid.Row="1" Grid.Column="0" VerticalAlignment="Center" Text="端口:"/>  
            <TextBox x:Name="txtServer" Grid.Row="0" Grid.Column="1" Margin="2,3"/>  
            <TextBox x:Name="txtPort" Grid.Row="1" Grid.Column="1" Margin="2,3"/>  
        </Grid>  
        <StackPanel Grid.Row="1" Margin="5">  
            <Button Content="連接" Click="onConnClick" Margin="3,8,0,12" Padding="4,2.5"/>  
            <TextBox x:Name="txtRec" Margin="5,7,0,0" Height="200" IsReadOnly="True"/>  
        </StackPanel>  
    </Grid>  
</Page>

本欄目

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved