Socket

 

  Server

using System;
using System.Collections.Generic; 
using System.Linq;
using System.Text; 
using System.Windows.Forms; 
using System.Net.Sockets;
using System.Net;
using System.Threading;

namespace DotnetSocketServer
{


    /// <summary>
    /// 基于.netcore的SocketServer
    /// </summary>
    public partial class DotnetSocketServer : Form
    {
        public DotnetSocketServer()
        {
            InitializeComponent();
        }

        //存储已连接的客户端的泛型集合
        private static Dictionary<string, Socket> socketList = new Dictionary<string, Socket>();

        /// <summary>
        /// 接收连接
        /// </summary>
        /// <param name="obj"></param>
        public void StartServer(object obj)
        {
            string str;
            while (true)
            {
                //等待接收客户端连接 Accept方法返回一个用于和该客户端通信的Socket
                Socket recviceSocket = ((Socket)obj).Accept();
                //获取客户端ip和端口号
                str = recviceSocket.RemoteEndPoint.ToString();
                socketList.Add(str, recviceSocket);
                //控件调用invoke方法 解决"从不是创建控件的线程访问它"的异常
                cmb_socketlist.Invoke(new Action(() => { cmb_socketlist.Items.Add(str); }));  
                SetMessage(str + "已连接");
                //Accept()执行过后 当前线程会阻塞 只有在有客户端连接时才会继续执行
                //创建新线程,监控接收新客户端的请求数据
                Thread thread = new Thread(startRecive);
                thread.IsBackground = true;
                thread.Start(recviceSocket);
            }
        }

        /// <summary>
        /// 接收消息
        /// </summary>
        /// <param name="obj">客户端socket</param>
        public void startRecive(object obj)
        {
            string str;
            string ip;
            while (true)
            {

                byte[] buffer = new byte[2048];
                int count;
                try
                {
                    //Receive(Byte[]) 从绑定的 Socket 套接字接收数据,将数据存入接收缓冲区。
                    //该方法执行过后同Accept()方法一样  当前线程会阻塞 等到客户端下一次发来数据时继续执行
                    count = ((Socket)obj).Receive(buffer);
                    ip = ((Socket)obj).RemoteEndPoint.ToString();
                    if (count == 0)
                    {
                        cmb_socketlist.Invoke(new Action(() => { cmb_socketlist.Items.Remove(ip); })); 
                        SetMessage(ip + "已断开连接");
                        break;
                    }
                    else
                    {
                        str = Encoding.Default.GetString(buffer, 0, count); 
                        SetMessage("收到" + ip + "数据  " + str);

                    }
                }
                catch (Exception)
                {


                }
            }
        }

        /// <summary>
        /// 开启服务器监听
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_StartListen_Click(object sender, EventArgs e)
        {
            //实例化一个Socket对象,确定网络类型、Socket类型、协议类型
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            IPEndPoint IEP = new IPEndPoint(IPAddress.Parse(txt_ip.Text), int.Parse(txt_port.Text));
            //绑定ip和端口
            socket.Bind(IEP);
            //开启监听
            socket.Listen(10);
             
            SetMessage("开始监听");
            Thread thread = new Thread(new ParameterizedThreadStart(StartServer));
            thread.IsBackground = true;
            thread.Start(socket); 
        }

        /// <summary>
        /// 向对应客户端发送数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_send_Click(object sender, EventArgs e)
        {
            string str = txt_send.Text;
            byte[] bytes = new byte[2048];
            bytes = Encoding.Default.GetBytes(str);
            //获取combobox的值 从泛型集合中获取对应的客户端socket 然后发送数据
            if (cmb_socketlist.Items.Count != 0)
            {
                if (cmb_socketlist.SelectedItem == null)
                {
                    MessageBox.Show("请选择一个客户端发送数据!");
                    return;
                }
                else
                {
                    socketList[cmb_socketlist.SelectedItem.ToString()].Send(bytes);
                    SetMessage("发送到客户端"+ cmb_socketlist.SelectedItem.ToString() + "数据: "+ str);
                }
            }
            else
            { 
                SetMessage("当前无连接的客户端");
            }
            txt_send.Clear();
        }

        private void DotnetSocketServer_FormClosed(object sender, FormClosedEventArgs e)
        {
            System.Environment.Exit(0);
        }



        /// <summary>
        /// 添加信息
        /// </summary>
        /// <param name="msg"></param>
        private void SetMessage(string msg)
        {
            richTextBox1.Invoke(new Action(() => { richTextBox1.AppendText(msg + "\r\n"); }));
        }
    }

}
 

  

Client

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace test1
{
    /// <summary>
    /// 基于.netframework的SocketClient
    /// </summary>
    public partial class DotnetFrameworkSocketClient : Form
    {

        public DotnetFrameworkSocketClient()
        {
            InitializeComponent();
        }
        byte[] buffer = new byte[2048];
        Socket socket;
        Thread thread;

        /// <summary>
        /// 连接服务器
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_start_Click(object sender, EventArgs e)
        {
            try
            {
                //实例化socket
                socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                //连接服务器
                socket.Connect(new IPEndPoint(IPAddress.Parse(txt_ip.Text), int.Parse(txt_port.Text)));

                thread = new Thread(StartReceive);
                thread.IsBackground = true;
                thread.Start(socket);
                SetMessage("打开与远程服务器的连接!");
            }
            catch (Exception ex)
            {
                SetMessage("服务器异常:" + ex.Message);
            }

        }
        /// <summary>
        /// 开启接收
        /// </summary>
        /// <param name="obj"></param>
        private void StartReceive(object obj)
        {
            string str;
            while (true)
            {
                Socket receiveSocket = obj as Socket;
                try
                {


                    if (receiveSocket.Connected == false) continue;
                    int result = receiveSocket.Receive(buffer);

                    if (result == 0)
                    {
                        break;
                    }
                    else
                    {
                        str = Encoding.Default.GetString(buffer, 0, result);
                        SetMessage("接收到服务器数据: " + str);
                    }

                }
                catch (Exception ex)
                {
                    SetMessage("服务器异常:" + ex.Message);

                }
            }

        }
        /// <summary>
        /// 关闭连接
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_close_Click(object sender, EventArgs e)
        {
            try
            {
                socket.Shutdown(SocketShutdown.Both);
                socket.Close();
                thread.Abort();
                thread = null;
                SetMessage("关闭与远程服务器的连接!");
            }
            catch (Exception ex)
            {
                SetMessage("异常" + ex.Message);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {


            socket.Send(Encoding.Default.GetBytes(txt_send.Text));
            SetMessage("发送到服务器数据: " + txt_send.Text);
            txt_send.Clear();
        }
        /// <summary>
        /// 添加信息
        /// </summary>
        /// <param name="msg"></param>
        private void SetMessage(string msg)
        {

            richTextBox1.Invoke(new Action(() => { richTextBox1.AppendText(msg + "\r\n"); }));
        }
    }
}

  

 

posted @ 2022-01-25 11:16  人生为卒  阅读(32)  评论(0编辑  收藏  举报