简单Socket

简单Socket
简单Socket
以下代码来自SIKI学院:
服务器端:
using System;
usingSystem.Net;
namespace tcpconnect
{
            class MainClass
            {
                        public static void Main (string[] args)
                        {
                                    Socket serverSocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                                    // 172.18.32.163    172.0.0.1
                                    //绑定IP
                                    //不推荐,注意数字之间为逗号
                                    //IPAddress ipadress = new IPAddress (new byte[]{172,18,32,163});
                                    IPAddress ipadress = IPAddress.Parse("172.18.32.163");
                                    //创建端口号
                                    IPEndPoint ipEndPoint = new IPEndPoint (ipadress,88);
                                    //绑定端口号
                                    serverSocket.Bind(ipEndPoint);
                                    //开始监听(对列为50个,参数为0是无数个,考虑性能50个)
                                    serverSocket.Listen(50);
                                    //为当前客户端建立服务器连接
                                    Socket clientSocket = serverSocket.Accept();
                                    //测试消息
                                    string msg = "hello你好";
                                    //中文处理(byte传输)
                                    byte[] data = System.Text.Encoding.UTF8.GetBytes(msg);
                                    //向客户端发消息
                                    clientSocket.Send (data);
                                    //接收客户端消息
                                    byte[] databuffer = new byte[1024] ;
                                    //数据byte个数
                                    int count = clientSocket.Receive(databuffer);
                                    //将数据从0到count转为字符串
                                    string msgReceive = System.Text.Encoding.UTF8.GetString(databuffer,0,count);
                                    //打印
                                    Console.WriteLine (msgReceive);

                                    //关闭与当前客户端的连接
                                    clientSocket.Close();
                                    //关闭服务器连接
                                    serverSocket.Close ();


客户端:
using System;
usingSystem.Net;
using System.Text;

namespace TCPClient
{
            class MainClass
            {
                        public static void Main (string[] args)
                        {
                                    //创建一个socket接口
                                    Socket clientSocket = new Socket (AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
                                    //与服务器进行连接(注意不要写错)
                                    clientSocket.Connect(new IPEndPoint (IPAddress.Parse("172.18.32.163"),88));


                                    //创建一个数组用于接收来自服务器的消息
                                    byte[] data = new byte[1024] ;
                                    //接收来自服务器的消息(接收不到程序会一直停在这里接收,指导接收到为止)
                            int count =    clientSocket.Receive (data);
                                    //字节转字符串
                                    string msg = Encoding.UTF8.GetString (data,0,count);
                                    Console.WriteLine (msg);

                                    //发送消息(发送则不会停止)
                                    string s = Console.ReadLine();
                                    clientSocket.Send (Encoding.UTF8.GetBytes(s));
                                    //关掉与服务器的连接
                                    clientSocket.Close();

同步接收:只能一条一条的接收和发送
异步接收:多条连续发送接收
服务器端:

            //异步传输
                        static void StartServerAsync(){
                                    Socket serverSocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                                    // 172.18.32.163    172.0.0.1
                                    //绑定IP
                                    //不推荐,注意数字之间为逗号
                                    //IPAddress ipadress = new IPAddress (new byte[]{172,18,32,163});
                                    IPAddress ipadress = IPAddress.Parse("172.18.32.163");
                                    //创建端口号
                                    IPEndPoint ipEndPoint = new IPEndPoint (ipadress,88);
                                    //绑定端口号
                                    serverSocket.Bind(ipEndPoint);
                                    //开始监听(对列为50个,参数为0是无数个,考虑性能50个)
                                    serverSocket.Listen(50);
                                    Console.WriteLine ("服务器开启成功!");

                                    //为当前客户端建立服务器连接
                                    Socket clientSocket = serverSocket.Accept();
                                    //测试消息
                                    string msg = "hello你好";
                                    //中文处理(byte传输)
                                    byte[] data = System.Text.Encoding.UTF8.GetBytes(msg);
                                    //向客户端发消息
                                    clientSocket.Send (data);

                                    //开始接收消息(异步)
                                    //将接收来的消息从第0位存到1024位,存进databuffer中,并且在接收到每条消息后,用ReceiveCallBack方法进行处理,方法参数为clientSocket
                                    clientSocket.BeginReceive (databuffer,0,1024,SocketFlags.None,ReceiveCallBack,clientSocket);

                                    #region 关掉单条接收功能 并且不关闭服务器端

//                                 //接收客户端消息
//                                 byte[] databuffer = new byte[1024] ;
//                                 //数据byte个数
//                                 int count = clientSocket.Receive(databuffer);
//                                 //将数据从0到count转为字符串
//                                 string msgReceive = System.Text.Encoding.UTF8.GetString(databuffer,0,count);
//                                 //打印
//                                 Console.WriteLine (msgReceive);
//
//                                 //暂停一下
//                                 Console.ReadKey();
//                                 //关闭与当前客户端的连接
//                                 clientSocket.Close();
//                                 //关闭服务器连接
//                                 serverSocket.Close ();

                                    #endregion
                        }

                        //回调函数(自带参数,方法名随便起)
                        static void ReceiveCallBack(IAsyncResult ar){
                                    Socket clientSocket = ar.AsyncState as Socket;
                                    //完成数据接收(和BeginReceive对应)
                                    int count = clientSocket.EndReceive(ar);
                                    string msg = Encoding.UTF8.GetString (databuffer,0,count);
                                    Console.WriteLine ("从客户端接收到数据"+msg);
                                    //接收完一条再接收一条
                                    clientSocket.BeginReceive (databuffer,0,1024,SocketFlags.None,ReceiveCallBack,client

Socket);
 客户端:

                                    while (true) {
                                                //发送消息(发送则不会停止)
                                                string s = Console.ReadLine ();

                                                clientSocket.Send (Encoding.UTF8.GetBytes (s));
                                    }


                        }
            }
}
                        }

接受多个客户端连接
//异步传输
                        static void StartServerAsync(){

                                    //建立服务器
                                    Socket serverSocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                                    // 172.18.32.163    172.0.0.1
                                    //绑定IP
                                    //不推荐,注意数字之间为逗号
                                    //IPAddress ipadress = new IPAddress (new byte[]{172,18,32,163});
                                    IPAddress ipadress = IPAddress.Parse("172.18.32.163");
                                    //创建端口号
                                    IPEndPoint ipEndPoint = new IPEndPoint (ipadress,88);
                                    //绑定端口号
                                    serverSocket.Bind(ipEndPoint);

                                    try {
                                                //开始监听(对列为50个,参数为0是无数个,考虑性能50个)
                                                serverSocket.Listen(50);
                                                Console.WriteLine ("服务器开启成功!");
                                    }  catch (Exception ex) {
                                                Console.WriteLine (ex);
                                    }


                                    //为当前客户端建立服务器连接(当与一个客户端建立连接后,执行AcceptCallBack函数,参数为serverSocket)
                                    //Socket clientSocket = serverSocket.Accept();
                                    serverSocket.BeginAccept(AcceptCallBack,serverSocket);


                                    #region 关掉单条接收功能 并且不关闭服务器端

//                                 //接收客户端消息
//                                 byte[] databuffer = new byte[1024] ;
//                                 //数据byte个数
//                                 int count = clientSocket.Receive(databuffer);
//                                 //将数据从0到count转为字符串
//                                 string msgReceive = System.Text.Encoding.UTF8.GetString(databuffer,0,count);
//                                 //打印
//                                 Console.WriteLine (msgReceive);
//
//                                 //暂停一下
//                                 Console.ReadKey();
//                                 //关闭与当前客户端的连接
//                                 clientSocket.Close();
//                                 //关闭服务器连接
//                                 serverSocket.Close ();

                                    #endregion
                        }

                        //回调函数(自带参数,方法名随便起)  IAsyncResult:异步操作接口  AsyncState:异步操作返回的信息
                        static void ReceiveCallBack(IAsyncResult ar){
                                    //每有一个客户端连接就与它建立一个socket连接
                                    Socket clientSocket = ar.AsyncState as Socket;
                                    //完成单条数据接收(和BeginReceive对应)
                                    int count = clientSocket.EndReceive(ar);
                                    string msg = Encoding.UTF8.GetString (databuffer,0,count);
                                    Console.WriteLine ("从客户端接收到数据"+msg);
                                    //接收完一条再接收一条
                                    clientSocket.BeginReceive (databuffer,0,1024,SocketFlags.None,ReceiveCallBack,clientSocket);
                        }


                        static void AcceptCallBack(IAsyncResult ar){
                                    //serverSocket是需要异步操作的对象
                                    Socket serverSocket = ar.AsyncState as Socket;
                                    //返回一个与客户端的连接
                                    Socket clientSocket = serverSocket.EndAccept (ar);
                                    //测试消息
                                    string msg = "hello你好";
                                    //中文处理(byte传输)
                                    byte[] data = System.Text.Encoding.UTF8.GetBytes(msg);
                                    //向客户端发消息
                                    clientSocket.Send (data);

                                    //开始接收消息(异步)
                                    //将接收来的消息从第0位存到1024位,存进databuffer中,并且在接收到每条消息后,用ReceiveCallBack方法进行处理,方法参数为clientSocket
                                    clientSocket.BeginReceive (databuffer,0,1024,SocketFlags.None,ReceiveCallBack,clientSocket);
                                    //处理完一个客户端再处理另一个客户端
                                    serverSocket.BeginAccept(AcceptCallBack,serverSocket);
                        }
            }
}