服务器端//启动服务
 private void btnStar_Click(object sender, EventArgs e)
        {
            try
            {
                IPAddress serIpAdd = IPAddress.Parse(this.txtIpAdd.Text);//IP地址
                int serPort = Int32.Parse(this.txtPort.Text);//端口
                serEndPoint = new IPEndPoint(serIpAdd, serPort);
                serviceSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                serviceSocket.Bind(serEndPoint);
                serviceSocket.Listen(10);//设置监听频率
                myThead = new Thread(new ThreadStart(newBeginListen));
                myThead.Start();
                timeDate.Start();
                this.txtLogMsg.Invoke(new SetLogMsgCallback(SetLogMsg), " 启动成功!");
            }
            catch (Exception)
            {
                throw;
            }
        }private void newBeginListen()
        {
            while (true)
            {
                Thread.Sleep(300);
                Socket newSocket = serviceSocket.Accept();//为新的连接创建Socket
                IPAddress clientIp = ((System.Net.IPEndPoint)newSocket.RemoteEndPoint).Address;//获取远程连接IP 
                int clientProt = ((System.Net.IPEndPoint)newSocket.RemoteEndPoint).Port;//端口
                while (true)
                {
                    Thread.Sleep(300);
                    if (byteSend != null)
                    {
                        try
                        {
                            newSocket.Send(System.Text.Encoding.Default.GetBytes(DateTime.Now.ToString()));
                            txtLogMsg.Invoke(new SetLogMsgCallback(SetLogMsg), " 发送数据:" + DateTime.Now.ToString() + " 客户端IP:" + clientIp + "  端口:" + clientProt);
                        }
                        catch (Exception)
                        {
                            txtLogMsg.Invoke(new SetLogMsgCallback(SetLogMsg), " 发送失败!");
                        }
                    }                    try
                    {
                        byte[] message = new byte[1024];
                        string msg = "";                        int bytes = newSocket.Receive(message);//接收数据 返回整个包长度
                        msg = Encoding.Default.GetString(message, 0, bytes);                        msg += "ClientIp:" + clientIp + ",ClientProt:" + clientProt;                        lock (thisLock)
                        {
                            byteGet = message;
                        }
                        txtLogMsg.Invoke(new SetLogMsgCallback(SetLogMsg), " 收到数据:" + msg + " 客户端IP:" + clientIp + "  端口:" + clientProt);
                    }
                    catch (Exception e)
                    {
                        txtLogMsg.Invoke(new SetLogMsgCallback(SetLogMsg), " 接受失败!" + e);
                    }
                }
            }
        }

解决方案 »

  1.   

    客户端 private void FromMonBeClient_Load(object sender, EventArgs e)
            {
                try
                {
                    if (LoadConFile())
                    {
                        IPAddress serIpAdd = IPAddress.Parse(this.txtIpAdd.Text);//IP地址
                        int serPort = Int32.Parse(this.txtPort.Text);//端口
                        serEndPoint = new IPEndPoint(serIpAdd, serPort);
                        clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                        clientSocket.Connect(serEndPoint);//连接服务器终端 打开连接 没有Close长连接
                        lock (thisLock)
                        {
                            string send = string.Format("~Mon~|1|0|");//0表示包 没内容
                            byteSend = Encoding.Default.GetBytes("send");
                        }
                        thread = new Thread(new ThreadStart(newBeginListen));//首次连接
                        thread.Start();
                        timer1.Start();
                        SetLogMsg(" 启动成功!");
                    }
                }
                catch (Exception ex)
                {
                    SetLogMsg(" 启动失败!" + ex);
                }
            }public void newBeginListen()
            {
                while (true)
                {
                    Thread.Sleep(3000);
                    if (byteSend != null)
                    {
                        try
                        {
                            clientSocket.Send(byteSend);                        txtLogMsg.Invoke(new SetLogMsgCallback(SetLogMsg), " 发送数据:" + Encoding.Default.GetString(byteSend, 0, byteSend.Length));                        lock (thisLock)
                            {
                                byteSend = null;
                            }
                        }
                        catch (Exception e)
                        {
                            txtLogMsg.Invoke(new SetLogMsgCallback(SetLogMsg), " 发送失败!" + e);
                        }
                    }                try
                    {
                        byte[] message = new byte[1024];
                        string msg = "";
                        int bytes = clientSocket.Receive(message);//接收数据
                        msg = Encoding.Default.GetString(message, 0, bytes);
                        byteGet = message;
                        txtLogMsg.Invoke(new SetLogMsgCallback(SetLogMsg), " 收到数据:" + msg);
                    }
                    catch (Exception e)
                    {
                        txtLogMsg.Invoke(new SetLogMsgCallback(SetLogMsg), " 接受失败!" + e);
                    }
                }
            }
      

  2.   

    我也不太懂.SOCKET,好像用的是阻塞式/非阻塞式 怎么设置的? 我好像用的阻塞式.服务器端有新的连接时,我在就开启一个线程...服务端和客户端,在线程里面能通讯.有TIME控件.定义了临界区.线程里面的SOCKET通过WHILE循环SEND和Receive,但是我想主动发送消息给客户端,怎么做.请教各位!!!