C#服务端与客户端使用Socket TCP通信

C#服务端与客户端使用Socket TCP通信

服务端

TCPCSServer.cs 代码

using System;
using System.Net.Sockets;
using System.Net;
using TCPCSServer.Message;

namespace TCPCSServer
{
    class TCPCSServer
    {
        //服务器端IP地址与端口
        private static String localIPAddress = "192.168.1.9";
        private static int localIPPoint = 18888;
        //接收客户端消息的数据流大小
        private static int dataBufferSize = 258;
        static void Main(string[] args)
        {
            Console.WriteLine("Tcp Socket ——服务器端");
            StartServerAsync();

            Console.ReadLine();
        }

        static byte[] dataBuffer = new byte[dataBufferSize];
        private static Socket serverSocket = null;//服务端Socket
        static void StartServerAsync()
        {
            CreatServerSocket();//创建服务器端Socket
            serverSocket.BeginAccept(AcceptCallBack, serverSocket);
        }
        static void CreatServerSocket()
        {
            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress iPAddress = IPAddress.Parse(localIPAddress);
            IPEndPoint iPEndPoint = new IPEndPoint(iPAddress, localIPPoint);
            serverSocket.Bind(iPEndPoint);//绑定ip与端口号
            serverSocket.Listen(0);//开始监听端口号
        }
        static void AcceptCallBack(IAsyncResult asyncResult)
        {
            Socket newserverSocket = null;
            Socket clientSocket = null;
            try
            {
                newserverSocket = asyncResult.AsyncState as Socket;
                clientSocket = newserverSocket.EndAccept(asyncResult);
            }catch(Exception e)
            {
                Console.WriteLine(e.ToString());
                if (clientSocket != null)
                {
                    clientSocket.Close();
                }
                StartServerAsync();
                return  ;
            }
            
            //向客户端发送一条消息
            string msg = "Hello client,connect to server success...";
            byte[] data = System.Text.Encoding.UTF8.GetBytes(msg);
            clientSocket.Send(data);

            BeginReceiveFunc(clientSocket);
            serverSocket.BeginAccept(AcceptCallBack, serverSocket);
        }
        //使用Message类的成员变量与方法
        static MessageClass message = new MessageClass();
        static void ReceiveCallBack(IAsyncResult asyncResult)
        {
            Socket clientSocket = null;
            
            try
            {
                clientSocket = asyncResult.AsyncState as Socket;
                int count = clientSocket.EndReceive(asyncResult);
                if (count == 0)
                {
                    clientSocket.Close();
                    return;
                }
                message.AddCountAndReadMess(message,count);
                //string msgReceive = Encoding.UTF8.GetString(dataBuffer, 0, count);
                //Console.WriteLine("receive from client({0}):{1}", count, msgReceive);
                BeginReceiveFunc(clientSocket);

            }catch(Exception e)
            {
                Console.WriteLine(e.ToString());
                if (clientSocket != null)
                {
                    clientSocket.Close();
                    serverSocket.Close();
                }
            }
        }
        
        static void BeginReceiveFunc(Socket clientSocket)
        {
            clientSocket.BeginReceive(message.Data, message.StartIndex, message.RemainSize, SocketFlags.None, ReceiveCallBack, clientSocket);
        }
    }
}

客户端

TCPCSClient.cs 代码

using System;
using System.Text;
using System.Net.Sockets;
using System.Net;

namespace TCPCSClient
{
    class TCPCSClient
    {
        //服务器端IP地址与端口
        private static String localIPAddress = "192.168.1.9";
        private static int localIPPoint = 18888;
        //接收客户端消息的数据流大小
        private static int dataBufferSize = 258;
        
        private static bool openPort = false;//服务器服务与端口是否开启
        private static bool isFirstConnect = false;
        private static bool firstConnectFlag = true;
        static void Main(string[] args)
        {
            Console.WriteLine("Tcp Socket ——客户端");
            Console.WriteLine("---请在下方输入要发送的内容,输入quit退出连接---");
            ConnectSocket();

            Console.ReadLine();
        }


        private static Socket ConnectSocket()
        {
            Socket newClientSocket = null;
            try
            {
                newClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
                newClientSocket.Connect(new IPEndPoint(IPAddress.Parse(localIPAddress), localIPPoint));
                ReceiveCallback(newClientSocket);
                openPort = true;
            }
            catch (Exception e)
            {
                Console.WriteLine("远程服务未开启,请稍后再试...\n{0}", e.ToString());
                openPort = false;
            }

            while (true)
            {
                string strSend = Console.ReadLine();
                if (strSend.Equals("quit")) break;
                else if (strSend.Equals("connect"))ConnectSocket();
                try
                {
                    if (openPort)
                    {
                        newClientSocket.Send(Encoding.UTF8.GetBytes(strSend));
                    }

                }
                catch (Exception e)
                {
                    Console.WriteLine(e.ToString());
                    newClientSocket.Close();
                }
            }
            newClientSocket.Close();
            return null;
        }
        private static void ReceiveCallback(Socket newClientSocket)
        {
            if (firstConnectFlag)
            {
                isFirstConnect = true;
                firstConnectFlag = false;
            }
            //从服务端接收数据
            if (isFirstConnect)
            {
                try
                {
                    byte[] data = new byte[dataBufferSize];
                    int count = newClientSocket.Receive(data);
                    string msgReceive = Encoding.UTF8.GetString(data, 0, count);
                    Console.WriteLine("receive form server({0}):{1}", count, msgReceive);
                    isFirstConnect = false;
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.ToString());
                }

            }
        }
    }
}

中间件Message

TCPCSServer1/Message.cs 代码

using System;
using System.Text;

namespace TCPCSServer1.Message
{
    class MessageClass
    {
        private static int bufferSize = 10;
        private byte[] data = new byte[bufferSize];//消息数据缓存流大小
        private int startIndex = 0;//在数组中即将存取数据的位置
        private int remainSize = bufferSize;

        private int arrayMessHead = 4;
        public void AddCount(int count)
        {
            startIndex += count;
        }
        public byte[] Data
        {
            get { return data; }
            set
            {
                data = value;
            }
        }
        public int StartIndex
        {
            get { return startIndex; }
            set
            {
                startIndex += value;
            }
        }

        public int RemainSize
        {
            get
            {
                return remainSize -= startIndex;
            }
        }
        public void ReadMessageServer(int amount)
        {
            Console.WriteLine("startIndex:{0},count:{1}", startIndex,amount);
            string count = Convert.ToString(amount);
            while (true)
            {
                if (startIndex <= 0) break;
                if(true)
                //if ((startIndex - 4) >= count)
                {
                    string strMess = Encoding.UTF8.GetString(data, 0, amount);
                    Console.WriteLine("解析前的数据:{0}", strMess);
                    string mess = String.Concat(count,strMess);
                    Console.WriteLine("解析后的数据:{0}", mess);
                    startIndex -= amount;
                }
                else
                {
                    break;
                }
            }
        }
        public void AddCountAndReadMess(MessageClass message,int count)
        {
            message.AddCount(count);
            message.ReadMessageServer(count);
        }
        public void ReadMessage()
        {
            Console.WriteLine("startIndex:{0}--remainSize:{1}",startIndex, remainSize);
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值