C# Winform 实现TCP发消息

编辑: admin 分类: c#语言 发布时间: 2021-11-25 来源:互联网
目录
  • 服务端:
    • 窗体
    • 代码:
  • 客户端:
    • 窗体
    • 代码
  • 运行结果:

    服务端:

    窗体

    代码:

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    using System.Threading;
    using System.Windows.Forms;
     
    namespace SocketStudy
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            /// <summary>
            /// 负责通信的socket
            /// </summary>
            Socket socketSend;
     
            /// <summary>
            /// 负责监听Socket
            /// </summary>
            Socket socket;
     
            /// <summary>
            /// 存放连接的socket
            /// </summary>
            Dictionary<string, Socket> dictionary = new Dictionary<string, Socket>();
     
            //【来源:自由互联:http://www.1234xp.com/meiguo.html/ <summary>
            /// 开始监听
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void button1_Click(object sender, EventArgs e)
            {
                //创建监听的socket,
                //SocketType.Stream 流式对应tcp协议
                //Dgram,数据报对应UDP协议
                socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                //创建IP地址和端口号
                IPAddress ip = IPAddress.Any;//IPAddress.Parse(textServerIP.Text);
                int port = Convert.ToInt32(textServerPort.Text);
                IPEndPoint iPEndPoint = new IPEndPoint(ip, port);
     
                //让负责监听的Socket绑定ip和端口号
                socket.Bind(iPEndPoint);
     
                ShowLog("监听成功!" + ip + "\t" + port);//打印日志
     
                //设置监听队列
                socket.Listen(10);//一段时间内可以连接到的服务器的最大数量
                Thread thread = new Thread(Listen);
                thread.IsBackground = true;
                thread.Start(socket);
            }
     
            /// <summary>
            /// 使用线程来接收数据
            /// </summary>
            /// <param name="o"></param>
            private void Listen(object o)
            {
                Socket socket = o as Socket;
                while(true){
                    //负责监听的socket是用来接收客户端连接
                    //创建负责通信的socket
                    socketSend = socket.Accept();
                    dictionary.Add(socketSend.RemoteEndPoint.ToString(), socketSend);
                    clientCombo.Items.Add(socketSend.RemoteEndPoint.ToString());
     
                    ShowLog(socketSend.RemoteEndPoint.ToString() + "已连接");
     
                    //开启新线程,接收客户端发来的信息
                    Thread th = new Thread(receive);
                    th.IsBackground = true;
                    th.Start(socketSend);
                }
            }
     
            //服务器接收客户端传来的消息
            private void receive(object o)
            {
                Socket socketSend = o as Socket;
                while (true)
                {
                    try
                    {
                        //客户端连接成功后,服务器接收客户端发来的消息
                        byte[] buffer = new byte[1024 * 1024 * 2];//2M大小
                                                                  //接收到的有效字节数
                        int length = socketSend.Receive(buffer);
                        if (length == 0)
                        {
                            ShowLog(socketSend.RemoteEndPoint.ToString() + "下线了。");
                            dictionary[socketSend.RemoteEndPoint.ToString()].Shutdown(SocketShutdown.Both);
                            dictionary[socketSend.RemoteEndPoint.ToString()].Disconnect(false);
                            dictionary[socketSend.RemoteEndPoint.ToString()].Close();
                            break;
                        }
                        string str = Encoding.ASCII.GetString(buffer, 0, length);
                        ShowLog(socketSend.RemoteEndPoint.ToString() + "\n\t" + str);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                }
            }
     
            /// <summary>
            /// 日志打印
            /// </summary>
            /// <param name="str"></param>
            private void ShowLog(string str)
            {
                textLog.AppendText(str + "\r\n");
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
                //取消对跨线程调用而产生的错误
                Control.CheckForIllegalCrossThreadCalls = false;
            }
     
            private void sendMsgBtn_Click(object sender, EventArgs e)
            {
                string txt = textMsg.Text;
                byte[] buffer = Encoding.UTF8.GetBytes(txt);
                List<byte> list = new List<byte>();
                list.Add(0); // 0 为 发消息
                list.AddRange(buffer);
                byte[] newBuffer = list.ToArray();
                //socketSend.Send(buffer);
                string ip = clientCombo.SelectedItem.ToString();//获取选中的ip地址
                Socket socketsend=dictionary[ip];
                socketsend.Send(newBuffer);
            }
     
            private void selectBtn_Click(object sender, EventArgs e)
            {
                OpenFileDialog fileDialog = new OpenFileDialog();
                fileDialog.InitialDirectory=@"D:";
                fileDialog.Title="选择文件";
                fileDialog.Filter = "所有文件|*.*";
                fileDialog.ShowDialog();
     
                pathTxt.Text = fileDialog.FileName;
     
            }
     
            /// <summary>
            /// 发文件,
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void sendFileBtn_Click(object sender, EventArgs e)
            {
                string path = pathTxt.Text;
                FileStream fileStream = new FileStream(path,FileMode.Open,FileAccess.Read);
     
                byte[] buffer = new byte[1024*1024*3];
                buffer[0] = 1;// 1 为发文件的标志位
                int length = fileStream.Read(buffer, 1, buffer.Length-1);
                fileStream.Close();
                string ip = clientCombo.SelectedItem.ToString();//获取选中的ip地址
                Socket socketsend = dictionary[ip];
                socketsend.Send(buffer,0, length+1, SocketFlags.None);
            }
     
            /// <summary>
            /// 抖一抖
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void shockBtn_Click(object sender, EventArgs e)
            {
                byte[] buffer = new byte[1];
                buffer[0] = 2;// 2 为抖一抖
                string ip = clientCombo.SelectedItem.ToString();//获取选中的ip地址
                Socket socketsend = dictionary[ip];
                socketsend.Send(buffer);
            }
     
            /// <summary>
            /// 关闭前关闭socket
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                try
                {
                    socket.Shutdown(SocketShutdown.Both);
                    socket.Disconnect(false);
                    socket.Close();
                }
                catch
                {
                    socket.Close();
                }
            }
        }
    }

    客户端:

    窗体

    代码

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    using System.Threading;
    using System.Windows.Forms;
    
    namespace Client
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            Socket socket;<br>      //连接
            private void connectBtn_Click(object sender, EventArgs e)
            {
                try
                {
                    //创建负责通信的socket
                    socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    //地址、端口
                    IPAddress ip = IPAddress.Parse(ipText.Text);
                    int serverPort = Convert.ToInt32(portText.Text);
                    IPEndPoint port = new IPEndPoint(ip, serverPort);
                    //连接到服务器
                    socket.Connect(port);
                    ShowLog("已连接");
     
                    //启动接收数据线程
                    Thread th = new Thread(receive);
                    th.IsBackground = true;
                    th.Start();
                }
                catch { }
            }<br>    //日志
            private void ShowLog(string str)
            {
                textLog.AppendText(str + "\r\n");
            }
     
            /// <summary>
            /// 发消息
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void sendMsgBtn_Click(object sender, EventArgs e)
            {
                try
                {
                    string txt = sendMsg.Text;
                    byte[] buffer = Encoding.ASCII.GetBytes(txt);//ascii编码
                    socket.Send(buffer);
                }
                catch { }
            }
        <br>    //接收消息<br>
            private void receive()
            {
                while (true)
                {
                    try
                    {
                        byte[] buffer = new byte[1024 * 1024 * 2];
                        int length = socket.Receive(buffer);
                        if (length == 0)
                        {
                            break;
                        }
                        if (buffer[0] == 0)
                        {
                            string txt = Encoding.UTF8.GetString(buffer, 1, length-1);
                            ShowLog(socket.RemoteEndPoint + ":\r\t" + txt);
                        }else if (buffer[0] == 1)
                        {
                            SaveFileDialog saveFileDialog = new SaveFileDialog();
                            saveFileDialog.InitialDirectory = @"E:\";
                            saveFileDialog.Title = "饿了吃什么";
                            saveFileDialog.Filter = "所有文件 | *.*";
                            saveFileDialog.ShowDialog(this);
     
                            string path = saveFileDialog.FileName;
                            FileStream fileStreamWrite = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write);
                            fileStreamWrite.Write(buffer,1,length-1);
                            fileStreamWrite.Close();
                            MessageBox.Show("保存成功");
                        }else if (buffer[0] == 2)
                        {
                            ZD();
                        }
                    }
                    catch { }
                }
            }
          //震动
            private void ZD()
            {
                for(int i=0;i<20;i++){
                    if (i%2==0)
                    {
                        this.Location = new System.Drawing.Point(500, 500);
                    }
                    else
                    {
                        this.Location = new System.Drawing.Point(530, 530);
                    }
                    Thread.Sleep(20);
                }
            }
        //取消跨线程检查
            private void Form1_Load(object sender, EventArgs e)
            {
                Control.CheckForIllegalCrossThreadCalls = false;
            }
        //关闭前关掉socket
            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                socket.Disconnect(false);
                socket.Close();
            }
          //断开连接
            private void button1_Click(object sender, EventArgs e)
            {
                if (socket !=null)
                {
                    socket.Disconnect(false);
                }
            }
        }
    }

    运行结果:

    以上就是C# Winform 实现TCP发消息的详细内容,更多关于c# 实现TCP发消息的资料请关注海外IDC网其它相关文章!

    【文章转自:韩国cn2服务器 转载请保留连接】