C#实现socket简单收发功能

因项目需求,需使用socket收发消息,故有以下代码,先行保存,免得日后实际开发完无法还原
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Configuration;
using System.Data.SqlClient;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {

        private static byte[] result = new byte[1024];
        private static int myProt = 8885;   //端口
        private static Socket serverSocket;
        private static int ConnectCount = 0;
        private static int MaxConnectCount = 3;
        private static List<string> messageList = new List<string>();
        static object objToLock = new object();

        static void Main(string[] args)
        {

            //服务器IP地址
            IPAddress ip = IPAddress.Parse("ip");
            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            serverSocket.Bind(new IPEndPoint(ip, myProt));  //绑定IP地址:端口
            serverSocket.Listen(2);    //设定最多10个排队连接请求
            Console.WriteLine("启动监听{0}成功", serverSocket.LocalEndPoint.ToString());
            new Thread(ListenClientConnect).Start();
            Console.ReadLine();

        }

        /// <summary>
        /// 监听客户端连接
        /// </summary>
        private static void ListenClientConnect()
        {
            while (true)
            {
                Socket clientSocket = serverSocket.Accept();
                //clientSocket.Send(Encoding.UTF8.GetBytes("string###又来个逗比!mdzz"));
                //Console.WriteLine("123");

                //FileStream fs = new FileStream("D:/23.jpg", FileMode.Open);
                //BinaryReader br = new BinaryReader(fs);
                //Byte[] byData = br.ReadBytes((int)fs.Length);
                //fs.Close();

                //Console.WriteLine("2");

                //clientSocket.Send(byData);

                //Console.WriteLine("3");
                if (ConnectCount < MaxConnectCount)
                {
                    clientSocket.Send(Encoding.UTF8.GetBytes("又来个逗比!mdzz"));
                    Thread receiveThread = new Thread(ReceiveMessage);
                    receiveThread.Start(clientSocket);
                }
                else
                {
                    clientSocket.Send(Encoding.UTF8.GetBytes("超过最大连接数"));
                    clientSocket.Close();
                }

            }
        }

        /// <summary>
        /// 接收消息
        /// </summary>
        /// <param name="clientSocket"></param>
        private static void ReceiveMessage(object clientSocket)
        {

            if (ConnectCount < MaxConnectCount)
            {
                ConnectCount++;
                Socket myClientSocket = (Socket)clientSocket;
                int receiveNumber = -1;
                string userName = "";

                while(userName.Equals(""))
                {
                    Console.WriteLine("等待用户名");
                    receiveNumber = myClientSocket.Receive(result);
                    if (receiveNumber > 0)
                    {
                        userName = Encoding.UTF8.GetString(result, 0, receiveNumber);
                        Console.WriteLine("获取用户名:" + userName);
                        //发送数据
                        myClientSocket.Send(Encoding.UTF8.GetBytes("接收账号:" + userName));
                    }
                }

                int count = 0;
                Boolean filestar = false;
                MemoryStream ms = new MemoryStream();
                while (true)
                {   
                    try
                    {

                        if (myClientSocket.Poll(-1, SelectMode.SelectRead))
                        {
                            //通过clientSocket接收数据
                            receiveNumber = myClientSocket.Receive(result);
                            if (receiveNumber > 0)
                            {
                                
                                if (Encoding.UTF8.GetString(result, 0, receiveNumber).IndexOf("filestar")==0)
                                {
                                    Console.WriteLine("接收客户端{0}消息{1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.UTF8.GetString(result, 0, receiveNumber));
                                    filestar = true;
                                }

                                if (filestar)
                                {
                                    if (Encoding.UTF8.GetString(result, 0, receiveNumber).IndexOf("fileend") == 0)
                                    {
                                        Console.WriteLine("接收客户端{0}消息{1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.UTF8.GetString(result, 0, receiveNumber));
                                        FileStream fs = new FileStream("D:\\test.jpg", FileMode.OpenOrCreate);
                                        BinaryWriter w = new BinaryWriter(fs);
                                        w.Write(ms.ToArray());
                                        fs.Close();
                                        myClientSocket.Send(Encoding.UTF8.GetBytes("fielLength:" + ms.Length));
                                        ms.Dispose();
                                        count = 0;
                                    }
                                    else if(count==1)
                                    {
                                        ms.Write(result, 0, receiveNumber);
                                    }else
                                    {
                                        count++;
                                    }
                                }

                                //发送数据
                                //myClientSocket.Send(Encoding.UTF8.GetBytes("接收完成,数据反馈端口:" + myClientSocket.RemoteEndPoint.ToString()));
                            }
                            else if (receiveNumber==0)
                            {
                                //socket连接已断开
                                Console.WriteLine("断开");
                                myClientSocket.Close();
                                ConnectCount--;
                                break;
                            }

                        }
                        else
                        {
                            //socket连接已断开
                            Console.WriteLine("断开123");
                            myClientSocket.Close();
                            ConnectCount--;
                            break;
                        }

                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                        myClientSocket.Shutdown(SocketShutdown.Both);
                        break;
                    }

                }
            }
            else 
            {
                Console.WriteLine("超过最大链接客户端");
            }

        }

    }

}

猜你喜欢

转载自lin358.iteye.com/blog/2344603
今日推荐