91焦先生

导航

c#简单的聊天室

最近学习Socket,写了一个简单的聊天室,代码很烂,没有用面向对象,大佬请无视

服务端

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Text;

namespace SeverFile_P
{
    class Program
    {
        private static string ip = "0.0.0.0";
        private static int port = 8888;
        private static int Listen = 100;
        private static Socket socket;

        private static List<Socket> Allsocket = new List<Socket>();

        static void Main(string[] args)
        {
            Console.WriteLine("服务器已启动");

            socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
            IPAddress address = IPAddress.Parse(ip);
            IPEndPoint point = new IPEndPoint(address, port);
            //将Socket绑定ip和端口
            socket.Bind(point);
            //最大连接数
            socket.Listen(Listen);

            //实例化一个子线程
            Thread thread = new Thread(AcceptThread);
            //开启子线程
            thread.Start();

            Console.WriteLine("程序尾");
            Console.ReadKey();

        }

        private static void AcceptThread()
        {
            
            while (true)
            {
                //监听客户端的连接
                Socket clientSocket = socket.Accept();

                Console.WriteLine("客户端的信息:" + clientSocket.RemoteEndPoint.ToString() + "上线了");

                Allsocket.Add(clientSocket);
                
                //实例化一个子线程
                Thread receiveThread = new Thread(ReceiveThread);
                //开启子线程
                receiveThread.Start(clientSocket);

            }
        }
        /// <summary>
        /// 子线程循环接收用户发来的消息
        /// </summary>
        private static void ReceiveThread(object obj)
        {
            //参数类型强转
            Socket clientSocket_R = (Socket)obj;
            //循环接受用户数据
            bool key = true;
            while (key)
            {
                //定义一个字节类型的数组
                byte[] messageS = new byte[1024*5];
                //监听客户端的信息
                int length = 0;
                try
                {
                    length = clientSocket_R.Receive(messageS);
                }
                catch
                {
                    length = 0;
                    Allsocket.Remove(clientSocket_R);
                }
                byte[] message = new byte[length];
                Array.Copy(messageS, message, length);
                //Console.WriteLine(length);
                //客户端下线
                if (length != 0)
                {
                    string temp = Encoding.UTF8.GetString(message);
                    Console.WriteLine(temp);
                    
                    //Allsocket.Remove(clientSocket_R);
                    for (int i = 0; i < Allsocket.Count; i++)
                    {
                        if(Allsocket[i] != clientSocket_R)
                        {
                            SendMessage(temp, Allsocket[i]);
                        }
                    }
                    
                }
                else
                {
                    key = false;
                    clientSocket_R.Close();
                    break;
                }
                
            }
        }
        /// <summary>
        /// 往客户端发送信息
        /// </summary>
        private static void SendMessage(string text, Socket client)
        {
            byte[] message = Encoding.UTF8.GetBytes(text);
            client.Send(message);
        }



    }
} 

客户端

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace Client
{
    class Program
    {

        private static string ip = "0.0.0.0";
        private static int port = 8888;
        private static Socket socket;

        static void Main(string[] args)
        {
            bool netkey = false;
            try
            {
                socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPAddress address = IPAddress.Parse(ip);
                IPEndPoint point = new IPEndPoint(address, port);
                //连接到Socket
                socket.Connect(address, port);
                netkey = true;
            }
            catch
            {
                Console.WriteLine("服务器连接失败!");
                netkey = false;
                Console.ReadKey();
            }
            if(netkey)
            {
                //开启接收服务器信息线程
                Thread receiveThread = new Thread(ReceiveThread);
                receiveThread.Start();
                Console.WriteLine("执行完毕:请输入要发送的信息!");
                string temp;
                while (true)
                {
                    temp = Console.ReadLine();
                    SendMessage(temp);
                    //Console.WriteLine("发送完毕!请在次输入要发送的信息!");
                }
            }
            

        }

        private static void SendMessage(string str)
        {
            //将字符串转码为字节数组
            byte[] message = Encoding.UTF8.GetBytes(str);
            try
            {
                //发送数据
                socket.Send(message);
            }
            catch
            {
                Console.WriteLine("发送失败");
            }
            

        }
        /// <summary>
        /// 用于接收服务端的信息
        /// </summary>
        private static void ReceiveThread()
        {
            bool tempkey = true;
            while(tempkey)
            {
                try
                {
                    byte[] message = new byte[1024];
                    int length = socket.Receive(message);
                    //Console.WriteLine(length);
                    byte[] messageN = message.Skip(0).Take(length).ToArray();
                    if (length == 0) break;
                    string str = Encoding.UTF8.GetString(messageN);
                    Console.WriteLine(str);
                }
                catch
                {
                    Console.WriteLine("与服务器失去连接");
                    Console.ReadKey();
                }
                

                //socket.Close();
                //break;
            }
        }




    }
}

 

posted on 2019-04-16 15:07  91焦先生  阅读(549)  评论(0)    收藏  举报