C# TCP 自己看,别人看了没有用

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Sayesan/article/details/76480489

//#define MONO
using System;
using ICPACS.Common;
using ICPACS.Desktop.View.WinForms;
using System.Windows.Forms;
using System.IO;
using ScoketSever;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using Microsoft.Win32;


namespace ICPACS.Desktop.Executable
{
   
class Program
{
        public struct fileWrite
        {
            public string filePath;
            public byte[] bb;
            public int readCount;


        }


        static TcpListener listener = null;
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
            Platform.Log(LogLevel.Debug, "——开始启动——");
//Always at least try to let our application code handle the exception.
//Setting this to "catch" means the Application.ThreadException event
//will fire first, essentially causing the app to crash right away and shut down.
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);


#if !MONO
SplashScreenManager.DisplaySplashScreen();
            Platform.Log(LogLevel.Debug, "——DisplaySplashScreen开始——");
#endif
            
Platform.PluginManager.PluginLoaded += new EventHandler<PluginLoadedEventArgs>(OnPluginProgress);


            if (!Directory.Exists("D:\\socketTest\\")) //创建DCM图像下载的临时文件夹
            {
                Directory.CreateDirectory("D:\\socketTest\\");
            }




            SetParametersToReg();//设置转换jpeg2000的注册表信息


            Platform.Log(LogLevel.Debug, "——SetParametersToReg开始——");




            //服务端监听任何IP 但是端口号是80的连接
            IPAddress localIp = GetFirstIP();
            //TcpListener listener = new TcpListener(IPAddress.Parse("192.168.102.195"), 5000);
            listener = new TcpListener(localIp, 5000);


            //监听对象开始监听
            listener.Start();




            //启动接收图像线程 lcb
            Thread t = new Thread(new ThreadStart(ConnectAndListen));
            t.Start();




            //湘雅医院
            //var listener = new TCPListener();
            //listener.Port = 5000;
            //listener.ReceiveCompleted += listener_ReceiveCompleted;
            //listener.Start();
 
            // check for command line arguments
            if (args.Length > 0)
            {
                // for the sake of simplicity, this is a naive implementation (probably needs to change in future)
                // if there is > 0 arguments, assume the first argument is a class name
                // and bundle the subsequent arguments into a secondary array which is 
                // forwarded to the application root class
                string[] args1 = new string[args.Length - 1];
                Array.Copy(args, 1, args1, 0, args1.Length);


                Platform.Log(LogLevel.Debug, "—— Platform.StartApp(args[0], args1);开始——");




                Platform.StartApp(args[0], args1);
            }
            else
            {
                Platform.StartApp();
                Platform.Log(LogLevel.Debug, "—— Platform.StartApp();开始——");
            }




            //关闭监听
            if (listener != null)
            {
                listener.Stop();
            }


