Socket報文和端口測試工具的開發(提供源碼)


因為自己經常做Socket開發,經常要調試和維護多個服務器端和客戶端的通信、報文數據等,網上的工具都是功能簡單,用的不爽,所以一直都想自己寫一個。

Socket測試工具Socket測試工具 已下載 822 次   Socket測試工具源碼Socket測試工具源碼 已下載 894 次   

 

年底不忙了,終於寫了一個,提供給大家使用,源碼可以隨便使用和修改,歡迎多提意見,讓這個工具更易用,方便Socket編程開發人魚。主要的功能如下:

1.建立Socket測試服務器端和測試客戶端,並向其他端發送或接受報文數據,支持自動發送和自動應答,支持UDP和TCP;

2.錄入的IP地址和端口等參數數據進行本地XML序列化,下次自動打開。(這個是我需要的,不用每次都錄入各種IP地址端口了);

3.接受或發送的報文數據,可以直接保存在日志文件當中,便於離線分析。

4.服務器端,可以查看接入的各個連接信息;

5.支持AscII和16進制的數據發送和接收顯示。

 

由於界面要同時支持TCP和UDP的數據通信,所以編寫了兩個接口IServer和IClient,便於界面和通信層分開。

public interface IServer
    {
        //初始化
        void Init(string serverIp, int port);
        //從服務器端給某個連接發送數據
        void Send(string connId, byte[] data, int length);
        //監聽
        int Listen();
        //得到當前的連接
        List<IConnection> GetConnectionList();
        //Socket事件
        event ReceivedHandler OnDataReceived;
        event SocketErrorHandler OnSocketError;

        void Close();
    }

 

為了保存參數數據,所以構造了一個SocketInfo類,對應客戶端和服務器端,然后將這個集合序列化到XML文件中。

序列化的代碼如下:

[Serializable]
    public class SocketInfo
    {
        public string Name { get; set; }
        //Server端或客戶端類型
        public string Type { get; set; }
        //16進制格式或AscII
        public string Format { get; set; }

        public string ServerIp { get; set; }

        public int Port { get; set; }
        //TCP或UDP
        public string Protocol { get; set; }
        //報文數據
        public string Data {get;set;}
        //是否自動發送或接收數據
        public Boolean IsAuto {get;set;}

        public SocketInfo()
        {
            Format = "AscII";
            Protocol = "Tcp";
            Port = 8890;
            ServerIp = "127.0.0.1";
            Data = "請錄入測試數據";
        }
    }

 

public class MySerializer
    {      

        public static void Serialize<T>(T value, string xmlFileName)
        {
            if (value == null)
            {
                return;
            }

            XmlSerializer serializer = new XmlSerializer(typeof(T));
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Encoding = new UnicodeEncoding(false, false);
            settings.Indent = false;
            settings.OmitXmlDeclaration = false;
            FileStream fs = new FileStream(xmlFileName, FileMode
                .OpenOrCreate);

            serializer.Serialize(fs, value);
            fs.Close();
        }

        public static T Deserialize<T>(string xmlFileName)
        {
            if (string.IsNullOrEmpty(xmlFileName))
            {
                return default(T);
            }

            XmlSerializer serializer = new XmlSerializer(typeof(T));
            //XmlSerializer serializer = new XmlSerializer(typeof(ArrayList));
            XmlReaderSettings settings = new XmlReaderSettings();
            //settings.

            FileStream fs = null;
            try
            {
                fs = new FileStream(xmlFileName, FileMode.Open);

                // Deserialize the content of the XML file to a Contact array 
                // utilizing XMLReader
                XmlReader reader = new XmlTextReader(fs);
                T contacts = (T)serializer.Deserialize(reader);

                return contacts;
            }
            catch (FileNotFoundException)
            {
                // Do nothing if the file does not exists
            }
            finally
            {
                if (fs != null) fs.Close();
            }

            return default(T);
        }
    }

 

客戶端的報文和服務器端的報文數據存放在Client.log和Server.log兩個文件當中.主要是借助了Log4net的配置實現的.

<log4net>
        <root>
            <level value="ALL" />
            <appender-ref ref="RollingFileAppender" />
        </root>
        <appender name="ClientLogFileAppender" type="log4net.Appender.RollingFileAppender">
            <param name="File" value="client.log"/>
            <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
            <appendToFile value="true" />
            <rollingStyle value="Size" />
            <maxSizeRollBackups value="3" />
            <maximumFileSize value="2MB" />
            <staticLogFileName value="true" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="記錄時間:%date 日志:%message%newline" />
            </layout>
        </appender>

        <logger name="SocketTool.ClientForm">
            <level value="DEBUG" />
            <appender-ref ref="ClientLogFileAppender" />
        </logger>

        <appender name="ServerLogFileAppender" type="log4net.Appender.RollingFileAppender">
            <param name="File" value="server.log"/>
            <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
            <appendToFile value="true" />
            <rollingStyle value="Size" />
            <maxSizeRollBackups value="3" />
            <maximumFileSize value="2MB" />
            <staticLogFileName value="true" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="記錄時間:%date 日志:%message%newline" />
            </layout>
        </appender>

        <logger name="SocketTool.ServerForm">
            <level value="DEBUG" />
            <appender-ref ref="ServerLogFileAppender" />
        </logger>
       
    </log4net>

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM