赞
踩
- 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 TCPProgect
- {
- public partial class FrmServer : Form
- {
- public FrmServer()
- {
- InitializeComponent();
- }
-
-
- //第一步:调用socket()函数创建一个用于通信的套接字
- 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 econding = Encoding.Default;
-
-
- private void btn_StartService_Click(object sender, EventArgs e)
- {
- //第一步:调用socket()函数创建一个用于通信的套接字
- listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
-
- //第二步:给已经创建的套接字绑定一个端口号,这一般通过设置网络套接口地址和调用Bind()函数来实现
- IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(this.txt_IP.Text.Trim()), int.Parse(this.txt_Port.Text.Trim()));
-
- try
- {
- listenSocket.Bind(endPoint);
- }
- catch (Exception ex)
- {
- MessageBox.Show("服务器开启失败:" + ex.Message, "开启服务器");
- return;
- }
-
- //第三步:调用listen()函数使套接字成为一个监听套接字
- listenSocket.Listen(10);
-
- ShowMessage("服务器开启成功");
-
- //开启一个线程监听
- Task.Run(new Action(() =>
- {
- ListenConnection();
- }
- ));
-
- this.btn_StartService.Enabled = false;
-
-
- }
-
- private void ListenConnection()
- {
- while (true)
- {
- Socket clientSocket = listenSocket.Accept();
-
- string ip = clientSocket.RemoteEndPoint.ToString();
-
- //更新在线列表
- AddOnLine(ip, true);
- //更新在线列表集合
- OnLineList.Add(ip, clientSocket);
-
- ShowMessage(ip + "上线了");
-
- Task.Run(() => ReceiveMsg(clientSocket));
-
- }
-
-
- }
-
-
- /// <summary>
- /// 接收方法
- /// </summary>
- /// <param name="clientSocket"></param>
- private void ReceiveMsg(Socket clientSocket)
- {
- while (true)
- {
- //定义一个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 = econding.GetString(buffer, 0, length);
- ShowMessage(info);
- }
- }
- }
-
- /// <summary>
- /// 在线列表更新
- /// </summary>
- /// <param name="clientIp"></param>
- /// <param name="value"></param>
- private void AddOnLine(string clientIp, bool value)
- {
- Invoke(new Action(() =>
- {
- if (value)
- {
- this.lst_Online.Items.Add(clientIp);
- }
- else
- {
- this.lst_Online.Items.Remove(clientIp);
- }
-
- }));
-
- }
-
-
- /// <summary>
- /// 更新接收区
- /// </summary>
- /// <param name="info"></param>
- private void ShowMessage(string info)
- {
- Invoke(new Action(() =>
- {
- this.txt_Rcv.AppendText(CurrentTime + info + Environment.NewLine);
- }));
-
- }
-
- /// <summary>
- /// 消息发送
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void btn_Send_Click(object sender, EventArgs e)
- {
- if (this.lst_Online.SelectedItem != null)
- {
- foreach (string item in this.lst_Online.SelectedItems)
- {
- if (OnLineList.ContainsKey(item))
- {
- OnLineList[item].Send(econding.GetBytes(this.txt_Send.Text.Trim()));
- }
- }
- }
- else
- {
- MessageBox.Show("请先选择要发送的对象", "发送消息");
- }
-
- }
-
- /// <summary>
- /// 群发功能
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void btn_SendAll_Click(object sender, EventArgs e)
- {
- foreach (string item in this.lst_Online.Items)
- {
- if (OnLineList.ContainsKey(item))
- {
- OnLineList[item].Send(econding.GetBytes(this.txt_Send.Text.Trim()));
- }
- }
- }
- }
- }
7.1 运行界面演示
7.2 接收消息界面演示
7.3 发送消息界面演示
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。