版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CV2017/article/details/83420328
accept() 函数会返回一个新的套接字,这个新的套接字在服务器端与客户端进行通信。
服务器端的绑定监听是一个套接字,与客户端通信的是另一个套接字(accept函数返回的套接字,注意这里不是返回客户端的套接字,返回的套接字是新建立在服务器上的,与客户端收发消息用的)
下面这段代码,是我在写公司业务代码时用到的,可以看一些关键点去理解我说的,比如服务器的绑定监听套接字是 socketWatch,与客户端收发消息的套接字是 sokClient
Thread threadWatch = null; // 负责监听客户端连接请求的 线程;
Socket socketWatch = null;
Socket sokConnection = null;
Dictionary<string, Socket> dict = new Dictionary<string, Socket>();
Dictionary<string, Thread> dictThread = new Dictionary<string, Thread>();
private void button1_Click(object sender, EventArgs e)
{
socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress address = IPAddress.Parse(textIP.Text.Trim());
IPEndPoint endPoint = new IPEndPoint(address, int.Parse(textPort.Text.Trim()));
try
{
// 将负责监听的套接字绑定到唯一的ip和端口上;
socketWatch.Bind(endPoint);
}
catch (SocketException se)
{
MessageBox.Show("异常:" + se.Message);
return;
}
// 设置监听队列的长度;
socketWatch.Listen(10);
// 创建负责监听的线程;
threadWatch = new Thread(WatchConnecting);
threadWatch.IsBackground = true;
threadWatch.Start();
ShowMsg("服务器启动监听成功!");
//}
}
void ShowMsg(string str)
{
textMsg.AppendText(str + "\r\n");
}
//监听客户端
void WatchConnecting()
{
while (true)
{
sokConnection = socketWatch.Accept(); // 一旦监听到一个客户端的请求,就返回一个与该客户端通信的 套接字;
// 想列表控件中添加客户端的IP信息;
lbOnline.Items.Add(sokConnection.RemoteEndPoint.ToString());
// 将与客户端连接的 套接字 对象添加到集合中;
dict.Add(sokConnection.RemoteEndPoint.ToString(), sokConnection);
ShowMsg("客户端连接成功!"); //有一个 bug
Thread thr = new Thread(RecMsg);
thr.IsBackground = true;
thr.Start(sokConnection);
dictThread.Add(sokConnection.RemoteEndPoint.ToString(), thr); // 将新建的线程 添加 到线程的集合中去。
}
}
//接收消息
void RecMsg(object sokConnectionparn)
{
Socket sokClient = sokConnectionparn as Socket;
while (true)
{
byte[] arrMsgRec = new byte[1024 * 1024];
// 将接受到的数据存入到输入 arrMsgRec中;
try
{
int iLength = sokClient.Receive(arrMsgRec);
string sStrReceMsg = Encoding.UTF8.GetString(arrMsgRec, 1, iLength);
string specialString = "DiChuang_te\0";
string[] sArr = sStrReceMsg.Split(';');
string sSqlPath = "D://LoginDB.db";
TeSQLite teSQL = new TeSQLite();
teSQL.teConnDB(sSqlPath);
if (teSQL.teCompareD(sArr[0], sArr[1]) && sArr[2] == specialString)
{
string returnStr = "A";
byte[] byteArray = System.Text.Encoding.Default.GetBytes(returnStr);
sokClient.Send(byteArray);
}
else
{
string returnStr = "B";
byte[] byteArray = System.Text.Encoding.Default.GetBytes(returnStr);
sokClient.Send(byteArray);
}
}