Socket的由来
Socket的概念最早由Berkeley UNIX提出;
专门用来处理在网络上传输数据的过程;
Socket自提出以来一直就是网络应用程序最重要且应用最为广泛的技术;
通过Socket概念进行网络联机,可以避免处理切割数据封包、分段传输与数据重组等繁复的细节
引用Socket
System.Net.Sockets命名空间主要包括Sockets网络通信应用程序的相关类:
Socket类
TCPClient类
TCPListener类(监听)
UDPClient类
NetworkStream类(通讯过程中,进行流化转换的一个类)
SocketException类
Socket类的方法
Bind方法(服务器的ip地址和端口号绑定)
Accept方法(服务端接受客户端请求)
Connect方法(客户端请求服务点)
Send方法和SendTo方法
Receive方法和ReceiveFrom方法(接受对方传送信息)
Close方法和Shutdown方法(关闭连接)
接下去我们通过一个服务端和客户端的例子来了解一下Socket带给我们的便捷
我们先看一下效果图 , 当服务端启动后 , 客户端填写和服务端相同的端口号 , 并且把服务端的IP地址填写正确 , 就达到了我们今天的效果
服务端代码
public partial class Server : Form | |
{ | |
delegate void ControlChangeHandler(string msg1,string msg2); | |
private int port; | |
private Socket mySocket; | |
private Socket myAcceptSocket; | |
public Server() | |
{ | |
InitializeComponent(); | |
} | |
private void StartListen() | |
{ | |
port = Convert.ToInt32(this.txtPort.Text.Trim()); | |
try | |
{ | |
mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); | |
mySocket.Bind(new IPEndPoint(IPAddress.Parse("本机IP地址"),port )); | |
mySocket.Listen(10); | |
string msg = "等待Socket客户联机中..."; | |
this.Invoke(new ControlChangeHandler(this.onChange), new object[] {msg,"" }); | |
} | |
catch (SocketException ex) | |
{ | |
MessageBox.Show(ex.Message ); | |
} | |
} | |
private void Accept() | |
{ | |
byte[] data = new byte[1024]; | |
int length; | |
try | |
{ | |
string msg = "开始接受客户端的联机请求,接收联机信息......"; | |
this.Invoke(new ControlChangeHandler(this.onChange),new object[]{msg,""}); | |
myAcceptSocket = mySocket.Accept(); | |
length = myAcceptSocket.Receive(data ); | |
msg = "接收了" + length.ToString() + "个字节的数据"; | |
string msg1 = Encoding.UTF8.GetString(data); | |
this.Invoke(new ControlChangeHandler(this.onChange ),new object[]{msg,msg1}); | |
} | |
catch(SocketException ex) | |
{ | |
MessageBox.Show(ex.Message ); | |
} | |
} | |
private void onChange(string msg1, string msg2) | |
{ | |
if (msg1 != "") | |
{ | |
this.txtConnection.Text += msg1 + "\r\n"; | |
} | |
if (msg2 != "") | |
{ | |
this.txtAccept.Text += msg2 + "\r\n"; | |
} | |
} | |
private void btnListen_Click(object sender, EventArgs e) | |
{ | |
Thread th = new Thread(new ThreadStart(this.StartListen)); | |
th.IsBackground = true; | |
th.Start(); | |
} | |
private void btnAccept_Click(object sender, EventArgs e) | |
{ | |
Thread th = new Thread(new ThreadStart(this.Accept )); | |
th.IsBackground = true; | |
th.Start(); | |
} | |
} |
客户端代码
public partial class Client : Form | |
{ | |
delegate void ControlChangeHandler(string msg1, string msg2); | |
int port; | |
IPAddress address; | |
private Socket mySocket; | |
public Client() | |
{ | |
InitializeComponent(); | |
} | |
private void StartConnection() | |
{ | |
port = Convert.ToInt32(this.txtPort.Text.Trim()); | |
address = IPAddress.Parse(this.txtAddress.Text.Trim()); | |
try | |
{ | |
mySocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp ); | |
mySocket.Connect(address,port ); | |
//mySocket.Connect(new IPEndPoint(address,port )); | |
string msg = "联机至远程Socket........."; | |
this.Invoke(new ControlChangeHandler(this.onChange), new object[] { msg,""}); | |
} | |
catch (SocketException ex) | |
{ | |
MessageBox.Show(ex.Message ); | |
} | |
} | |
private void Send() | |
{ | |
byte[] data=new byte[1024]; | |
int length; | |
try | |
{ | |
data = Encoding.ASCII.GetBytes(this.txtSend.Text.Trim() ); | |
length = mySocket.Send(data); | |
string msg = "传送了" + length.ToString() + "字节的数据"; | |
this.Invoke(new ControlChangeHandler(this.onChange), new object[] { msg, "" }); | |
} | |
catch (SocketException ex) | |
{ | |
MessageBox.Show(ex.Message ); | |
} | |
} | |
private void onChange(string msg1, string msg2) | |
{ | |
if (msg1 != "") | |
{ | |
this.txtConnection.Text += msg1 + "\r\n"; | |
} | |
if (msg2 != "") | |
{ | |
this.txtSend.Text += msg2 + "\r\n"; | |
} | |
} | |
private void btnConnection_Click(object sender, EventArgs e) | |
{ | |
Thread th = new Thread(new ThreadStart(this.StartConnection )); | |
th.IsBackground = true; | |
th.Start(); | |
} | |
private void btnSend_Click(object sender, EventArgs e) | |
{ | |
Thread th = new Thread(new ThreadStart(this.Send )); | |
th.IsBackground = true; | |
th.Start(); | |
} | |
} |