| 文琦's profileqirenli_cnPhotosBlogLists | Help |
|
September 12 用SOCKET.NET传递STRUCT数据用序列化,贴一段代码,去年写的
using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Runtime.InteropServices; using System.IO; using System.Net; using System.Net.Sockets; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using System.Threading; using System.Text; namespace SocketTest { /// <summary> /// Form1 的摘要说明。 /// </summary> public class frmMain : System.Windows.Forms.Form { // 版本 [Serializable] private struct verHead { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] Version; public byte Compressed; public byte Encrypted; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] Reserved; } // 请求包头 [Serializable] private struct reqHead { //public verHead Info; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] Version; public byte Compressed; public byte Encrypted; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] Reserved; public short MainId; public short AssisId; public char Priority; public int PacketLen; public int RawLen; } // 应答包头 [Serializable] private struct ansHead { public int Separator; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] Version; public byte Compressed; public byte Encrypted; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] Reserved; //public verHead Info; public int MainId; public int AssisId; public char Priority; public int req; public int PacketLen; public int RawLen; } // 请求包体9021 [Serializable] private struct reqBody9021 { public short ReqId; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)] public string User; public bool bDelMyself; public bool bChangePwd; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)] public string oldPwd; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)] public string newPwd; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)] public string Reserved; } // 应答包体9021 [Serializable] private struct ansBody9021 { public char bModify; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 58)] public string errorMsg; } // 请求包9021 [Serializable] private struct req9021 { public reqHead req_head; public reqBody9021 req_body; } const int MODIFYINFO_REQ = 9021; private System.Windows.Forms.Panel plServerTop; private System.Windows.Forms.Button btnListen; private System.Windows.Forms.GroupBox gpbxServer; private System.Windows.Forms.RichTextBox rtbxServer; private System.Windows.Forms.TextBox tbxListenAddress; private System.Windows.Forms.TextBox tbxListenPort; private System.Windows.Forms.TextBox tbxServerPort; private System.Windows.Forms.TextBox tbxServerAddress; private System.Windows.Forms.Label lblListenAddress; private System.Windows.Forms.Label lblListenPort; private System.Windows.Forms.Label lblServerPort; private System.Windows.Forms.Label lblServerAddress; private System.Windows.Forms.Button btnConnect; private System.Windows.Forms.Panel plClientTop; private System.Windows.Forms.Panel plClientMessage; private System.Windows.Forms.TextBox tbxMessage; private System.Windows.Forms.Button btnSend; private System.Windows.Forms.GroupBox gpbxClient; private System.Windows.Forms.RichTextBox rtbxClient; private TcpListener tcpListen; private Thread thdListen; /// <summary> /// 必需的设计器变量。 /// </summary> private System.ComponentModel.Container components = null; public frmMain() { // // Windows 窗体设计器支持所必需的 // InitializeComponent(); // // TODO: 在 InitializeComponent 调用后添加任何构造函数代码 // } /// <summary> /// 清理所有正在使用的资源。 /// </summary> protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Windows Form Designer generated code /// <summary> /// 设计器支持所需的方法 - 不要使用代码编辑器修改 /// 此方法的内容。 /// </summary> private void InitializeComponent() { this.plServerTop = new System.Windows.Forms.Panel(); this.btnListen = new System.Windows.Forms.Button(); this.tbxListenPort = new System.Windows.Forms.TextBox(); this.lblListenPort = new System.Windows.Forms.Label(); this.tbxListenAddress = new System.Windows.Forms.TextBox(); this.lblListenAddress = new System.Windows.Forms.Label(); this.gpbxServer = new System.Windows.Forms.GroupBox(); this.rtbxServer = new System.Windows.Forms.RichTextBox(); this.plClientTop = new System.Windows.Forms.Panel(); this.btnConnect = new System.Windows.Forms.Button(); this.tbxServerPort = new System.Windows.Forms.TextBox(); this.lblServerPort = new System.Windows.Forms.Label(); this.tbxServerAddress = new System.Windows.Forms.TextBox(); this.lblServerAddress = new System.Windows.Forms.Label(); this.plClientMessage = new System.Windows.Forms.Panel(); this.btnSend = new System.Windows.Forms.Button(); this.tbxMessage = new System.Windows.Forms.TextBox(); this.gpbxClient = new System.Windows.Forms.GroupBox(); this.rtbxClient = new System.Windows.Forms.RichTextBox(); this.plServerTop.SuspendLayout(); this.gpbxServer.SuspendLayout(); this.plClientTop.SuspendLayout(); this.plClientMessage.SuspendLayout(); this.gpbxClient.SuspendLayout(); this.SuspendLayout(); // // plServerTop // this.plServerTop.Controls.AddRange(new System.Windows.Forms.Control[] { this.btnListen, this.tbxListenPort, this.lblListenPort, this.tbxListenAddress, this.lblListenAddress}); this.plServerTop.Dock = System.Windows.Forms.DockStyle.Top; this.plServerTop.Name = "plServerTop"; this.plServerTop.Size = new System.Drawing.Size(448, 32); this.plServerTop.TabIndex = 0; // // btnListen // this.btnListen.Location = new System.Drawing.Point(363, 4); this.btnListen.Name = "btnListen"; this.btnListen.TabIndex = 4; this.btnListen.Text = "侦听"; this.btnListen.Click += new System.EventHandler(this.btnListen_Click); // // tbxListenPort // this.tbxListenPort.Location = new System.Drawing.Point(251, 5); this.tbxListenPort.Name = "tbxListenPort"; this.tbxListenPort.TabIndex = 3; this.tbxListenPort.Text = "7778"; // // lblListenPort // this.lblListenPort.AutoSize = true; this.lblListenPort.Location = new System.Drawing.Point(188, 8); this.lblListenPort.Name = "lblListenPort"; this.lblListenPort.Size = new System.Drawing.Size(66, 14); this.lblListenPort.TabIndex = 2; this.lblListenPort.Text = "侦听端口:"; // // tbxListenAddress // this.tbxListenAddress.Location = new System.Drawing.Point(72, 5); this.tbxListenAddress.Name = "tbxListenAddress"; this.tbxListenAddress.TabIndex = 1; this.tbxListenAddress.Text = "127.0.0.1"; // // lblListenAddress // this.lblListenAddress.AutoSize = true; this.lblListenAddress.Location = new System.Drawing.Point(8, 8); this.lblListenAddress.Name = "lblListenAddress"; this.lblListenAddress.Size = new System.Drawing.Size(66, 14); this.lblListenAddress.TabIndex = 0; this.lblListenAddress.Text = "侦听地址:"; // // gpbxServer // this.gpbxServer.Controls.AddRange(new System.Windows.Forms.Control[] { this.rtbxServer}); this.gpbxServer.Dock = System.Windows.Forms.DockStyle.Top; this.gpbxServer.Location = new System.Drawing.Point(0, 32); this.gpbxServer.Name = "gpbxServer"; this.gpbxServer.RightToLeft = System.Windows.Forms.RightToLeft.No; this.gpbxServer.Size = new System.Drawing.Size(448, 144); this.gpbxServer.TabIndex = 1; this.gpbxServer.TabStop = false; this.gpbxServer.Text = "服务端消息"; // // rtbxServer // this.rtbxServer.Dock = System.Windows.Forms.DockStyle.Fill; this.rtbxServer.Location = new System.Drawing.Point(3, 17); this.rtbxServer.Name = "rtbxServer"; this.rtbxServer.Size = new System.Drawing.Size(442, 124); this.rtbxServer.TabIndex = 0; this.rtbxServer.Text = ""; // // plClientTop // this.plClientTop.Controls.AddRange(new System.Windows.Forms.Control[] { this.btnConnect, this.tbxServerPort, this.lblServerPort, this.tbxServerAddress, this.lblServerAddress}); this.plClientTop.Dock = System.Windows.Forms.DockStyle.Top; this.plClientTop.Location = new System.Drawing.Point(0, 176); this.plClientTop.Name = "plClientTop"; this.plClientTop.Size = new System.Drawing.Size(448, 32); this.plClientTop.TabIndex = 2; // // btnConnect // this.btnConnect.Enabled = false; this.btnConnect.Location = new System.Drawing.Point(363, 4); this.btnConnect.Name = "btnConnect"; this.btnConnect.TabIndex = 4; this.btnConnect.Text = "连接"; // // tbxServerPort // this.tbxServerPort.Location = new System.Drawing.Point(251, 5); this.tbxServerPort.Name = "tbxServerPort"; this.tbxServerPort.TabIndex = 3; this.tbxServerPort.Text = "7778"; // // lblServerPort // this.lblServerPort.AutoSize = true; this.lblServerPort.Location = new System.Drawing.Point(206, 8); this.lblServerPort.Name = "lblServerPort"; this.lblServerPort.Size = new System.Drawing.Size(42, 14); this.lblServerPort.TabIndex = 2; this.lblServerPort.Text = "端口:"; // // tbxServerAddress // this.tbxServerAddress.Location = new System.Drawing.Point(83, 5); this.tbxServerAddress.Name = "tbxServerAddress"; this.tbxServerAddress.TabIndex = 1; this.tbxServerAddress.Text = "127.0.0.1"; // // lblServerAddress // this.lblServerAddress.AutoSize = true; this.lblServerAddress.Location = new System.Drawing.Point(8, 8); this.lblServerAddress.Name = "lblServerAddress"; this.lblServerAddress.Size = new System.Drawing.Size(79, 14); this.lblServerAddress.TabIndex = 0; this.lblServerAddress.Text = "服务端地址:"; // // plClientMessage // this.plClientMessage.Controls.AddRange(new System.Windows.Forms.Control[] { this.btnSend, this.tbxMessage}); this.plClientMessage.Dock = System.Windows.Forms.DockStyle.Top; this.plClientMessage.Location = new System.Drawing.Point(0, 208); this.plClientMessage.Name = "plClientMessage"; this.plClientMessage.Size = new System.Drawing.Size(448, 32); this.plClientMessage.TabIndex = 3; // // btnSend // this.btnSend.Location = new System.Drawing.Point(363, 4); this.btnSend.Name = "btnSend"; this.btnSend.TabIndex = 1; this.btnSend.Text = "发送"; this.btnSend.Click += new System.EventHandler(this.btnSend_Click); // // tbxMessage // this.tbxMessage.Location = new System.Drawing.Point(8, 5); this.tbxMessage.Name = "tbxMessage"; this.tbxMessage.Size = new System.Drawing.Size(344, 21); this.tbxMessage.TabIndex = 0; this.tbxMessage.Text = ""; // // gpbxClient // this.gpbxClient.Controls.AddRange(new System.Windows.Forms.Control[] { this.rtbxClient}); this.gpbxClient.Dock = System.Windows.Forms.DockStyle.Fill; this.gpbxClient.Location = new System.Drawing.Point(0, 240); this.gpbxClient.Name = "gpbxClient"; this.gpbxClient.RightToLeft = System.Windows.Forms.RightToLeft.No; this.gpbxClient.Size = new System.Drawing.Size(448, 157); this.gpbxClient.TabIndex = 4; this.gpbxClient.TabStop = false; this.gpbxClient.Text = "客户端消息"; // // rtbxClient // this.rtbxClient.Dock = System.Windows.Forms.DockStyle.Fill; this.rtbxClient.Location = new System.Drawing.Point(3, 17); this.rtbxClient.Name = "rtbxClient"; this.rtbxClient.Size = new System.Drawing.Size(442, 137); this.rtbxClient.TabIndex = 0; this.rtbxClient.Text = ""; // // frmMain // this.AutoScaleBaseSize = new System.Drawing.Size(6, 14); this.ClientSize = new System.Drawing.Size(448, 397); this.Controls.AddRange(new System.Windows.Forms.Control[] { this.gpbxClient, this.plClientMessage, this.plClientTop, this.gpbxServer, this.plServerTop}); this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "frmMain"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "Socket测试"; this.Closed += new System.EventHandler(this.frmMain_Closed); this.plServerTop.ResumeLayout(false); this.gpbxServer.ResumeLayout(false); this.plClientTop.ResumeLayout(false); this.plClientMessage.ResumeLayout(false); this.gpbxClient.ResumeLayout(false); this.ResumeLayout(false); } #endregion /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { Application.Run(new frmMain()); } private void btnListen_Click(object sender, System.EventArgs e) { // 把IP地址转换为IpAddress实例 IPAddress ipListen = IPAddress.Parse(tbxListenAddress.Text); // 初始化监听器 tcpListen = new TcpListener(ipListen, int.Parse(tbxListenPort.Text) ); // 开始监听指定端口 tcpListen.Start(); // 输出服务器启动消息 AddServerMessage("在" + tbxListenPort.Text + "端口启动服务 ……"); AddServerMessage("本地节点" + tcpListen.LocalEndpoint); AddServerMessage("等待连接 ……"); btnListen.Enabled = false; thdListen = new Thread(new ThreadStart(Listen)); thdListen.Start(); } private void AddServerMessage(string sMessage) { rtbxServer.Text += DateTime.Now.ToShortTimeString() + ": " + sMessage + "\n"; } private void Listen() { while (true) { Socket serverSocket = tcpListen.AcceptSocket(); AddServerMessage("连接来自 " + serverSocket.RemoteEndPoint); NetworkStream nwStr = new NetworkStream(serverSocket); BinaryFormatter binFormat = new BinaryFormatter(); // 反序列化 ArrayList al = (ArrayList)binFormat.Deserialize(nwStr); reqHead req_head = (reqHead)al[0]; reqBody9021 req_body = (reqBody9021)al[1]; AddServerMessage(req_head.MainId.ToString()); AddServerMessage(req_body.newPwd); // 返回应答 ansHead ans_head = new ansHead(); ans_head.MainId = 9; ansBody9021 ans_body = new ansBody9021(); ans_body.errorMsg = "测试阿测试"; ArrayList alSend = new ArrayList(); alSend.Add(ans_head); alSend.Add(ans_body); req9021 req_9021 = new req9021(); req_9021.req_body.oldPwd = "天哪"; nwStr.Flush(); binFormat.Serialize(nwStr, req_9021); nwStr.Flush(); } } private void frmMain_Closed(object sender, System.EventArgs e) { try { thdListen.Abort(); tcpListen.Stop(); } catch { } } private void btnSend_Click(object sender, System.EventArgs e) { TcpClient tcpClient = new TcpClient(); try { tcpClient.Connect(tbxServerAddress.Text, int.Parse(tbxServerPort.Text)); NetworkStream nwStr = tcpClient.GetStream(); reqHead req_head = new reqHead(); req_head.MainId = 2; reqBody9021 req_body = new reqBody9021(); req_body.newPwd = "123456"; ArrayList al = new ArrayList(); al.Add(req_head); al.Add(req_body); // 序列化,发送 BinaryFormatter binFormat = new BinaryFormatter(); binFormat.Serialize(nwStr, al); nwStr.Flush(); // 反序列化,接收 /* ArrayList alReceive = (ArrayList)binFormat.Deserialize(nwStr); ansHead ans_head = (ansHead)alReceive[0]; ansBody9021 ans_body = (ansBody9021)alReceive[1]; AddClientMessage(ans_head.MainId.ToString()); AddClientMessage(ans_body.errorMsg); */ req9021 req_9021 = (req9021)binFormat.Deserialize(nwStr); AddClientMessage(req_9021.req_body.oldPwd.ToString()); // 采用短连接socket通讯,关闭套接字连接 nwStr.Close(); tcpClient.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void AddClientMessage(string sMessage) { rtbxClient.Text += DateTime.Now.ToShortTimeString() + ": " + sMessage + "\n"; } } } 不是啊。按我的格式该怎么写啊。谢谢
就是下面这段代码改一下就可以了啊
TcpClient tcpClient = new TcpClient(); try { tcpClient.Connect(tbxServerAddress.Text, int.Parse(tbxServerPort.Text)); NetworkStream nwStr = tcpClient.GetStream(); Sgip_Head req_head = new Sgip_Head(); // 创建 ArrayList al = new ArrayList(); al.Add(req_head); // 发送用以下代码 // 序列化,发送 BinaryFormatter binFormat = new BinaryFormatter(); binFormat.Serialize(nwStr, al); nwStr.Flush(); // 接收用以下代码 // 反序列化,接收 /* ArrayList alReceive = (ArrayList)binFormat.Deserialize(nwStr); Sgip_Head ans_head = (Sgip_Head)alReceive[0]; */ AddClientMessage(ans_head.MainId.ToString()); AddClientMessage(ans_body.errorMsg); */ // 采用短连接socket通讯,关闭套接字连接 nwStr.Close(); tcpClient.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message); } 不是啊。服务器端不是我写的。所以必须按我这样的格式。该怎么办啊?谢谢你
struct Sgip_Head { public int MessageLength; public int CommandId; public int SNumber1,SNumber2,SNumber3; } private void button1_Click(object sender, System.EventArgs e) { Sgip_Head mysgip; mysgip.MessageLength = 1; TcpClient tcpclnt = new TcpClient(); listBox1.Items.Add("Connecting....."); tcpclnt.Connect("192.168.0.1",8001); listBox1.Items.Add("Connected !"); String str=textBox1.Text.Trim(); Stream stm = tcpclnt.GetStream(); byte[] ba=Encoding.Unicode.GetBytes(str); listBox1.Items.Add("Transmitting....."); stm.Write(mysgip,0,20);//?????????????????? byte[] bb=new byte[100]; int k=stm.Read(bb,0,100); str=(Encoding.Unicode.GetString(bb)); listBox1.Items.Add(str); tcpclnt.Close(); } //http://www.hero-hyip.com/C-SOCKET-NET-STRUCT-t136627.htm |
|
||||
|
|