2013-11-28 12:53:13

C# Socket小例子

程序分为服务端和客户端两部分,实现的功能很简单,客户端发送相应的指令,服务端接受执行后将结果返回给客户端!

服务端代码:


using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace Server
{
    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);
                //监听本地端口
                System.Console.WriteLine("开始监听本地端口:55555");
                while (true)
                {
                    Socket sock = server.Accept();
                    byte[] buffer = new byte[1024 * 1024];
                    int n = sock.Receive(buffer);
                    String cmd = Encoding.UTF8.GetString(buffer, 0, n);
                    String result = execCmd(cmd);
                    byte[] bytes = Encoding.UTF8.GetBytes(result);
                    sock.Send(bytes);
                }
            }
            catch (Exception ex)
            {
                System.Console.WriteLine(ex.Message);
                return;
            }
        }
        //重定向输入输出流,并且用cmd执行命令
        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();
        }
    }
}

客户端代码:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows.Forms;
/*
 *   Code By iswin  
 */
namespace Client
{
    public partial class main : Form
    {
        public main()
        {
            InitializeComponent();
            this.ip.Text="127.0.0.1";
            this.cmd.Text="ipconfig";
            this.port.Text = "55555";
        }
        private void send_Click(object sender, EventArgs e)
        {
            Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            String remoteip=this.ip.Text;
            String command = this.cmd.Text;
            IPAddress ip = IPAddress.Parse(remoteip);
            IPEndPoint point=new IPEndPoint(ip,int.Parse(port.Text));
            try
            {
                this.recvmsg.Text = "开始连接服务端:" + remoteip + ":" + port.Text + "\n";
                client.Connect(point);
                this.recvmsg.Text="连接服务端!\n给服务端发送指令:"+command;
                byte[] buffer = Encoding.UTF8.GetBytes(command);
                //讲输入的指令发送到服务端
                client.Send(buffer);
                //接受服务端返回的数据
                recvmsgs(client);
                client.Close();
            }
            catch (Exception ex)
            {
                this.recvmsg.Text = ex.Message;
                MessageBox.Show(ex.Message);
                return;
            }
        }
        //接受服务端发送来的消息
        private void recvmsgs(Socket client)
        {
                try
                {
                    byte[] buffer = new byte[1024 * 1024];
                    int size = client.Receive(buffer);
                    String recv = Encoding.UTF8.GetString(buffer, 0, size);
                    this.recvmsg.Text = "\n" + recv;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    return;
                }
        }
    }
}

程序运行截图

发表回复