搜文章
推荐 原创 视频 Java开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发
Lambda在线 > 工业家园 > Socket的使用

Socket的使用

工业家园 2020-08-02

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using System.Net;using System.Net.Sockets;
namespace SocketTcpipDemo{ public partial class FrmServer : Form {
#region 程序初始化 public FrmServer() { InitializeComponent(); } #endregion
#region 开发步骤 /* * 服务器端程序的编写步骤 * 第一步:调用 socket() 函数创建一个用于通信的套接字 * 第二步:给已经创建的套接字绑定一个端口号,这一般通过设置网络套接口地址和调用bind()函数来实现 * 第三步:调用listen()函数使套接字成为一个监听套接字 * 第四部:调用accept()函数来接受客服端的连接,这时就可以和客服端通信了 * 第五步:处理客服端的连接请求 * 第六步:终止连接 */ #endregion
#region 变量定义区 /// <summary> /// 定义一个Socket /// </summary> private Socket listenSocket;
//字典集合:存储IP和Socket的集合 private Dictionary<string, Socket> OnLineList = new Dictionary<string, Socket>();
//当前时间 private string CurrentTime { get { return DateTime.Now.ToString("HH:mm:ss") + Environment.NewLine; } }
//编码格式 Encoding encoding = Encoding.Default; #endregion
#region 启动服务 private void btn_StartService_Click(object sender, EventArgs e) { //实例化Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //组合IP地址和端口号 IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(txt_IP.Text.Trim()), int.Parse(txt_Port.Text.Trim())); try { //绑定端口号 listenSocket.Bind(endPoint); } catch (Exception ex) {
MessageBox.Show("服务器开启失败:" + ex.Message, "开启服务器"); return; }
//监听Socket 最大连接数量为10个客服端 listenSocket.Listen(10);
ShowMessage("服务器开启成功");
//开启一个线程监听 Task.Run(new Action(() => { ListenConnection(); })); btn_StartService.Enabled = false; } #endregion
#region 监听 private void ListenConnection() { while (true) { //Accept()是一个阻塞的方法,正常情况下不触发,只有连接到新的连接时才会触发 Socket clientSocket = listenSocket.Accept();//创建一个新的socket的连接 string ip = clientSocket.RemoteEndPoint.ToString(); AddOnLine(ip, true);//更新在线列表 OnLineList.Add(ip, clientSocket);//更新在线集合 ShowMessage(ip + "上线了"); Task.Run(() => ReceiveMsg(clientSocket)); } } #endregion
#region 接收方法 private void ReceiveMsg(Socket clientSocket) { while (true) { //Receive()是阻塞的一个方法,正常情况下不触发,只有接收的消息时才会触发 //定义一个2M的缓冲区容量 byte[] buffer = new byte[1024 * 1024 * 2]; int length = -1;
try { length = clientSocket.Receive(buffer); } catch (Exception) { //客服端下线 //更新在线列表 string ip = clientSocket.RemoteEndPoint.ToString(); AddOnLine(ip, false); OnLineList.Remove(ip); break; }
if (length == 0) { //客服端下线 //更新在线列表 string ip = clientSocket.RemoteEndPoint.ToString(); AddOnLine(ip, false); OnLineList.Remove(ip); break; }
if (length > 0) { string info = encoding.GetString(buffer, 0, length); ShowMessage(info); } } } #endregion
#region 接收信息 /// <summary> /// 更新接收区 /// </summary> /// <param name="info"></param> private void ShowMessage(string info) { Invoke(new Action(() => { txt_Rcv.AppendText(CurrentTime + info + Environment.NewLine); })); } #endregion
#region 更新在线列表 /// <summary> /// 更新在线列表 /// </summary> /// <param name="clientip"></param> /// <param name="value"></param> private void AddOnLine(string clientip, bool value) { Invoke(new Action(() => { if (value) { lst_Online.Items.Add(clientip); } else { lst_Online.Items.Remove(clientip); } }));
}
#endregion
#region 发送消息 private void btn_Send_Click(object sender, EventArgs e) { if (lst_Online.SelectedItem != null) { foreach (string item in lst_Online.SelectedItems) { if (OnLineList.ContainsKey(item)) { OnLineList[item].Send(encoding.GetBytes(txt_Send.Text.Trim())); } }
} else { MessageBox.Show("请先选择要发送的对象", "发送消息"); } } #endregion
#region 群发 private void btn_SendAll_Click(object sender, EventArgs e) { foreach (string item in lst_Online.Items) { if (OnLineList.ContainsKey(item)) { OnLineList[item].Send(encoding.GetBytes(txt_Send.Text.Trim())); } } } #endregion }}


版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《Socket的使用》的版权归原作者「工业家园」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注工业家园微信公众号

工业家园微信公众号:gh_759486860eea

工业家园

手机扫描上方二维码即可关注工业家园微信公众号

工业家园最新文章

精品公众号随机推荐