socket服务端

该代码示例展示了如何在WinForm应用中创建一个TCP服务器,监听客户端连接,接收和发送数据。服务器使用Socket类建立监听,创建线程来处理新连接,并存储已连接的客户端。客户端可以连接到指定IP和端口,并能接收到服务器的响应。

一个项目需要在winform下开发socket通讯

根据网上的代码修改 如下

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

namespace LaserMiddleware.TCP
{
    public class TCPServer
    {

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

        Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        public static TCPServer Instance;

        public static TCPServer GetInstance()
        {
            if (Instance == null)
            {
                Instance = new TCPServer();
            }
            return Instance;
        }

        /// <summary>
        /// 创建Scoket 服务端
        /// </summary>
        /// <param name="IP"></param>
        /// <param name="prot"></param>
        /// <returns></returns>
        public Socket CreateSocket(string IP, string prot)
        {
            //定义一个套接字用于监听客户端发来的信息  包含3个参数(IP4寻址协议,流式连接,TCP协议)
            Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //发送信息 需要1个IP地址和端口号
            IPAddress ipaddress = IPAddress.Parse(IP); //获取文本框输入的IP地址
                                                       //将IP地址和端口号绑定到网络节点endpoint上 
            IPEndPoint endpoint = new IPEndPoint(ipaddress, int.Parse(prot)); //获取文本框上输入的端口号
                                                                              //套接字点听绑定网络端点
            socketWatch.Bind(endpoint);
            //将套接字的监听队列长度设置为20
            socketWatch.Listen(20);
            return socketWatch;
        }

        /// <summary>
        /// 创建一个负责监听客户端的线程  并启动
        /// </summary>
        /// <returns></returns>
        public void CreateThread(Socket socket)
        {
            //创建一个负责监听客户端的线程 
            Thread threadWatch = new Thread(new ParameterizedThreadStart(WatchConnecting));
            //将窗体线程设置为与后台同步
            threadWatch.IsBackground = true;
            //启动线程
            threadWatch.Start(socket);
        }


        /// <summary>
        /// 持续不断监听客户端发来的请求, 用于不断获取客户端发送过来的连续数据信息
        /// </summary>
        private void WatchConnecting(object socket)
        {
            Socket socketWatch = socket as Socket;
            while (true)
            {
                Socket socConnection = null;
                try
                {
                    socConnection = socketWatch.Accept();
                    //((IPEndPoint)socConnection.RemoteEndPoint).Address.ToString();//获取客户端IP
                    //((IPEndPoint)socConnection.RemoteEndPoint).Port.ToString();//获取客户端端口

                }
                catch (Exception ex)
                {
                    break;//提示套接字监听异常  ex.Message   
                }
                //创建通信线程 
                ParameterizedThreadStart pts = new ParameterizedThreadStart(ServerRecMsg);
                Thread thr = new Thread(pts);
                thr.IsBackground = true;
                //启动线程 
                thr.Start(socConnection);

                string strIP = ((IPEndPoint)socConnection.RemoteEndPoint).Address.ToString();
                string strPort = ((IPEndPoint)socConnection.RemoteEndPoint).Port.ToString();
                socketList.Add(strIP + ":" + strPort, socConnection);
            }
        }


        /// <summary>
        /// 接收客户端发来的信息
        /// </summary>
        private void ServerRecMsg(object socketClientPara)
        {
            Socket socketServer = socketClientPara as Socket;
            int ReceiveBufferSize = 8 * 1024;
            while (true)
            {
                int firstReceived = 0;
                byte[] buffer = new byte[ReceiveBufferSize];
                try
                {
                    List<byte> ls = new List<byte>();
                    //获取接收的数据,并存入内存缓冲区  返回一个字节数组的长度
                    if (socketServer != null) firstReceived = socketServer.Receive(buffer);

                    if (firstReceived > 0) //接受到的长度大于0 说明有信息或文件传来
                    {
                        ls.AddRange(buffer.Skip(0).Take(firstReceived));

                        //对接收数据进行逻辑判断 回复客户端需要的数据
                        string port = ((IPEndPoint)socketServer.RemoteEndPoint).Port.ToString();

                        string msg = port + "recv OK:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\r\n";
                        byte[] datas = System.Text.Encoding.UTF8.GetBytes(msg);
                        socketServer.Send(datas);//小数据可以一次性发送  如果大数据要分端发送 用while 循环
                    }
                }
                catch (Exception ex)
                {
                    break;  //捕获异常信息 ex.Message
                }
            }
        }


        public void start()
        {
            Socket testSocket = CreateSocket("192.168.20.30", "8999");
            CreateThread(testSocket);

        }

        public void Send(string cmd)
        {

            foreach (var socket in socketList)
            {
                try
                {
                    byte[] bytes = new byte[2048];
                    bytes = Encoding.Default.GetBytes(cmd);
                    socket.Value.Send(bytes);
                }
                catch { }

            }
        }
    }
}

在窗体代码中加入启动Server

TCPServer.GetInstance().start();

窗体代码中给所有客户端发送数据的方法

 TCPServer.GetInstance().Send("Test");

下面是客户端连接测试效果 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值