Socket协议通讯

Socket协议通讯

 

服务器端代码:

复制代码
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.Windows.Forms;

namespace Server
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public List<Socket> serverSockeList = new List<Socket>();
        Socket serverSocke = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        bool kg=true;
        string recStr = "";
        byte[] recByte = new byte[1000];
        int bytes = 0;
        delegate void invokeInfo(string obj);
        private void But_Starlisten_Click(object sender, EventArgs e)
        {
            try
            {
                if (string.IsNullOrEmpty(txt_IP.Text) || string.IsNullOrEmpty(txt_port.Text))
                    return;
                IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(txt_IP.Text), int.Parse(txt_port.Text));
                serverSocke.Bind(ipe);
                serverSocke.Listen(10000);
                txt_MessageLog.Text += "监听已经打开,请等待\r\n";

                Thread conn = new Thread(new ParameterizedThreadStart(GetALLClientConn));
                conn.IsBackground = true;
                conn.Start(serverSocke);
            }
            catch (Exception ex)
            {
                txt_MessageLog.Text += "服务异常\r\n";
            }
        }

        /// <summary>
        /// 关闭所有的Socket协议和线程
        /// </summary>
        public void Close()
        {
            try
            {
                kg = false;
                foreach (var item in serverSockeList)
                {
                    if (item.Connected)
                        item.Shutdown(SocketShutdown.Both);
                    if (item != null)
                        item.Close();
                }
                if (serverSocke.Connected)
                    serverSocke.Shutdown(SocketShutdown.Both);
                if (serverSocke != null)
                    serverSocke.Close();
            }
            catch {
                txt_MessageLog.Text += "服务器连接关闭\r\n";
            }
        }

        /// <summary>
        /// 获取所有客户端连接
        /// </summary>
        /// <param name="obj">客户端Socket对象</param>
        public void GetALLClientConn(object obj)
        {
            Socket serverSocke = obj as Socket;
            try
            {
                while (kg)
                {
                    Socket newSocket = serverSocke.Accept();
                    serverSockeList.Add(newSocket);
                    txt_MessageLog.Invoke(new invokeInfo(Output), newSocket.RemoteEndPoint + "连接已经建立");
                    Thread t = new Thread(new ParameterizedThreadStart(GetInfo));
                    t.IsBackground = true;
                    t.Start(newSocket);
                }
            }
            catch {
                txt_MessageLog.Invoke(new invokeInfo(Output), "服务器异常");
               
            }
        }

        
        /// <summary>
        /// 获取该Socket对象的信息
        /// </summary>
        /// <param name="newSocket">Socket对象</param>
        public void GetInfo(object obj)
        {
            Socket newSocket = obj as Socket;
            try
            {
                while (kg)
                {
                   
                    bytes = newSocket.Receive(recByte, recByte.Length, SocketFlags.None);

                    if (bytes <= 0)
                    {
                        txt_MessageLog.Invoke(new invokeInfo(Output), newSocket.RemoteEndPoint + "连接已断开");
                        serverSockeList.Remove(newSocket);
                        if (newSocket.Connected)
                            newSocket.Shutdown(SocketShutdown.Both);
                        newSocket.Disconnect(false);
                        newSocket.Close();
                        break;
                    }
                    recStr = Encoding.UTF8.GetString(recByte, 0, bytes);
                    txt_MessageLog.Invoke(new invokeInfo(Output), recStr);
                    byte[] sendBytes = Encoding.UTF8.GetBytes(recStr);
                    foreach (var item in serverSockeList)
                    {
                        if (item != newSocket)
                            item.Send(sendBytes);
                    }
                }
            }
            catch (Exception ex)
            {
                txt_MessageLog.Invoke(new invokeInfo(Output), newSocket.RemoteEndPoint + "的信息接收异常");
            }
        }

        public void Output(string info)
        {
            txt_MessageLog.Text += info + "\r\n";
        }

        //发送信息
        private void But_Send_Click(object sender, EventArgs e)
        {
            try
            {
                if (string.IsNullOrEmpty(txt_Send.Text))
                    return;
                string sendStr = txt_Send.Text;
                txt_Send.Text = "";
                txt_MessageLog.Text += "服务端信息:" + sendStr + "\r\n";
                byte[] sendBytes = Encoding.UTF8.GetBytes("服务端信息:" + sendStr);
                Socket error = null;
                foreach (var item in serverSockeList)
                {
                    if (item.Poll(-1,SelectMode.SelectWrite))
                        item.Send(sendBytes);
                    else
                        error = item;
                }
                if (error != null)
                    serverSockeList.Remove(error);
            }
            catch (Exception ex)
            {
                txt_MessageLog.Text += "服务端发送信息异常\r\n";
            }
        }

        private void But_endlisten_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            Close();
        }
    }
}
复制代码

 

