socket demo
服务端直接执行客户端发来的命令
服务端
using System;
using System.Diagnostics;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace SocketServer
{
internal class Program
{
private static Socket severSocket = null;
private static void Main(string[] args)
{
severSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 19999);
severSocket.Bind(endPoint); // 绑定
severSocket.Listen(1); // 设置最大连接数
Console.WriteLine("开始监听");
//Console.WriteLine("进程ID"+Process.GetCurrentProcess().Id);
Thread thread = new Thread(ListenClientConnect); // 开启线程监听客户端连接
thread.Start("连接成功");
}
private static Socket clientSocket;
/// <summary>
/// 监听客户端连接
/// </summary>
private static void ListenClientConnect(object msg)
{
clientSocket = severSocket.Accept(); // 接收客户端连接
Console.WriteLine("客户端连接成功 信息: " + clientSocket.AddressFamily.ToString());
clientSocket.Send(Encoding.Default.GetBytes(msg.ToString()));
Thread revThread = new Thread(ReceiveClientManage);
revThread.Start(clientSocket);
}
private static void ReceiveClientManage(object clientSocket)
{
try
{
Socket socket = clientSocket as Socket;
byte[] buffer = new byte[1024];
while (true)
{
Array.Clear(buffer, 0, buffer.Length);
socket.Receive(buffer); // 从客户端接收消息
string cmd = Encoding.Default.GetString(buffer);
Console.WriteLine("收到消息:" + cmd);
cmd = cmd.Replace("\0", "");
Exec(cmd);
}
}
catch (SocketException)
{
//客户端断开重启
severSocket.Close();
severSocket.Dispose();
GC.Collect();
Process.Start(Process.GetCurrentProcess().MainModule.FileName);
Environment.Exit(0);
}
}
/// <summary>
/// 执行客户端发来的cmd命令
/// </summary>
/// <param name="cmd"></param>
private static void Exec(string cmd)
{
string msg = "";
Process p = new Process();
p.StartInfo.FileName = "cmd.exe"; //待执行的文件路径
p.StartInfo.UseShellExecute = false; //重定向输出,这个必须为false
p.StartInfo.RedirectStandardError = true; //重定向错误流
p.StartInfo.RedirectStandardInput = true; //重定向输入流
p.StartInfo.RedirectStandardOutput = true; //重定向输出流
p.StartInfo.CreateNoWindow = false; //不启动cmd黑框框
p.Start();
p.StandardInput.WriteLine(cmd);
p.StandardInput.WriteLine("exit");
String strRst = p.StandardOutput.ReadToEnd(); //获取cmd处理输出信息
String error = p.StandardError.ReadToEnd(); //获取错误信息
msg += strRst + error;
Console.WriteLine(msg);
p.Dispose();
clientSocket.Send(Encoding.Default.GetBytes(msg));
}
}
}
客户端
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace SocketClient
{
internal class Program
{
private static Socket clientSocket = null;
private static void Main(string[] args)
{
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 客户端不需要绑定, 需要连接
IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 19999); //服务端IP和端口
clientSocket.Connect(endPoint);
Console.WriteLine("连接到服务器");
Receive();
Console.ReadKey();
}
private static void Receive()
{
byte[] buffer = new byte[1024];
string cmd = "";
while ("exit" != cmd)
{
Array.Clear(buffer, 0, buffer.Length);
clientSocket.Receive(buffer);
string msg = Encoding.Default.GetString(buffer);
Console.WriteLine("收到消息: " + msg.Replace("\0", ""));
Console.WriteLine("输入CMD(exit退出):");
while ((cmd = Console.ReadLine()) == "")
{
Console.WriteLine("CMD命令不能为空:");
}
Console.WriteLine(cmd);
clientSocket.Send(Encoding.Default.GetBytes(cmd));
}
}
}
}