使用c#进行win窗体制作,实现一个sever,可以进行接受消息,发送消息。界面如下图所示:
通过点击startWatching开始监听,首先使用代码创建一个Socket监听对象,给定ip地址和端口号,绑定端口号,指定最大连接数,开始监听,代码如下:
//创建一个监听对象
socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
//创建ip地址
IPAddress ip = IPAddress.Parse(textBox1.Text);
//创建端口号
IPEndPoint endPoint = new IPEndPoint(ip, int.Parse(textBox2.Text));
//绑定端口号
socketWatch.Bind(endPoint);
showMsg("开始监听\r\n");
//最大连接数
socketWatch.Listen(10);
socketWatch.BeginAccept(GotClientCallback, socketWatch);
注意,这里使用的是异步方法监听,有client连接之后就会跳转到指定的回调函数 GotClientCallback(),在回调函数里需要调用异步方法开始接受消息,并且在接收消息代码之后要再一次开始监听,这样才能实现多个Client连接到服务器。参考代码如下:
socketwork.m_socket.BeginReceive(socketwork.recBuffer, 0, ConnectClients.buffersize,
SocketFlags.None,ReceMsg, socketwork);
socketWatch.BeginAccept(GotClientCallback, socketWatch);
对接受的消息进行处理,在ReceMsg()回调函数里,回调函数最后需要再一次调用BeginReceive函数,才能接收到后续信息。
private void ReceMsg(IAsyncResult async)
{
try
{
ConnectClients ws = (ConnectClients)async.AsyncState;
int r = ws.m_socket.EndReceive(async);
string ip = comboBox1.SelectedItem.ToString();//获取ip地址
if (r <= 0)
{
ws.m_socket.Close();
showMsg(ws.m_socket.RemoteEndPoint.ToString() + ":断开连接\r\n");
}
else
{
showMsg(ws.m_socket.RemoteEndPoint.ToString() + ":" +
Encoding.UTF8.GetString(ws.recBuffer, 0, r) + "\r\n");
}
}
catch
{
}
}
对多个client进行管理,可以使用 工具箱中可以下拉的列表控件存储多个client的IP地址和端口号,代码里使用字典实现。参考代码如下:
//创建一个字典,使ip地址和socket对应,可以通过ip地址找到要通信的client
DicClient.Add(s.RemoteEndPoint.ToString(), s);
//将新连接的client的IP地址放到选择框中
comboBox1.Items.Add(s.RemoteEndPoint.ToString());
comboBox1.Text = s.RemoteEndPoint.ToString();
sever点击send控。件实现发送消息功能,具体实现为拿到创建的socket,调用socket.send()函数。
try
{
byte[] sendMsg = new byte[2];
sendMsg[0] = 01;
sendMsg[1] = 02;
DicClient[comboBox1.Text].Send(sendMsg);
}
catch
{
}
sever创建完毕之后,可以使用telnet 或者 网络调试助手 调试是否收发正常。
欢迎大佬批评指正。
reference: