1. 程式人生 > >Socket程式設計-TCP實現簡單聊天程式

Socket程式設計-TCP實現簡單聊天程式

在System.net.Sockets的名稱空間中,TcpListener類與TcpClient類是兩個專門用於TCP協議程式設計的類,它們封裝了底層的套接字並分別提供了用Socket進行同步和非同步通訊的方法,降低了TCP應用程式設計的難度。

在網路應用程式設計中,利用TCP協議編寫的程式非常多,例如網路遊戲,網路辦公,股票交易,網路通訊等。

1、TcpListener類

監聽器,用於監聽和接受傳入的連線請求。

建構函式:TcpListener(IPEndPoint p)

其中,引數p為IPEndPoint型別的物件,其包含了服務區端的IP地址與埠號,引數address和port正好組成端點。最終,監聽器通過指定端點來監聽傳入的連線請求。

為了監聽客戶端的連線請求,TcpListener分別提供了同步與非同步方法。

AcceptTcpClient方法用於在同步方式下返回一個封裝了套接字TcpClient物件。

Start方法用於啟動監聽。

Stop方法用於停止監聽請求,原型:public void Stop()。執行Stop方法後,會立即停止監聽客戶端連線請求,並關閉底層的Socket物件。等待佇列中的請求將會丟失,等待接受連線請求的遠端主機會丟擲套接字異常。

2、TcpClient類

利用TcpClient類提供的方法,可以連線,傳送和接收網路資料流,其建構函式有

TcpClient(IPEndPoint p)

TcpClient()

編寫一個伺服器端和客戶端通訊的小程式,說明利用TCP協議和同步套接字編寫網路應用程式方法。

首先啟動服務端,輸入要監聽的埠號,單擊開始按鈕啟動監聽,接下來啟動客戶端,輸入伺服器的IP地址和埠號,連線到伺服器,接下來雙方就可以對話了。之後,如果單擊客戶端和伺服器端終止按鈕,即可終止對話。

執行結果:(上面伺服器端,下面客戶端)

原始碼:

伺服器端:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;

namespace Socket_Server
{
    public partial class Form1 : Form
    {
        static TcpClient client = null;                         //客戶端物件,用來接受或傳送資訊
        TcpListener server = null;                              //監聽器物件,用來監聽TCP連線
        static NetworkStream stream = null;                     //流物件,完成接受或傳送訊息操作
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int port = int.Parse(textPort.Text);
            IPEndPoint p = new IPEndPoint(IPAddress.Any, port);  //建立TCP連線的端點

            server = new TcpListener(p);                        //初始化TcpListener的新例項
            server.Start();                                     //開始監聽客戶端的請求

            lblShow.Items.Add("服務端已啟動!");
            client = server.AcceptTcpClient();                  //執行掛起和接受連線請求,獲得客戶端物件
            lblShow.Items.Add("已連線客戶端!");
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Byte[] msg = Encoding.UTF8.GetBytes(textMessage.Text);

            stream = client.GetStream();                        //獲取用於讀取和寫入的流物件
            stream.Write(msg, 0, msg.Length);                   //向客戶端傳送一個響應資訊
        }

        private void button3_Click(object sender, EventArgs e)
        {
            Byte[] bytes = new Byte[256];                       //快取讀入的資料
            stream = client.GetStream();                        //獲取用於讀取和寫入的流物件
            stream.Read(bytes, 0, bytes.Length);                //讀取來自客戶端的資訊
            string data = Encoding.UTF8.GetString(bytes, 0, bytes.Length);
            lblShow.Items.Add("客戶端:" + data);
        }

        private void button4_Click(object sender, EventArgs e)
        {
            if (stream != null)
                stream.Close();
            if (server != null)
                server.Stop();
            if (client != null)
                client.Close();
        }
    }
}

客戶端:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;

namespace Socket_Client
{
    public partial class Form1 : Form
    {
        static TcpClient client = null;                             //客戶端物件,用來接收或傳送訊息
        static NetworkStream stream = null;                         //流物件,完成接受或傳送訊息的操作
        public Form1()
        {
            InitializeComponent();
        }

        private void label3_Click(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            string strIp = textAddress.Text;
            int port = int.Parse(textPort.Text);

            client = new TcpClient();                               //建立TCP客戶端
            client.Connect(strIp, port);                            //連線伺服器
        }

        private void button2_Click(object sender, EventArgs e)
        {
            byte[] msg = Encoding.UTF8.GetBytes(textMessage.Text);

            stream = client.GetStream();                             //獲取用於讀取和寫入的流物件
            stream.Write(msg, 0, msg.Length);                        //向伺服器端傳送一個響應資訊
        }

        private void button3_Click(object sender, EventArgs e)
        {
            byte[] bytes = new byte[256];                           //快取讀入的資料

            stream = client.GetStream();                            //獲取用於讀取和寫入的流物件
            stream.Read(bytes, 0, bytes.Length);                    //讀取來自伺服器端的資訊
            string data = Encoding.UTF8.GetString(bytes, 0, bytes.Length);

            lblShow.Items.Add("服務端: " + data);
        }

        private void button4_Click(object sender, EventArgs e)
        {
            if(stream != null)
                stream.Close();
            if(client != null)
                client.Close();
        }
    }
}