服務(wù)端
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); //指定了請(qǐng)求連接的隊(duì)列大小。 //如果同時(shí)有多個(gè)連接請(qǐng)求,超出這個(gè)隊(duì)列大小的請(qǐng)求將被拒絕,直到隊(duì)列中的連接被處理完畢?。 server.Listen(10); //監(jiān)聽(tīng)本地端口 Console.WriteLine("開(kāi)始監(jiān)聽(tīng)本地端口:55555"); //循環(huán)接收客戶端連接請(qǐng)求 while (true) { //接受客戶端連接請(qǐng)求。 Socket socket = server.Accept(); List<byte> data = new List<byte>(); int byteLen = 1024;//每次讀取的字節(jié)數(shù) var tempBuffs = new byte[byteLen]; int n = 0; //接收數(shù)據(jù),直到?jīng)]有數(shù)據(jù)為止。 while ((n = socket.Receive(tempBuffs)) > 0) { //不能直接用data.AddRange(tempBuffs); //因?yàn)槊看窝h(huán)Receive都只會(huì)替換tempBuffs中索引0到n-1的值。 //而最后一次循環(huán)接收的數(shù)據(jù)可能不滿byteLen,所以需要遍歷n次。 for (int i = 0; i < n; i++) { int k = i; data.Add(tempBuffs[k]); } //接收數(shù)據(jù),直到?jīng)]有數(shù)據(jù)為止。 if (n < byteLen) { break; } } string cmd = Encoding.UTF8.GetString(data.ToArray(), 0, data.Count); Console.WriteLine("收到命令:" + cmd); string result = execCmd(cmd); Console.WriteLine("執(zhí)行結(jié)果:" + result); byte[] bytes = Encoding.UTF8.GetBytes(result); socket.Send(bytes); } } catch (Exception ex) { Console.WriteLine(ex.Message); return; } } /// <summary> /// 重定向輸入輸出流,并且用cmd執(zhí)行命令 /// </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; //在這里重定向輸出即可,因?yàn)椴皇墙换ナ降模绻枰换ナ降闹苯臃磸梒md即可 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); //發(fā)送數(shù)據(jù) var msg = Encoding.UTF8.GetBytes(cmd); socket.Send(msg); int byteLen = 1024;//每次讀取的字節(jié)數(shù) var tempBuffs = new byte[byteLen]; List<byte> data = new List<byte>(); if (socket.Connected) { //接收數(shù)據(jù) int n = 0; while ((n = socket.Receive(tempBuffs)) > 0) { for (int i = 0; i < n; i++) { int k = i; data.Add(tempBuffs[k]); } //接收數(shù)據(jù),直到?jīng)]有數(shù)據(jù)為止。 if (n < byteLen) { break; } } } socket.Close(); //讀取結(jié)束 var dataArray = data.ToArray(); //將字節(jié)數(shù)組轉(zhuǎn)換為字符串,此處為UTF8編碼。 var text = Encoding.UTF8.GetString(dataArray); txtMsg.Text += text + "\r\n"; }
參考:https://www.jb51.net/article/53307.htm
浙公網(wǎng)安備 33010602011771號(hào)