服务端
using System;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Net;
using System.Text;

namespace XCGConsoleApp
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint point = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 55555);
            try
            {
                server.Bind(point);
                //指定了请求连接的队列大小。
                //如果同时有多个连接请求,超出这个队列大小的请求将被拒绝,直到队列中的连接被处理完毕‌。
                server.Listen(10);
                //监听本地端口
                Console.WriteLine("开始监听本地端口:55555");
                //循环接收客户端连接请求
                while (true)
                {
                    //接受客户端连接请求。
                    Socket socket = server.Accept();
                    List<byte> data = new List<byte>();
                    int byteLen = 1024;//每次读取的字节数
                    var tempBuffs = new byte[byteLen];
                    int n = 0;
                    //接收数据,直到没有数据为止。
                    while ((n = socket.Receive(tempBuffs)) > 0)
                    {
                        //不能直接用data.AddRange(tempBuffs);
                        //因为每次循环Receive都只会替换tempBuffs中索引0到n-1的值。
                        //而最后一次循环接收的数据可能不满byteLen,所以需要遍历n次。
                        for (int i = 0; i < n; i++)
                        {
                            int k = i;
                            data.Add(tempBuffs[k]);
                        }
                        //接收数据,直到没有数据为止。
                        if (n < byteLen)
                        {
                            break;
                        }
                    }
                    string cmd = Encoding.UTF8.GetString(data.ToArray(), 0, data.Count);
                    Console.WriteLine("收到命令:" + cmd);
                    string result = execCmd(cmd);
                    Console.WriteLine("执行结果:" + result);
                    byte[] bytes = Encoding.UTF8.GetBytes(result);
                    socket.Send(bytes);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return;
            }
        }

        /// <summary>
        /// 重定向输入输出流,并且用cmd执行命令
        /// </summary>
        /// <param name="cmd"></param>
        /// <returns></returns>
        private static String execCmd(String cmd)
        {
            System.Diagnostics.Process p = new System.Diagnostics.Process();
            p.StartInfo = new System.Diagnostics.ProcessStartInfo();
            p.StartInfo.FileName = "cmd.exe";
            p.StartInfo.Arguments = "/c " + cmd;
            //隐藏程序外壳
            p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
            //在这里重定向输出即可,因为不是交互式的,如果需要交互式的直接反弹cmd即可
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.CreateNoWindow = true;
            p.Start();
            return p.StandardOutput.ReadToEnd();
        }
    }
}

客户端

private void btnSendMsg_Click(object sender, EventArgs e)
{
    var cmd = "ipconfig";
    string ipAddressString = "127.0.0.1";
    int port = 55555;
    IPAddress ipAddress = IPAddress.Parse(ipAddressString);
    IPEndPoint endpoint = new IPEndPoint(ipAddress, port);
    var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    socket.Connect(endpoint);
    //发送数据
    var msg = Encoding.UTF8.GetBytes(cmd);
    socket.Send(msg);

    int byteLen = 1024;//每次读取的字节数
    var tempBuffs = new byte[byteLen];
    List<byte> data = new List<byte>();
    if (socket.Connected)
    {
        //接收数据
        int n = 0;
        while ((n = socket.Receive(tempBuffs)) > 0)
        {
            for (int i = 0; i < n; i++)
            {
                int k = i;
                data.Add(tempBuffs[k]);
            }
            //接收数据,直到没有数据为止。
            if (n < byteLen)
            {
                break;
            }
        }
    }
    socket.Close();
    //读取结束
    var dataArray = data.ToArray();
    //将字节数组转换为字符串,此处为UTF8编码。
    var text = Encoding.UTF8.GetString(dataArray);
    txtMsg.Text += text + "\r\n";
}

参考:https://www.jb51.net/article/53307.htm

posted on 2025-01-06 15:32  邢帅杰  阅读(40)  评论(0编辑  收藏  举报