C# socket通信实现两个控制台之间聊天详解编程语言

1、运行效果

C# socket通信实现两个控制台之间聊天详解编程语言

图1 启动服务端

C# socket通信实现两个控制台之间聊天详解编程语言

图2 启动客户端

C# socket通信实现两个控制台之间聊天详解编程语言

图3 客户发消息

C# socket通信实现两个控制台之间聊天详解编程语言

图4 服务端发消息

C# socket通信实现两个控制台之间聊天详解编程语言

图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

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/11103.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论