天天看點

c# WINFORM SOCKET程式設計-簡單聊天程式(服務端)

 初學C#的SOCKET程式設計,照着網上的代碼寫下來,程式總是有問題,經過自己長時間的調試,完成程式,以下是原碼,有需要可以參考一下,還不完善,歡迎大家批評指正。(在一個線程中修改另一個窗體的控件。不安全的方式。)

源碼在附件中。

     網上給出的程式都是控制台程式,我這個是WINFORM程式。有詳細的說明,以服務端程式。

    需要增加的命名空間:

using System.Threading;

using System.Net;

using System.Net.Sockets;

    以下是具體實作。

namespace TCPServer

{

        public partial class Form1 : Form

        {

                public Form1()

                {

                        InitializeComponent();

                }

                public bool btnstatu = true;    //開始停止服務按鈕狀态

                public Thread myThread;             //聲明一個線程執行個體

                public Socket newsock;                //聲明一個Socket執行個體

                public Socket Client;                    

                public IPEndPoint localEP;        

                public int localPort;

                public bool m_Listening;

                //用來設定服務端監聽的端口号

                public int setPort                        

                        get { return localPort; }

                        set { localPort = value; }

                //用來往richtextbox框中顯示消息

                public void showClientMsg(string msg)

                        showClientMsg(msg+"\r\n");

                //監聽函數

                public void Listen()

                {     //設定端口

                        setPort=int.Parse(serverport.Text.Trim());

                        //初始化SOCKET執行個體

                        newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                        //初始化終結點執行個體

                        localEP=new IPEndPoint(IPAddress.Any,setPort);

                        try

                        {

                                //綁定

                                newsock.Bind(localEP);

                                //監聽

                                newsock.Listen(10);

                                //用于設定按鈕狀态

                                m_Listening = true;

                                //開始接受連接配接,異步。

                                newsock.BeginAccept(new AsyncCallback(OnConnectRequest), newsock);

                         }

                        catch (Exception ex)

                                showClientMsg(ex.Message);

                        }

                //當有用戶端連接配接時的處理

                public void OnConnectRequest(IAsyncResult ar)

                     //初始化一個SOCKET,用于其它用戶端的連接配接

                        Socket server1 = (Socket)ar.AsyncState;

                        Client = server1.EndAccept(ar);

                        //将要發送給連接配接上來的用戶端的提示字元串

                        string strDateLine = "Welcome here";

                        Byte[] byteDateLine = System.Text.Encoding.ASCII.GetBytes(strDateLine);

                        //将提示資訊發送給用戶端

                        Client.Send(byteDateLine, byteDateLine.Length, 0);

                        //等待新的用戶端連接配接

                        server1.BeginAccept(new AsyncCallback(OnConnectRequest), server1);

                        while (true)

                                int recv = Client.Receive(byteDateLine);

                                string stringdata = Encoding.ASCII.GetString(byteDateLine, 0, recv);

                                DateTimeOffset now = DateTimeOffset.Now;

                                //擷取用戶端的IP和端口

                                string ip = Client.RemoteEndPoint.ToString();

                                if (stringdata == "STOP")

                                {

                                        //當用戶端終止連接配接時

                                        showinfo.AppendText(ip+"已從伺服器斷開");

                                        break;    

                                }

                                //顯示用戶端發送過來的資訊

                                showinfo.AppendText(ip + "    " + now.ToString("G") + "     " + stringdata + "\r\n");                            

            //開始停止服務按鈕

                private void startService_Click(object sender, EventArgs e)

                        //建立一個委托線程

                        ThreadStart myThreadDelegate = new ThreadStart(Listen);

                        //執行個體化新線程

                        myThread = new Thread(myThreadDelegate);

                        if (btnstatu)

                                myThread.Start();

                                statuBar.Text = "服務已啟動,等待用戶端連接配接";

                                btnstatu = false;

                                startService.Text = "停止服務";

                        else

                                //停止服務(功能還有問題,無法停止)

                                m_Listening = false;

                                newsock.Close();

                                myThread.Abort();

                                showClientMsg("伺服器停止服務");

                                btnstatu = true;

                                startService.Text = "開始服務";

                                statuBar.Text = "服務已停止";

                //視窗關閉時中止線程。

                private void Form1_FormClosing(object sender, FormClosingEventArgs e)

                        if (myThread != null)

        }

}

繼續閱讀