一般利用Sockert都傳送文字字串.
那如果要傳送class or struct的資料怎麼辦呢.
重點就是先將class or struct序列化.
直接看範例吧.
共用Class or Struct
person.cs
01 | using System; |
02 | using System.Collections.Generic; |
03 | using System.Text; |
04 |
05 | namespace ClassLibrary2 |
06 | { |
07 | [Serializable] |
08 | public class class_person |
09 | { |
10 | public string id; |
11 | public string name; |
12 | } |
13 |
14 | [Serializable] |
15 | public struct struct_person |
16 | { |
17 | public string id; |
18 | public string name; |
19 | } |
20 | } |
Client端,要using共用的dll
Form1.cs
01 | using System; |
02 | using System.Collections.Generic; |
03 | using System.ComponentModel; |
04 | using System.Data; |
05 | using System.Drawing; |
06 | using System.Text; |
07 | using System.Windows.Forms; |
08 | using System.Net.Sockets; |
09 | using System.Net; |
10 | using System.Threading; |
11 | using ClassLibrary2; |
12 | using System.Runtime.Serialization.Formatters.Binary; |
13 | using System.IO; |
14 |
15 | namespace WindowsApplication5 |
16 | { |
17 | public partial class Form1 : Form |
18 | { |
19 | public Form1() |
20 | { |
21 | InitializeComponent(); |
22 | } |
23 |
24 | private void btnSendClassData_Click( object sender, EventArgs e) |
25 | { |
26 | try |
27 | { |
28 | IPEndPoint hostEP = new IPEndPoint(IPAddress.Parse( this .tbIp.Text), int .Parse( this .tbPort.Text)); |
29 | Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); |
30 | socket.Connect(hostEP); |
31 | byte [] bytesSend = new byte [1024]; |
32 |
33 | //序列化 |
34 | BinaryFormatter bf = new BinaryFormatter(); |
35 | MemoryStream stream = new MemoryStream(); |
36 | class_person person = new class_person(); |
37 | person.id = this .tbId.Text; |
38 | person.name = this .tbName.Text; |
39 | bf.Serialize(stream, person); |
40 |
41 | bytesSend = stream.ToArray(); |
42 | socket.SendTo(bytesSend, 0, hostEP); |
43 | socket.Shutdown(SocketShutdown.Both); |
44 | socket.Close(); |
45 | } |
46 | catch (Exception ex) |
47 | { |
48 | MessageBox.Show(ex.ToString()); |
49 | } |
50 | } |
51 | } |
52 | } |
Server端,要using共用的dll
Form1.cs
001 | using System; |
002 | using System.Collections.Generic; |
003 | using System.ComponentModel; |
004 | using System.Data; |
005 | using System.Drawing; |
006 | using System.Text; |
007 | using System.Windows.Forms; |
008 | using System.Net.Sockets; |
009 | using System.Net; |
010 | using System.Threading; |
011 | using ClassLibrary2; |
012 | using System.Runtime.Serialization.Formatters.Binary; |
013 | using System.IO; |
014 |
015 | namespace WindowsApplication4 |
016 | { |
017 | public partial class Form1 : Form |
018 | { |
019 | delegate void SetTextCallback( byte [] data); |
020 | delegate void GetTextCallback(); |
021 |
022 | Thread startThread; |
023 | Socket socket; |
024 |
025 | public Form1() |
026 | { |
027 | InitializeComponent(); |
028 | } |
029 |
030 | private void btnOpenListen_Click( object sender, EventArgs e) |
031 | { |
032 | startThread = new Thread( new ParameterizedThreadStart(start)); |
033 | startThread.Start(); |
034 | this .btnOpenListen.Enabled = false ; |
035 | this .btnCloseListen.Enabled = true ; |
036 | } |
037 |
038 | private void btnCloseListen_Click( object sender, EventArgs e) |
039 | { |
040 | socket.Close(); |
041 | startThread.Abort(); |
042 | this .btnOpenListen.Enabled = true ; |