C# socket通信實現兩個控制臺之間聊天

cxx3 9年前發布 | 6K 次閱讀 C# Socket

1、運行效果

圖1 啟動服務端

圖2 啟動客戶端

圖3 客戶發消息

圖4 服務端發消息

圖5 客戶主動關閉,服務段打印異常詳情


2、服務器端源碼

服務端和客戶端都要添加一下namespace:

using System.Net;

using System.Net.Sockets;

using System.Threading;

源碼:

 class Program
    {
        private static string serverIP = "192.168.3.42";//本機ip地址
        private static int serverPort = 8888;
        private static int bufferSize = 1024;
        private static int count = 0;//表示對話序號

        static void Main(string[] args)
        {
            IPAddress ip = IPAddress.Parse(serverIP);
            IPEndPoint ipe = new IPEndPoint(ip, serverPort);
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try
            {
                s.Bind(ipe);
                s.Listen(10);
                Console.WriteLine("等待連接……");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
            Thread mainTrd = new Thread(Run);
            mainTrd.Start(s);
        }
        /// <summary>
        /// 啟動服務器的socket。
        /// 此處要想修改為多用戶連接,對每個新用戶都new一個RecMsg線程,并且Dictionary<T1,T2>存儲每一對ipe和socket即可
        /// </summary>
        /// <param name="o">傳入的socket對象</param>
        private static void Run(object o)
        {
            Socket socket = o as Socket;
            try
            {               
                Socket connSocket = socket.Accept();
                //客戶和服務器連接成功。
                Console.WriteLine("{0}成功連接到本機。", connSocket.RemoteEndPoint);
                //接下來的事情交給會話線程
                Thread recTh = new Thread(RecMsg);
                recTh.Start(connSocket);
                Thread sendTh = new Thread(SendMsg);
                sendTh.Start(connSocket);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                throw;
            }
        }
        private static void RecMsg(object o)
        {
            Socket connSocket = o as Socket;
            while (true)
            {
                byte[] buffer = new Byte[bufferSize];
                try
                {
                    int length = connSocket.Receive(buffer);
                    byte[] realBuffer = new Byte[length];
                    Array.Copy(buffer, 0, realBuffer, 0, length);
                    string str = System.Text.Encoding.Default.GetString(realBuffer);
                    Console.Write("[{0}] ", count++);
                    Console.WriteLine("{0}說:{1}.", connSocket.RemoteEndPoint, str);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                    Console.ReadKey();
                    break;
                }                            
            }
        }
        private static void SendMsg(object o) 
        {
            Socket connSocket = o as Socket;
            while (true)
            {
                string str = Console.ReadLine();
                if (str != string.Empty)
                {
                    byte[] buffer = Encoding.Default.GetBytes(str);
                    connSocket.Send(buffer, buffer.Length, SocketFlags.None);
                }               
            }
        }
    }


3、客戶端源碼

class Program
    {
        private static string host = "192.168.3.42";
        private static int port = 8888;
        private static int bufferSize = 1024;
        static IPAddress ip = IPAddress.Parse(host);
        static IPEndPoint ipe = new IPEndPoint(ip, port);
        private static int count = 0;//表示對話序號
        static void Main(string[] args)
        {            
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try
            {
                s.Connect(ipe);
                Console.WriteLine("成功連接到{0}。", s.RemoteEndPoint);
                Console.WriteLine("請輸入要發送給服務器的話,按Enter發送。");
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
                throw;
            }
            Thread clientTh = new Thread(SendToServer);
            clientTh.Start(s);
            Thread recTh = new Thread(RecMsg);
            recTh.Start(s);            
        }
        private static void RecMsg(object o)
        {
            Socket connSocket = o as Socket;
            while (true)
            {
                byte[] buffer = new Byte[bufferSize];
                try
                {
                    int length = connSocket.Receive(buffer);
                    byte[] realBuffer = new Byte[length];
                    Array.Copy(buffer, 0, realBuffer, 0, length);
                    string str = System.Text.Encoding.Default.GetString(realBuffer);
                    Console.Write("[{0}] ", count++);
                    Console.WriteLine("{0}說:{1}.", connSocket.RemoteEndPoint, str);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                    Console.ReadKey();
                    break;
                }
            }
        }
        private static void SendToServer(object o)
        {            
            Socket socket = o as Socket;            
            while (true)
            {
                try
                {
                    string str = Console.ReadLine();                    
                    if (str != string.Empty)
                    {
                        byte[] bt = Encoding.Default.GetBytes(str);
                        socket.Send(bt, bt.Length, 0);
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("發送失敗。");
                    Debug.WriteLine(ex);
                    throw;
                }
            }                     
        }
    }

來自:http://my.oschina.net/SnifferApache/blog/406563

 本文由用戶 cxx3 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!