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 NetWorkHelper.IModels; using NetWorkHelper.TCP; namespace Socket.Server { public partial class FrmServer : Form { /// /// 服务端通讯组件 /// ITcpServer _server { get; set; } /// /// 客户端列表 /// List _clientSocketList { get; set; } public FrmServer() { InitializeComponent(); } /// /// 窗体加载事件 /// private void FrmServer_Load(object sender, EventArgs e) { _server = new ITcpServer(); _server.OnErrorMsg += _server_OnErrorMsg; _server.OnGetLog += _server_OnGetLog; _server.OnOfflineClient += _server_OnOfflineClient; _server.OnOnlineClient += _server_OnOnlineClient; _server.OnRecevice += _server_OnRecevice; _server.OnReturnClientCount += _server_OnReturnClientCount; _server.OnSendDateSuccess += _server_OnSendDateSuccess; _server.OnStateInfo += _server_OnStateInfo; _clientSocketList = new List(); } /// /// 监听状态改变时返回监听状态事件 /// private void _server_OnStateInfo(object sender, NetWorkHelper.ICommond.TcpServerStateEventArgs e) { txtMessage.AppendText(e.Msg + Environment.NewLine); } /// /// 发送消息成功时返回成功消息事件 /// private void _server_OnSendDateSuccess(object sender, NetWorkHelper.ICommond.TcpServerSendReturnEventArgs e) { } /// /// 用户上线下线时更新客户端在线数量事件 /// private void _server_OnReturnClientCount(object sender, NetWorkHelper.ICommond.TcpServerReturnClientCountEventArgs e) { lblClientCount.Text = e.ClientCount.ToString(); } /// /// 接收数据事件 /// private void _server_OnRecevice(object sender, NetWorkHelper.ICommond.TcpServerReceviceaEventArgs e) { string receviceData = Encoding.Default.GetString(e.Data); txtReceviceData.AppendText(receviceData + Environment.NewLine); } /// /// 新客户端上线时返回客户端事件 /// private void _server_OnOnlineClient(object sender, NetWorkHelper.ICommond.TcpServerClientEventArgs e) { ChangeClientList(e.IClient, true); } /// /// 改变客户端列表 /// /// void ChangeClientList(IClient client, bool isAdd) { //新增 if (isAdd) { //是否存在于队列中 bool state = _clientSocketList.Exists(p => p.Ip == client.Ip); if (!state) { _clientSocketList.Add(client); DataGridViewRow dr = new DataGridViewRow(); dr.CreateCells(dgvClientView); //设置列的值 dr.Cells[0].Value = dgvClientView.Rows.Count; dr.Cells[1].Value = client.Ip; dr.Cells[2].Value = client.Port; dr.Cells[3].Value = client.ClientInfo.SitState.ToString(); dr.Tag = client.Ip; dgvClientView.Rows.Add(dr); } } else { var removeList = new List(); foreach (DataGridViewRow row in dgvClientView.Rows) { var rowClient = (string)row.Tag; if (rowClient == client.Ip) { removeList.Add(row); _clientSocketList.RemoveAll(p => p.Ip == rowClient); } } //删除列表,避免删除导致的索引错误,另起删除循环 foreach (var row in removeList) { dgvClientView.Rows.Remove(row); } } } /// /// 客户端下线时返回客户端事件 /// private void _server_OnOfflineClient(object sender, NetWorkHelper.ICommond.TcpServerClientEventArgs e) { ChangeClientList(e.IClient, false); } /// /// 服务端读写操作时返回日志消息 /// private void _server_OnGetLog(object sender, NetWorkHelper.ICommond.TcpServerLogEventArgs e) { txtMessage.AppendText(e.LogMsg + Environment.NewLine); } /// /// 错误消息 /// private void _server_OnErrorMsg(object sender, NetWorkHelper.ICommond.TcpServerErrorEventArgs e) { txtMessage.AppendText(e.ErrorMsg + Environment.NewLine); } /// /// 是否开启心跳检测 /// private void chBoxIsHeartCheck_CheckedChanged(object sender, EventArgs e) { _server.IsHeartCheck = chBoxIsHeartCheck.Checked; } /// /// 开启监听 /// private void btnListeningStart_Click(object sender, EventArgs e) { if (!_server.IsStartListening) { if (string.IsNullOrEmpty(txtServerIp.Text) || string.IsNullOrEmpty(txtServerPort.Text) || string.IsNullOrEmpty(txtInterval.Text)) { MessageBox.Show("参数不能为空!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } _server.CheckTime = int.Parse(txtInterval.Text.Trim()); _server.ServerIp = txtServerIp.Text.Trim(); _server.ServerPort = int.Parse(txtServerPort.Text.Trim()); _server.Start(); btnListeningStart.Enabled = false; btnListeningStop.Enabled = true; } } /// /// 停止监听 /// private void btnListeningStop_Click(object sender, EventArgs e) { if (_server.IsStartListening) { _server.Stop(); btnListeningStart.Enabled = true; btnListeningStop.Enabled = false; } } /// /// 发送数据按钮 /// private void btnSendData_Click(object sender, EventArgs e) { if (!string.IsNullOrEmpty(txtSendData.Text.Trim())) { byte[] sendData = Encoding.Default.GetBytes(txtSendData.Text.Trim()); var selectedList = dgvClientView.SelectedRows; if (selectedList.Count == 0) { MessageBox.Show("请选择要发送的客户端!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } foreach (DataGridViewRow row in selectedList) { var rowIp = (string)row.Tag; var rowClient = _clientSocketList.Find(p => p.Ip == rowIp); //发送数据 _server.SendData(rowClient, sendData); } txtSendData.Text = string.Empty; } } } }