因為自己經常做Socket開發,經常要調試和維護多個服務器端和客戶端的通信、報文數據等,網上的工具都是功能簡單,用的不爽,所以一直都想自己寫一個。
Socket測試工具 已下載 822 次
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>