1.了解Socket
Socket自提出以来一直就是网络应用程序最重要且应用最为广泛的技术 通过Socket概念进行网络联机,可以避免处理切割数据封包、分段传输与数据重组等繁复的细节。 2. 命名空间 System.Net.Sockets命名空间主要包括Sockets网络通信应用程序的相关类: ◦ Socket类 ◦ TCPClient类 ◦ TCPListener类 ◦ UDPClient类
◦ NetworkStream类
◦
3. Socket类的方法成员
Bind方法
} Accept方法 } Connect方法 } Send方法和SendTo方法 }
SocketException类
Close方法和Shutdown方法 Receive方法和ReceiveFrom方法 4.服务器端的代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Text; using System.Windows.Forms; using System.Net; using System.Net.Sockets; using System.Threading; namespace TcpServer { public partial class Server : Form { delegate void ControlChangeHandler(string msg1,string msg2); int port; TcpListener myTcpListener; NetworkStream myNetworkStream; private void StartListen() { port = Convert.ToInt32(this.txtPort.Text.Trim()); myTcpListener = new TcpListener(port); try { myTcpListener.Start(); string msg = "等待联机中........"; this.Invoke(new ControlChangeHandler(onChange), new object[] { msg,""}); Socket mySocket = myTcpListener.AcceptSocket(); while (true) { if (mySocket.Connected) { msg = "通信端口" + txtPort.Text + "联机成功"; this.Invoke(new ControlChangeHandler(onChange), new object[] { msg, "" }); myNetworkStream = new NetworkStream(mySocket); string Message; byte[] data = new byte[1024]; myNetworkStream.Read(data, 0, data.Length); Message = Encoding.ASCII.GetString(data); this.Invoke(new ControlChangeHandler(onChange), new object[] { "", Message }); } } } catch (SocketException ex) { MessageBox.Show(ex.Message); } } private void Send() { string Message = this.txtMsg.Text; byte[] data = Encoding.ASCII.GetBytes(Message); myNetworkStream.Write(data,0,data.Length ); } private void onChange(string msg1, string msg2) { if (msg1 != "") { this.txtConnection.Text += msg1 + "/r/n"; } if (msg2 != "") { this.txtMsg.Text += msg2 + "/r/n"; } } public Server() { InitializeComponent(); } private void btnListen_Click(object sender, EventArgs e) { Thread th = new Thread(new ThreadStart(this.StartListen )); th.IsBackground = true; th.Start(); } private void btnSend_Click(object sender, EventArgs e) { this.Send(); } } } 5.客户端的代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Windows.Forms; using System.Text; using System.Net; using System.Net.Sockets; using System.Threading; namespace TCPClient { public partial class Client : Form { delegate void ControlChangeHandler(string msg); private TcpClient myTcpClient = new TcpClient(); private NetworkStream myNetworkStream; private void Connect() { try { string HostName = this.txtServer.Text; int port = Convert.ToInt32(txtPort.Text); myTcpClient.Connect(IPAddress.Parse(HostName), port); myNetworkStream = myTcpClient.GetStream(); string msg = "主机:" + HostName + ",通信端口:" + txtPort.Text + "连接成功"; this.txtConnection.Text = msg; Thread th = new Thread(new ThreadStart(Read)); th.IsBackground = true; th.Start(); } catch (Exception e) { MessageBox.Show(e.Message ); } } private void Send() { string Msg = this.txtMsg.Text; byte[] data = Encoding.ASCII.GetBytes(Msg); myNetworkStream.Write(data,0,data.Length ); } private void Read() { while (true) { if (myTcpClient.Connected) { int DataSize = myTcpClient.ReceiveBufferSize; byte[] data = new byte[DataSize]; myNetworkStream.Read(data, 0, DataSize); string Msg = Encoding.ASCII.GetString(data, 0, data.Length); this.Invoke(new ControlChangeHandler(onChange), new object[] { Msg }); } } } private void onChange(string msg) { this.txtMsg.Text = msg+"/r/n"; } public Client() { InitializeComponent(); } private void btnConnect_Click(object sender, EventArgs e) { this.Connect(); } private void btnSend_Click(object sender, EventArgs e) { this.Send(); } } }