---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------
套接字是支持TCP/IP协议的网络通信的基本操作单元。可以将套接字看作不同主机间的进程进行双向通信的端点,它构成了单个主机内及整个网络间的编程界面。套接字通常和同一个域中的套接字交换数据,各种进程使用这个相同的域互相之间用Internet协议进行通信。
套接字有两种不同的类型:流套接字和数据报套接字。
要通过互联网进行通信,至少需要一对套接字,其中一个运行于客户端,称之为ClientSocket,另一个运行于服务器端,称之为ServerSocket。
套接字类socket 命名空间using System.Net.Sockets;在套接字连接中ip地址类命名空间 using System.Net;应用到IPAddress,IPEndPoint类
下面是简单的通讯实例
服务器端:
Thread threadWatch = null;
Socket socketWatch = null;
private void btnBeginlisten_Click(object sender, EventArgs e)
{
//创建服务器监听套接字
socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress address = IPAddress.Parse(txtIP.Text.Trim());//获取ip地址
IPEndPoint endpoint = new IPEndPoint(address, int.Parse(txtport.Text.Trim()));//获取网络节点
socketWatch.Bind(endpoint);
socketWatch.Listen(10);
threadWatch = new Thread(WatchConnecting);
threadWatch.IsBackground = true;
threadWatch.Start();
ShowMsg("服务器启动监听成功!");
}
Dictionary<string, Socket> dict = new Dictionary<string, Socket>();
//Dictionary<string, Thread> dictthread = new Dictionary<string, Thread>();
void WatchConnecting()
{
while (true)
{
Socket socketConnection = socketWatch.Accept();//创建新的连接套接字
lbOnline.Items.Add(socketConnection.RemoteEndPoint.ToString());
dict.Add(socketConnection.RemoteEndPoint.ToString(), socketConnection);
Thread recthread = new Thread(RecMsg);
recthread.IsBackground = true;
recthread.Start(socketConnection);
//dictthread.Add(socketConnection.RemoteEndPoint.ToString(), recthread);
ShowMsg("客户端连接成功!"+socketConnection.RemoteEndPoint.ToString());
}
}
void ShowMsg(string msg)
{
txtmsg.AppendText(msg + "\r\n");
}
void RecMsg(object sockect)
{
Socket consockect = (Socket)sockect;
while (true)
{
byte[] ArryRecMsg = new byte[1024 * 1024 * 2];
int msglength = consockect.Receive(ArryRecMsg);
string strRecMsg = System.Text.Encoding.UTF8.GetString(ArryRecMsg, 0, msglength);
ShowMsg("接收数据"+consockect.RemoteEndPoint+":"+strRecMsg);
}
}
private void btnSend_Click(object sender, EventArgs e)
{
string strmsg=txtSendMsg.Text.Trim();
byte[] arrmsg=System.Text.Encoding.UTF8.GetBytes(strmsg);
string selcetendpoint=lbOnline.SelectedItem.ToString();
dict[selcetendpoint].Send(arrmsg);
//socketConnection.Send(arrmsg);
ShowMsg("发送数据:" + strmsg);
}
客户端
Socket socketClient = null;
Thread threadRec = null;
private void btnConnect_Click(object sender, EventArgs e)
{
IPAddress address = IPAddress.Parse(txtIP.Text.Trim());//获取ip地址
IPEndPoint endpoint = new IPEndPoint(address, int.Parse(txtport.Text.Trim()));//获取网络节点
socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socketClient.Connect(endpoint);
threadRec = new Thread(ClientRecMsg);
threadRec.IsBackground = true;
threadRec.Start();
}
void ClientRecMsg()
{
while (true)
{
byte[] ArryRecMsg = new byte[1024 * 1024 * 2];
int msglength = socketClient.Receive(ArryRecMsg);
string strRecMsg = System.Text.Encoding.UTF8.GetString(ArryRecMsg, 0, msglength);
ShowMsg(strRecMsg);
}
}
void ShowMsg(string msg)
{
txtmsg.AppendText(msg + "\r\n");
}
private void btnSend_Click(object sender, EventArgs e)
{
}
private void btnSend_Click_1(object sender, EventArgs e)
{
string strmsg = txtSendMsg.Text.Trim();
byte[] arrmsg = System.Text.Encoding.UTF8.GetBytes(strmsg);
socketClient.Send(arrmsg);
ShowMsg("发出数据:" + strmsg);
}
上面的代码还有很多不完善的地方,异常处理没有做,还有很多地方需要改进。但是对socket的应用学习