C#之Socket编程

来源:互联网 发布:鞋erp软件xyerp 编辑:程序博客网 时间:2024/06/07 16:52

C#之Socket编程

将我自己练习的C#Socket代码奉上,至于Socket是干什么的就不用我在此过多赘述了。

下面两段代码,一个为服务端,一个味客户端。

代码中注释非常详细,所以就不过多说明了。


服务端代码:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;//引入明明空间using System.Net.Sockets;using System.Net;using System.Threading;//服务端namespace SocketTest{    class Program    {             //制定端口号为 10000        private static int myProt = 10000;         private static Socket serverSocket; //定义Socket对象        static void Main(string[] args)        {            //服务器IP地址            IPAddress ip = IPAddress.Parse("127.0.0.1");            //实例化Socket对象,指明为 Tcp协议,如果用UDP协议,则要用SocketType.Dagram类型的套接字            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            //绑定IP地址和端口号            serverSocket.Bind(new IPEndPoint(ip, myProt));            //设定最多接受100个连接            serverSocket.Listen(100);            Console.WriteLine("启动监听{0}成功", serverSocket.LocalEndPoint.ToString());            //通过ClientSocket发送数据            //启动一个线程,线程调用方法为  ListenClientConent            Thread myThread = new Thread(ListenClientConent);            //启动线程,不带参数            myThread.Start();            Console.ReadLine();        }        //监听客户端请求        private static void ListenClientConent()        {            while (true)            {                //定义一个Socket对象接受连接到的Socket实例                Socket clientSocket = serverSocket.Accept();                           string message = "I am Server Say";                //向连接的客户端发送消息                SendMessage(clientSocket, message);                //创建一个接收客户端消息的线程                Thread receiveThread = new Thread(ReceiveClientMessage);                //开启线程,参数 clientSocket 为 ReceiveClientMessage 方法的参数                receiveThread.Start(clientSocket);            }        }        //接收消息        private static void ReceiveClientMessage(object clientSocket)        {            Socket ClientSocket = (Socket)clientSocket;            while (true)            {                try                {                    //用于存储接收到的消息                    byte[] resultByte = new byte[1024];                     //通过ClientSocket接收数据                    int receiveNumber = ClientSocket.Receive( resultByte, resultByte.Length, 0);                    //获取连接客户端的IP地址和端口                    string ipPort = ClientSocket.RemoteEndPoint.ToString();                    string message = Encoding.ASCII.GetString(resultByte, 0, receiveNumber);                    Console.WriteLine("接收客户端{0}发来的消息{1}", ipPort, message);                    //服务端接收到客户端发来的消息,再发给客户端                    SendMessage(ClientSocket, "You Send message is " + message);                }                catch (Exception ex)                {                    Console.WriteLine(ex.Message);                    Closed(ClientSocket);                                    break;                }            }        }        //发送消息的方法        private static void SendMessage(Socket clientSocket, string sendMessage)        {            Socket ClientSocket = clientSocket;            if (ClientSocket == null) //判断连接的Socket对象是否为空            {                return;            }            //将发送的字符串转换为数据包            byte[] sendMessageByte = Encoding.UTF8.GetBytes(sendMessage);            try            {                //开始一个异步发送, sendMessageCallBack 为回调方法                IAsyncResult asyncSend = ClientSocket.BeginSend(sendMessageByte, 0, sendMessageByte.Length, SocketFlags.None, new AsyncCallback(sendMessageCallBack), ClientSocket);                //检测超时,超过五秒表示发送失败                bool sendResult = asyncSend.AsyncWaitHandle.WaitOne(5000, true);                if (!sendResult)                {                    Console.WriteLine("send out time");                }            }            catch            {                Console.WriteLine("send error");            }        }        //发送消息的毁掉函数        private static void sendMessageCallBack(IAsyncResult asyncConnect)        {            Console.WriteLine("服务端已向客户端发送消息");        }        //关闭        private static void Closed(Socket cliSocket)        {            if (cliSocket != null && cliSocket.Connected)            {                cliSocket.Shutdown(SocketShutdown.Both);                cliSocket.Close();            }            cliSocket = null;        }    }}


