Socket使用 - 1

后期项目实战:多人在线聊天室

源码位置:https://git.oschina.net/z13qu/BlogProjects

课前须知

  1. 这里不讲解Socket和TCP/IP的底层知识
    对于初学者来说底层原理枯燥难懂,越讲越懵逼,等大家成为大神,需要深层掌握协议时,再去了解也不迟
  2. TCP/IP:传输控制协议/因特网互联协议
    初学者不要太纠结这个东西,协议也可以理解为约定,就是大家都遵守的一种东西。
    比如开车要靠右,就是让道路变得有条有序,TCP/IP协议的目的就是让传输数据变得有条有序
  3. Socket和TCP/IP关系
    TCP/IP是一种协议,Sokect是遵循这种协议做传输数据的一个工具。
    例如:你只知道开车靠右,但是没车,你还是不能运输东西,不是吗?Socket就像遵循开车靠右 (TCP/IP协议) 的车

正式内容

服务端代码

static void Main(string[] args)
{
    IPAddress ip = IPAddress.Parse("127.0.0.1");
    #region 端口
    //端口号的范围从0到65535,建议自己写程序设置端口,都大于3000小于65535,
    //因为windows很多默认程序都小于3000,这样可以避免不必要的端口冲突。
    #endregion
    IPEndPoint ipe = new IPEndPoint(ip, 5001);
    //1.建立一个Socket对象
    Socket socketServer = new Socket(AddressFamily.InterNetwork, 
    SocketType.Stream, ProtocolType.Tcp);
    //2.Socket关联到这个IP上面
    socketServer.Bind(ipe);
    #region 3.开始监听这个IP是否有客户端连接
    //Listen参数:同时有多台客户端连接服务器时,最多允许排队等待的客户端数量
    #endregion
     //最多允许8个客户端排队等待(这个数值建议小于30)
    socketServer.Listen(8);
    Console.WriteLine("正在监听...");

    //接收发送连接信息的客户端(一直等待客户端连接,不继续执行)
    Socket acceptSocket = socketServer.Accept();
    Console.WriteLine("连接成功!!");
    string message = string.Empty;
    byte[] receiveBytes = new byte[2048];
    //服务端会一直等待客户端发送消息,否则不继续执行
    int byteLen = acceptSocket.Receive(receiveBytes, receiveBytes.Length, 0);
    message += Encoding.UTF8.GetString(receiveBytes, 0, byteLen);
    Console.WriteLine("客户端消息:" + message);

    //发送消息给客户端
    string sendMessage = "Hi Boy,I am SocketServer!";
    byte[] sendBytes = Encoding.UTF8.GetBytes(sendMessage);
    acceptSocket.Send(sendBytes, sendBytes.Length, 0);

    //释放Socket占用的资源
    acceptSocket.Dispose();
    socketServer.Dispose();

    Console.ReadKey();
}

客户端代码

static void Main(string[] args)
{
    IPAddress ip = IPAddress.Parse("127.0.0.1");
    IPEndPoint ipe = new IPEndPoint(ip, 5001);
    //1.建立一个Socket对象
    Socket socketClient = new Socket(AddressFamily.InterNetwork,
    SocketType.Stream, ProtocolType.Tcp);
    try
    {
        //2.去连接这个IP(没有Socket监听这个端口,就会报错)
        socketClient.Connect(ipe);
        Console.WriteLine("连接服务端" + ipe + "成功");
        //发送信息给服务端
        string sendMessage = "Hello SocketServer,I am SocketClient.";
        byte[] sendBytes = Encoding.UTF8.GetBytes(sendMessage);
        socketClient.Send(sendBytes);

        //接收信息
        string receiveMessage = "";
        byte[] receiveBytes = new byte[2048];
        //客户端会一直等待服务器发送消息,否则不继续执行
        int byteLen = socketClient.Receive(receiveBytes, 
        receiveBytes.Length, 0);
        receiveMessage += Encoding.UTF8.GetString(receiveBytes, 0, byteLen);
        Console.WriteLine("服务器信息:" + receiveMessage);

        //释放Socket占用的资源
        socketClient.Dispose();
        Console.ReadKey();
    }
    catch (Exception)
    {
        throw;
    }
}

总结

注意:先运行服务端,再运行客户端。

这样简单的Socket通讯,在C#中就算完成了。
但是你会发现,服务端只能连接一个客户端,而且发送的内容都是写死的。
期待和Socket的再次遇。。。。


【原文链接】http://www.cnblogs.com/z13qu/p/6992208.html

posted @ 2017-06-12 12:00  Z13区  阅读(207)  评论(0编辑  收藏  举报