服务器端界面:

 

 

------------------------------------------------------------------------------------------

 

 

客户端代码:

复制代码
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.Windows.Forms;
using System.Threading;

namespace Client
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public Socket clientSocket;
        bool kg = true;
        delegate void invokeInfo(string obj);
        string recStr = "";
        byte[] recBytes = new byte[4096];
        int bytes = 0;
        public void Output(string info)
        {
            txt_MessageLog.Text += info + "\r\n";
        }

        private void But_Send_Click(object sender, EventArgs e)
        {
            try
            {
                if (string.IsNullOrEmpty(txt_Send.Text))
                    return;
                string sendStr = txt_Send.Text;
                txt_Send.Text = "";
                txt_MessageLog.Text += "我:" + sendStr + "\r\n";
                byte[] sendBytes = Encoding.UTF8.GetBytes(clientSocket.RemoteEndPoint + ":" + sendStr);
                int i= clientSocket.Send(sendBytes);
            }
            catch (Exception ex)
            {
                txt_MessageLog.Text += "信息发送异常\r\n";
            }
        }

        private void But_Starlisten_Click(object sender, EventArgs e)
        {
            try
            {
               
                clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                if (string.IsNullOrEmpty(txt_IP.Text) || string.IsNullOrEmpty(txt_port.Text))
                    return;
                IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(txt_IP.Text), int.Parse(txt_port.Text));
                clientSocket.Connect(ipe);
                txt_MessageLog.Text += "连接成功\r\n";
                groupBox1.Text += txt_IP.Text;
                Thread t = new Thread(new ParameterizedThreadStart(GetInfo));
                t.IsBackground = true;
                t.Start(clientSocket);
              
            }
            catch (Exception ex)
            {
                txt_MessageLog.Text += "服务器连接异常\r\n";
            }
        }

        private void But_endlisten_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            Close();
        }

        /// <summary>
        /// 接收服务端信息
        /// </summary>
        public void GetInfo(object o)
        {
            Socket clientSocket = o as Socket;
            try
            {
                while (kg)
                {
                    bytes = clientSocket.Receive(recBytes, recBytes.Length, SocketFlags.None);
                    if (bytes <= 0)
                    {
                        txt_MessageLog.Invoke(new invokeInfo(Output), "服务器连接已经关闭");
                        if (clientSocket.Connected)
                            clientSocket.Shutdown(SocketShutdown.Both);
                        clientSocket.Disconnect(false);
                        clientSocket.Close();
                        break;
                    }
                    recStr = Encoding.UTF8.GetString(recBytes, 0, bytes);
                    txt_MessageLog.Invoke(new invokeInfo(Output), recStr);
                }
            }
            catch (Exception ex)
            {
                txt_MessageLog.Invoke(new invokeInfo(Output), "服务器的信息接收异常,原因:" + ex.Message+"\r\n");
            }
        }

        /// <summary>
        /// 关闭Socket
        /// </summary>
        public void Close()
        {
            try
            {
                kg = false;
                if (clientSocket.Connected)
                    clientSocket.Shutdown(SocketShutdown.Both);
                clientSocket.Close();
            }
            catch { }
        }

    }
}
复制代码

 



客户端界面:

客户端代码:

posted @ 2017-11-28 16:20  维尼熊320  阅读(180)  评论(0编辑  收藏  举报