客户端代码:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Net;using System.Net.Sockets;using System.Threading;//客户端namespace ClientSocketTest{    class Program    {        private static byte[] resultByte = new byte[512];        private static IPAddress ip;        private static Socket clientSocket;        static void Main(string[] args)        {            //设定服务器IP地址            ip = IPAddress.Parse("127.0.0.1");            clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            try            {                IPEndPoint ipEndpoint = new IPEndPoint(ip, 10000);                //建立一个一部的建立连接,当连接建立成功调用 CallBack 方法                IAsyncResult result = clientSocket.BeginConnect(ipEndpoint, new AsyncCallback(CallBack), clientSocket);                //clientSocket.Connect(new IPEndPoint(ip, 10000));                //超时检测,当建立超过 5 秒 还没有连接成功表示超时                bool successConnect = result.AsyncWaitHandle.WaitOne(5000, true);                if (!successConnect) //判断是否连接成功                {                    //连接失败,关闭                    Closed(clientSocket);                }                else                {                    //开启一个接收消息的线程                    Thread receiveMessageThread = new Thread( ReceiveMessage);                    //启动线程, clientSocket 为 ReceiveMessage 的参数                    receiveMessageThread.Start(clientSocket);                }                Console.WriteLine("连接服务器成功");            }            catch            {                Console.WriteLine("连接服务器失败,按任意键退出");                return;            }                        //通过clientSocket发送消息,循环3次向服务端发送信息            for (int i = 0; i < 3; i++)            {                try                {                    //等待 1 秒                    Thread.Sleep(1000);                    string sendMessage = "I'm Client ";                    //将发送的字符串转换为数据包                                     SendMessage( clientSocket, sendMessage);                    //Console.WriteLine("向服务器发送消息 : {0}" + sendMessage);                }                catch                {                    Closed(clientSocket);                    break;                }            }            //下面是手动输入数字发送给服务端,当输入为 0 时退出循环            int number = 1;            while(number != 0)            {                string str = Console.ReadLine();                number = int.Parse(str);                string sendMessage = "I'm client send : " + number.ToString();                SendMessage( clientSocket, sendMessage);            }            Console.WriteLine("发送完毕");            Console.ReadLine();        }        private static void CallBack(IAsyncResult asyncConnect)        {            Console.WriteLine("连接成功");        }        //关闭        private static void Closed(Socket cliSocket)        {            // 如果客户端Socket对象不为空,并且为连接状态            if (cliSocket != null && cliSocket.Connected)            {                //关闭Socket                cliSocket.Shutdown(SocketShutdown.Both);                cliSocket.Close();            }            cliSocket = null;//将客户端对象赋值为空        }        //发送消息调用该方法        private static void SendMessage( Socket cliSocket, string str)        {            Socket ClientSocket = cliSocket;            //将发送的字符串转换为数据包            byte[] messageByte = Encoding.UTF8.GetBytes(str);            //判断客户端是否连接            if (!ClientSocket.Connected)            {                Console.WriteLine("客户端为连接,向服务端发送消息失败");                Closed(ClientSocket);                return;            }            try            {                //开启一个异步发送                IAsyncResult asyncSend = clientSocket.BeginSend(messageByte, 0, messageByte.Length, SocketFlags.None, new AsyncCallback(SendMessageCallBack), ClientSocket);                //超时检测,超过五秒表示发送失败                bool sendResult = asyncSend.AsyncWaitHandle.WaitOne(5000, true);                if (!sendResult)                {                    Closed(ClientSocket);                }            }            catch            {                Console.WriteLine("send error");            }        }        //发送消息的回调方法        private static void SendMessageCallBack(IAsyncResult asyncConnect)        {            Console.WriteLine("客户端已向服务端发送消息");        }        //接收消息        private static void ReceiveMessage(object cliSocket)        {            //创建一个Socket对象接收要cliSocket            Socket ClieSocket = (Socket)cliSocket;            //在这个线程中接收服务器发送的数据            while (true)            {                if (!ClieSocket.Connected)                {                    ClieSocket.Close();                    break;                }                try                {                    //通过clientSocket接收数据                                     //接收数据保存到receiveByte中                    byte[] receiveByte = new byte[216];                    //Receive方法会一直等待服务端回发消息,如果没有接收到会一直在这里等待                    int length = ClieSocket.Receive(receiveByte, receiveByte.Length, 0);                    if (length <= 0)                    {                        ClieSocket.Close();                        break;                    }                                        if (length > 1)                    {                        //将接收到的字节转换为字符串                        string receiveString = Encoding.ASCII.GetString(receiveByte, 0, receiveByte.Length);                        Console.WriteLine("recive : {0}", receiveString);                    }                }                catch{ }            }        }    }}

分别创建客户端服务端的C#项目,将代码粘贴进去运行即可

运行结果如下所示

(1)首先运行服务端:



(2)启动客户端:

服务端监听到客户端的连接后,接收客户端发送的消息

(2.1)服务端控制台如下所示:



(2.2)客户端控制台如下所示



(2.3)在客户端输入数字回车发送给服务端,输入 0 退出

客户端控制台如下



服务端控制台如下

























0 1
原创粉丝点击