服务端
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