            //关闭线程
            t.Abort();
            


}


        //湘雅医院
        public static string GetHostName()
        {
            return Dns.GetHostName();
        }


        public static IPAddress[] GetLocalIP()
        {
            string name = Dns.GetHostName();
            IPHostEntry me = Dns.GetHostEntry(name);
            return me.AddressList;
        }


        public static IPAddress GetFirstIP()
        {
            IPAddress[] ips = GetLocalIP();
            foreach (IPAddress ip in ips)
            {
                if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6)
                    continue;
                return ip;
            }
            return ips != null && ips.Length > 0 ? ips[0] : new IPAddress(0x0);
        }


        static void ConnectAndListen()
        {
                while (true)
                {
                    try
                    {
                        //线程会挂在这里,直到客户端发来连接请求
                        TcpClient client = listener.AcceptTcpClient();
                        using (client)
                        {
                            NetworkStream ns = client.GetStream();


                            //StreamReader sr = new StreamReader(ns);
                            //string result = sr.ReadToEnd(); 
                            using (ns)
                            {


                                byte[] lenBuf = new byte[4];
                                ns.Read(lenBuf, 0, 4);
                                int len = BitConverter.ToInt32(lenBuf, 0);


                                byte[] fileNameBuf = new byte[128];
                                ns.Read(fileNameBuf, 0, 128);
                                string fileName = System.Text.Encoding.Default.GetString(fileNameBuf).TrimEnd('\0');






                                byte[] buffer = new byte[len];
                                //int readCount = ns.Read(buffer, 0, len);


                                int readCount = 0;
                                int startPos = 0;
                                while ((readCount = ns.Read(buffer, startPos, len - startPos)) > 0)
                                {
                                    if (startPos + readCount == len)
                                    {
                                        break;
                                    }
                                    else
                                    {
                                        startPos += readCount;
                                    }
                                }


                                fileWrite fw = new fileWrite();
                                fw.bb = buffer;
                                fw.readCount = len;
                                fw.filePath = @"D:\socketTest\" + fileName;


                                ThreadPool.QueueUserWorkItem(new WaitCallback(savefileThread), fw);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        //if (listener != null)
                        //{
                        //    listener.Stop();
                        //}
                    }
                }


            //catch(Exception ex)
            //{
            //    if (listener != null)
            //    {
            //        listener.Stop();
            //    }
            //}


        }
        static public void savefileThread(object o)
        {
            try
            {
                fileWrite fw = (fileWrite)o;


                if (File.Exists(fw.filePath))
                {
                    return;
                }


                StreamWriter storageFileWrite = new StreamWriter(fw.filePath);
                storageFileWrite.BaseStream.Write(fw.bb, 0, fw.readCount);
                storageFileWrite.Close();




                fw.bb = null;
            }
            catch (Exception e)
            {


            }
        }


        //湘雅医院 收图
        //static void listener_ReceiveCompleted(object sender, SocketEventArgs e)
        //{
        //    byte[] fileBytes = e.Data;
        //    byte[] fileNameBytes = new byte[128];
        //    Array.Copy(fileBytes, fileNameBytes, 128);
        //    string fileName = System.Text.Encoding.Default.GetString(fileNameBytes).TrimEnd('\0');


        //    string strTmpName = @"D:\socketTest\" + fileName;
        //    if (File.Exists(strTmpName))
        //    {
        //        return;
        //    }
        //    using (FileStream fsWrite = new FileStream(@"D:\socketTest\" + fileName, FileMode.Create))
        //    {


        //        fsWrite.Write(fileBytes, 128, fileBytes.Length - 128);


        //    };


        //}


        /// <summary>
        /// 获取系统临时目录
        /// </summary>
        /// <returns></returns>
        public static string GetTempDir()
        {
            string tempDir;
            if ((tempDir = Environment.GetEnvironmentVariable("TEMP")) == null)
            {
                if ((tempDir = Environment.GetEnvironmentVariable("TMP")) == null)
                {
                    tempDir = @"C:/iMedPACS_TEMP";
                }
            }
            if (!Directory.Exists(tempDir))
            {
                Directory.CreateDirectory(tempDir);
            }
            return tempDir;
        }


        /// <summary>
        /// 配置文件参数写入注册表
        /// </summary>
        /// <param name="rkey3"></param>
        public static void SetValuesToReg(RegistryKey rkey3)
        {
            string tempDir = GetTempDir();
            tempDir = tempDir.TrimEnd('\\');
            rkey3.SetValue("Configuration", "hpconfig.xml");
            string filePath = System.IO.Path.Combine(tempDir, "hpconfig.xml");
            if (!File.Exists(filePath))
            {
                FileStream fs = File.Create(filePath);
                fs.Close();
            }
            rkey3.SetValue("Home", tempDir);
        }




        /// <summary>
        /// 配置文件配置信息更新到注册表中
        /// </summary>
        public static void SetParametersToReg()
        {
            RegistryKey rkey = null;
            RegistryKey rkey1 = null;
            RegistryKey rkey2 = null;
            RegistryKey rkey3 = null;
            try
            {
                rkey = Registry.LocalMachine;
                rkey1 = rkey.OpenSubKey("SOFTWARE\\WOW6432Node", false);
                if (rkey1 == null)
                    rkey1 = rkey.OpenSubKey("SOFTWARE", false);
                rkey2 = rkey1.OpenSubKey("ROGAN", true);
                if (rkey2 == null)
                {
                    rkey2 = rkey1.CreateSubKey("ROGAN");
                }
                rkey3 = rkey2.OpenSubKey("OnlineXS\\6.2", true);
                if (rkey3 == null)
                {
                    rkey3 = rkey2.CreateSubKey("OnlineXS\\6.2");
                    SetValuesToReg(rkey3);
                }
                else
                {
                    SetValuesToReg(rkey3);
                    string fileName = rkey3.GetValue("Configuration").ToString();
                    string filePath = rkey3.GetValue("Home").ToString();
                    if (!File.Exists(System.IO.Path.Combine(filePath, fileName)))
                    {
                        SetValuesToReg(rkey3);
                    }
                }
            }
            catch (Exception e)
            {
                //CLogger._log.Error(e.Message, e);
            }
            finally
            {
                if (rkey3 != null)
                {
                    rkey3.Close();
                }
                if (rkey2 != null)
                {
                    rkey2.Close();
                }
                if (rkey1 != null)
                {
                    rkey1.Close();
                }
                if (rkey != null)
                {
                    rkey.Close();
                }
            }
        }        /// <summary>




private static void OnPluginProgress(object sender, PluginLoadedEventArgs e)
{
Platform.CheckForNullReference(e, "e");
#if !MONO
SplashScreenManager.SetStatus(e.Message);


if (e.PluginAssembly != null)
SplashScreenManager.AddAssemblyIcon(e.PluginAssembly);
#endif
        }


}
}

展开阅读全文

没有更多推荐了,返回首页