天天看點

C# TCP/IP 初探心得 即P2P點對點通訊研究......

很久以前就一直想玩P2P做一些商用的應用軟體

早前沒有C#,或者.NET的時候,我可以用VB6 采用 winsock來開發一些應用軟體.

距離VB6那個時候已經有近 5年沒有玩過了.

這幾日開了VS2005來玩C#. 翻無數貼子,均不能成功實作C S 之間的通訊.

不是當機,就是到處有錯.

經過俺幾天幾夜不眠不休的認真研究,最終研究得成正果,小小的爽了一把.

為了俺們大中華民族的未來軟體産業的發展壯大,俺不敢私藏心得體會,

特此奉獻如下, 有錢的打發幾個小錢,沒錢的捧個人場哈.大牛和大蝦就當看猴戲撒.

廢話少說,開場喽

---------------------------------------------------------------------------------------------------------------------------

我是獨立二個項目來研究CS端,命名為Server 和 Client

如下圖亂放:

C# TCP/IP 初探心得 即P2P點對點通訊研究......

 上面這個圖是S端的鳥樣

C# TCP/IP 初探心得 即P2P點對點通訊研究......

這個是C端界面

下面是代碼部分:

-------------------------------------------------------------------------------------------------------------------

client:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.IO;

using System.Net.Sockets;

using System.Threading;

namespace Client

{

    public partial class Form1 : Form

    {

        //發送消息程式

        public Form1()

        {

            InitializeComponent();

        }

        private void button1_Click(object sender, EventArgs e)

        {

            String mystr = textBox1.Text;

           this.sendmymsg();

        }

        public void sendmymsg()

        {

            try

            {

                TcpClient client = new TcpClient("127.0.0.1", 5567);

                NetworkStream sendStream = client.GetStream();

                //StreamWriter writer = new StreamWriter(sendStream);

                String msg = textBox1.Text;

                Byte[] sendBytes = Encoding.Default.GetBytes(msg);

                sendStream.Write(sendBytes, 0, sendBytes.Length);

                //writer.Flush();

                sendStream.Close();

                client.Close();

                textBox1.Text = "Msg Sent!";

            }

            catch(System.Exception e)

            {

                textBox2.Text = e.ToString(); ;

            }

        }

        private void textBox1_TextChanged(object sender, EventArgs e)

        {

        }

    }

}

Server 部分比較複雜,也列出來,一會拿出來扯

Server:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.IO;

using System.Net.Sockets;

using System.Threading;

using System.Net;

namespace Server

{

    public partial class Form1 : Form

    {

        //變量

        private ThreadStart start;

        private Thread listenThread;

        static private bool m_bListening = false;

        static private System.Net.IPAddress MyIP = System.Net.IPAddress.Parse("127.0.0.1");

        static private TcpListener listener = new TcpListener(MyIP, 5567);

        private String msg;

        //初始化監聽器

        public Form1()

        {

            InitializeComponent();

            Control.CheckForIllegalCrossThreadCalls = false;

            start = new ThreadStart(startListen);

            listenThread = new Thread(start);  

        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)

        {

        }

        private void Form1_Load(object sender, EventArgs e)

        {

       

        }

        private void button1_Click(object sender, EventArgs e)

        {

            if (m_bListening)

            {

                m_bListening = false;

                label4.Text = "Server Idle...";

            }

            else

            {

                m_bListening = true;

                listenThread.Start();

                label4.Text = "Server Listening...";

            }

        }

        private void showmore()

        {

            textBox1.Text = msg;

        }

        private void startListen()

        {

            //textBox1.Text = "listening...";

            listener.Start();

            //接收資料

            while (m_bListening)

            {

                //測試是否有資料

                try

                {

                    TcpClient client = listener.AcceptTcpClient();

                    NetworkStream ns = client.GetStream();

                    //StreamReader sr = new StreamReader(ns);//流讀寫器

                    //字組處理

                    byte[] bytes = new byte[1024];

                    int bytesread = ns.Read(bytes, 0, bytes.Length);

                    msg = Encoding.Default.GetString(bytes, 0, bytesread);

                    //顯示

                    //MessageBox.Show(msg);

                    showmore();

                    ns.Close();

                    client.Close();

                    //清場

                }

                catch (Exception re)

                {

                    MessageBox.Show(re.Message);

                }

            }

            listener.Stop();

            //

        }

    }

}

代碼部分完成了.

現在開始口水了,主要對Server 端進行胡扯,C端沒有什麼好說的,非常的簡單明了.S端涉及到多線程,界面線程管理.現在說幾點要注意的

1:中文亂碼, 大家别抄書上的代碼,用Encoding.ASCII 是不對的,最好用Encoding.Default

2:如果你的程式沒有響應,半死狀态,那是因為程式運作到listener.AcceptTcpClient();的時候一直在等待C端的資料.阻塞住了,有人說,會這個狀态才是最正常的,此話不錯. 是以碰到這個問題,不要相信垃圾書啦. 采用多線程

3:線程在form1的時候要裝載即

        public Form1()

        {

            InitializeComponent();

            Control.CheckForIllegalCrossThreadCalls = false;

            start = new ThreadStart(startListen);

            listenThread = new Thread(start);  

        }

Control.CheckForIllegalCrossThreadCalls 這一行是為了可以線上程裡直接控制S上面的TEXTBOX控件

如果不用這一行,會報"線程間錯誤"

startListen 是有消息的時候,線程調用的子程式.

就這幾個要注意的. 希望大家可以一步調試成功,不要走太多的冤枉路.

啟動 server.exe  和 client.exe  從C發送消息,S端會顯示收到的消息.

表示成功.

隻要這CS能正常通訊,那麼其他的你想幹什麼就幹什麼了.不用我說了吧?哈哈!

繼續閱讀