閱讀103 返回首頁    go 阿裏雲 go 技術社區[雲棲]


C# 網絡編程之Tcp實現客戶端和服務器聊天

      最近使用Socket網絡套接字編程中,在同步與異步通訊中客戶端與服務器總是無法響應,但在學習Tcp協議編程中完成了通訊聊天功能,下麵簡單講講我最近學到的及Tcp聊天的源代碼及詳細注釋。
      Tcp協議是一個傳輸層的協議,在Tcp協議編程中它通常使用的是3個類,其命名空間為System.Net.Sockets:

      1.TcpListener:基於TCP協議服務端開發,監聽IP地址和端口號是否連接。
      該類常用的方法有Start()開始監聽、AcceptSocket()返回套接字接受連接請求、AcceptTcpClient()返回客戶對象接受連接請求、Stop()停止監聽

      2.TcpClient:基於TCP協議客戶端編程,提供客戶端連接,通過網絡連接發送接受數據。
      該類常用的方法有Connect()與服務器主機連接、GetStream()用來獲得答應的數據流、Close()關閉連接

      3.NetWorkStream:用於獲取和操作網絡流,該程序中還是用寫入流和讀取流對象實現寫入和讀取數據的操作。
      該類常用的方法有Read()從網絡流中讀取數據、Write()從網絡流中寫數據。

      下麵是這個例子的源代碼:(該代碼是根據自己所學及《C#範例開發大全》中一個例子改變而來通過兩個控製台程序實現通話)
      1.服務端代碼(TCPServer)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

//添加新的命名空間
using System.Net;
using System.Net.Sockets;     
using System.IO;              //流StreamReader

namespace TCPServer
{
    class Program
    {
        static void Main(string[] args)
        {
            //Parse將字符串轉換為IP地址類型
            IPAddress myIP = IPAddress.Parse("127.0.0.1");
            //構造一個TcpListener(IP地址,端口)對象,TCP服務端
            TcpListener myServer = new TcpListener(myIP,6688);
           
            //開始監聽
            myServer.Start();
            Console.WriteLine("等候一個連接...");

            //構造TCP客戶端:接受連接請求
            TcpClient client = myServer.AcceptTcpClient();
            Console.WriteLine("客戶端已經連接...");

            //構造NetworkStream類,該類用於獲取和操作網絡流
            NetworkStream stream = client.GetStream();
            //讀數據流對象
            StreamReader sr = new StreamReader(stream);
            //寫數據流對象
            StreamWriter sw = new StreamWriter(stream);

            while (true)
            {
                Console.WriteLine("客戶端:" + sr.ReadLine());
                string msg = Console.ReadLine();
                sw.WriteLine(msg);
                sw.Flush();               //刷新流
            }
            client.Close();               //關閉客戶端
        }
    }
}

      2.客戶端代碼(TCPClient)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

//添加新的命名空間
using System.Net;
using System.Net.Sockets;
using System.IO;              //流StreamReader

namespace TCPClient
{
    class Program
    {
        static void Main(string[] args)
        {
            //Parse將字符串轉換為IP地址類型
            IPAddress myIP = IPAddress.Parse("127.0.0.1");
            //構造一個TcpClient類對象,TCP客戶端
            TcpClient client = new TcpClient();
            //與TCP服務器連接
            client.Connect(myIP, 6688);
            Console.WriteLine("服務器已經連接...請輸入對話內容...");

            //創建網絡流,獲取數據流
            NetworkStream stream = client.GetStream();
            //讀數據流對象
            StreamReader sr = new StreamReader(stream);
            //寫數據流對象
            StreamWriter sw = new StreamWriter(stream);

            while (true)
            {
                string msg = Console.ReadLine();
                sw.WriteLine(msg);
                sw.Flush();             //刷新流
                Console.WriteLine("服務器:" + sr.ReadLine());
            }
            client.Close();
            Console.Read();
        }
    }
}

      3.程序演示
      先運行服務器(TCPServer)代碼,它會顯示“等候一個連接...”.再運行客戶端(TCPClient)代碼,運行後此時服務端顯示"客戶端已連接...",客戶端顯示"服務器已連接...請輸入對話內容".然後依次在客戶端和服務器中個輸入聊天內容,在另一方會顯示相應傳輸過來的內容,實現TCP聊天通話。下麵是在客戶端輸入"你好!我是客戶端."的反應。

      更多的通話內容如下所示:

      總結:這是自己認為寫得比較好的一篇文章,它比較實用,更重要的是我編寫上麵的代碼能運行。我們隻需要稍微的界麵設計就能實現一個有界麵的網絡聊天室.它涉及到的知識主要是C#網絡編程中的TCP編程知識,最近寫Socket套接字方麵的通訊總是失敗,也看了很多博客下載了很多程序,但都沒一個比較滿意的。希望上麵的文章能幫組到大家,有錯誤不足之處見諒!

      最後感謝劉麗霞的《C#範例開發大全》和周存傑的《C#網絡編程實例教程》兩本書,上麵的知識點和代碼都是借鑒了他們前人的知識,希望大家也看看這兩本比較好的C#書。

     (By:Eastmount 2013-7-20 https://blog.csdn.net/eastmount/

最後更新:2017-04-03 16:48:36

  上一篇:go Android 動態logo bootanimation.zip 製作
  下一篇:go oracle數據庫同步技術