[Windows 8]使用Socket連接-----建立客戶端(下)

[Windows 8]使用Socket連接-----建立客戶端(下)

 

前台設計完畢後,開啟【MainPage.xaml.cs】

在MainPage 類別中定義一些全局變數,程式碼如下:


public StreamSocket socket;
public DataWriter writer;
public DataReader reader;

下面是 "連接" 按鈕的Click事件處理方法的程式碼:

 


        private async void ConnectServer_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                socket = new StreamSocket();

                await socket.ConnectAsync(new HostName(HostName.Text), ServerPort.Text);
                LogInfo.Text = "連接成功";
            }
            catch (Exception ex)
            {
                LogInfo.Text = "連接服務器錯誤";
            }
        }

上面的程式碼,首先是初始化 StreamSocket 類型的變數 socket

然後,輸入的服務器位址和埠號碼為參數

呼叫 socket 對象的 ConnectAsync 方法非同步與服務器建立連接

若與服務器連接成功,會在LogInfo 控制項中顯示提示訊息 "連接成功"

若是連接異常 則顯示 "連接服務器錯誤"

 

連接服務器成功後,接下來要發送訊息,下面是 "發送訊息" 按鈕的Click事件處理方法的程式碼


        private void SendMessage_Click(object sender, RoutedEventArgs e)
        {
            string str = Message.Text;

            SendMessage(str,socket);
        }

        private async void SendMessage(string str,StreamSocket socket)
        {
            try
            {
                writer = new DataWriter(socket.OutputStream);
                writer.WriteString(str);
                await writer.StoreAsync();
                reader = new DataReader(socket.InputStream);
                reader.InputStreamOptions = InputStreamOptions.Partial;
                await reader.LoadAsync(1024);
                string data = reader.ReadString(reader.UnconsumedBufferLength);

                ShowMessage.Text += data + "\r\n";
            }
            catch (Exception ex)
            {
                LogInfo.Text = "出現異常";
            }
        }

當觸發 "發送訊息" 的按鈕Click事件後,就會將獲得的 Message訊息發送出去

關於上面的程式碼中有呼叫 SendMessage 方法,是使用 Socket 類別的 OutputStream 和 InputStream 方法

將 socket 對象的 OutputStream 屬性作為參數傳遞到 DataWriter 類別的方法中

使用 writer 對象的 StoreAsync 方法非同步向服務器發送訊息

接著將 socket 對象的 InputStream 屬性作為參數傳遞到 DataReader 類別的方法中

使用 reader 對象的 LoadAsync 方法非同步獲取輸入的數據

最後將讀取到的字串顯示在 ShowMessage 文字方塊中

 

最後,是 "關閉" 按鈕的Click事件方法,程式碼如下:


        private void Close_Click(object sender, RoutedEventArgs e)
        {
            reader.Dispose();
            writer.Dispose();
            socket.Dispose();
            LogInfo.Text = "關閉成功";
        }

程式碼完成後,執行專案:

377

 

按下 "連接" 按鈕,顯示【連接服務器錯誤】,是因為我們還沒開啟服務器

378

 

開啟服務器後,再次執行專案,按下連接後,顯示畫面如下

顯示【連接成功】

379

 

在看看服務器端連接成功後顯示的畫面

380

 

連接成功後,我們輸入一些訊息來發送

我們輸入【我愛微軟】,得到的回應是【response:我愛微軟】

381

 

這時候,看一下服務器端顯示的畫面

382

 

訊息成功發布和接收後,我們按下 "關閉" 按鈕,顯示畫面如下

383