TCP/IP协议详解(二) 基于C# Socket的C/S模型建立

  前一章节我提到了在Windows,LINUIX内核已经有了完整的TCP/IP实现,只要会调用专用接口函数: Socket和TLI(传输层接口)就足够了,正好我最近在了解C#,所以便通过Socket实现简单的客户端/服务器模型,程序本身并不难,不过理解了之后对于认知TCP/IP有着良好的促进作用。

  想要实现Socket通讯,具体实现参考标准的流程,如下图:

  

了解了上图,那么就可以开始C#的编程了(窗体设计等参考源码,我主要讲解核心代码):

客户端:

  客户端的实现比较简单

1.建立tcp连接(等同于socket 和 connect),处理连接失败状态

2.对于建立成功的连接,发送数据,并等待服务器返回

3.接收数据,输出到编辑框

4.关闭连接

private void button1_Click(object sender, EventArgs e)
{
    try
    {
        string s_ipaddress0 = textBox1.Text;
        string s_ipaddress1 = textBox2.Text;
        string s_ipaddress2 = textBox3.Text;
        string s_ipaddress3 = textBox4.Text;
        string s_port = textBox5.Text;

        //限定port的合法性
        bool isPort;
        int port;
        isPort = Int32.TryParse(s_port, out port);
        if (!(isPort && port >= 0 && port <= 65536))
        {
            OutToClient("Port is Invalid!");
            return;
        }

        //限定ip地址的合法性
        string host = s_ipaddress0 + "." + s_ipaddress1 + "." + s_ipaddress2 + "." + s_ipaddress3;
        if (!IsIpAdress(host))
        {
            OutToClient("IpAdress is invaild!");
            return;
        }
        IPAddress ip = IPAddress.Parse(host);
        IPEndPoint ipe = new IPEndPoint(ip, port); //Ip端口绑定 如192.168.1.48:80

        //发送框不能为空, 不然会导致GetBytes出错
        if (textBox6.Text == "")
        {
            OutToClient("Send Text is empty!");
            return;
        }

        OutToClient("Conneting...");

        int timeout = 1000;

        //tcpClient连接到指定端口,并处理超时
        TcpClient NetworkClient = TimeOutSocket.Connect(ipe, timeout);
        NetworkStream ntwStream = NetworkClient.GetStream();
        if (!ntwStream.CanWrite)
        {
            OutToClient("Data can not be write!");
            return;
        }

        //向绑定地址端口发送数据
        OutToClient("Client send:" + textBox6.Text);
        string sendStr = textBox6.Text;
        byte[] by_send = Encoding.ASCII.GetBytes(sendStr);
        ntwStream.Write(by_send, 0, by_send.Length);

        //等待服务器端返回数据
        string recvStr = "";
        byte[] recvBytes = new byte[4096];
        int bytes = ntwStream.Read(recvBytes, 0, recvBytes.Length);

        //将接收到数据转发输出到Client编辑框
        recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
        OutToClient(recvStr);

        //关闭连接, 一次发送完成
        ntwStream.Close();
        NetworkClient.Close();
        OutToClient("Conneting Close!\r\n");
    }
    catch (ArgumentNullException ii)
    {
        OutToClient("ArgumentNullException: "+ ii);
    }
    catch (SocketException ii)
    {
        OutToClient("Socket failed! ");
    }
    catch (Exception ii)
    {
        OutToClient("Conneting faild!" + ii);
    }
}

  服务器内的代码涉及到的知识多一些(因为初学C#,没有理解委托,所以用线程方式处理)

1.通过按键1开辟监听线程,用于接收

2.监听线程创建Socket套接字,绑定到指定端口并监听

3.监听线程堵塞在等带连接建立

4.连接建立后监听线程读取客户端数据并回送给客户端处理后数据,然后循环堵塞在连接建立

5.通过按键2删除Socket套接字触发异常,结束线程(不知道怎么处理,只能用比较low的方法)

按照上述的流程,程序如下:

//新建线程 开始监听
private void button1_Click(object sender, EventArgs e)
{
    try
    {
        isConnectExit = false;
        button1.Enabled = false;
        button2.Enabled = true;

        Thread Listen_thread = new Thread(ListenClientConnect);
        Listen_thread.IsBackground = true;
        Listen_thread.Start();
    }
    catch (Exception ii)
    {
        OutToServer("Connet faild!" + ii);
    }
}
//监听线程 主要处理数据接收发送
private void ListenClientConnect(object obj)
{
    string s_ipaddress0 = textBox1.Text;
    string s_ipaddress1 = textBox2.Text;
    string s_ipaddress2 = textBox3.Text;
    string s_ipaddress3 = textBox4.Text;
    string s_port = textBox5.Text;

    //限定port的合法性
    bool isPort;
    int port;
    isPort = Int32.TryParse(s_port, out port);
    if (!(isPort && port >= 0 && port <= 65536))
    {
        OutToServer("Port is Invalid!");
        return;
    }

    //限定ip地址的合法性
    string host = s_ipaddress0 + "." + s_ipaddress1 + "." + s_ipaddress2 + "." + s_ipaddress3;
    if (!IsIpAdress(host))
    {
        OutToServer("IpAdress is invaild!");
        return;
    }

    IPAddress ip = IPAddress.Parse(host);
    IPEndPoint ipe = new IPEndPoint(ip, port);

    //新建socket通讯 绑定指定IP+Port 并监听
    server_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    server_socket.Bind(ipe);
    server_socket.Listen(10);

    OutToServer("wait for connect...");
    while (isConnectExit == false)
    {
        Socket CurrentSocket;
        try
        {
            //等待连接 完成三次握手
            CurrentSocket = server_socket.Accept();
            if(isConnectExit == true)
            {
                CurrentSocket.Close();                     // 关闭Socket
                server_socket.Close();
                break;
            }
            OutToServer("Get a Connect!");
            ServerProcess(CurrentSocket);
        }
        catch
        {
            OutToServer("Connet exti!");
        }
    }
}
//断开连接
private void button2_Click(object sender, EventArgs e)
{
    isConnectExit = true;
    button2.Enabled = false;
    button1.Enabled = true;
    if (server_socket != null)
    {
        server_socket.Close();
    }
}

如此就完成了简单的C/S服务器功能。

实际测试界面如下:

具体源码参考:http://files.cnblogs.com/files/zc110747/socket.7z

时间: 2024-07-31 13:09:55

TCP/IP协议详解(二) 基于C# Socket的C/S模型建立的相关文章

TCP/IP协议详解

OSI通信协议模型(Open System Interconnection) OSI(开放系统互连)通信协议模型是一个多层的通信协议,由国际标准化组织ISO提出.所谓的开放系统是指允许任意两个具有不同基本体系结构的系统进行通信的一套协议集.理论上,OSI允许任意两台计算机实现通信.OSI模型将网络划分为7层模型: OSI模型中每一层只和紧邻的上下两层通信,高层协议偏重于处理用户服务和各种应用请求,底层协议偏重于处理实际的信息传输.分层的目的在于把各种特定的功能分离开来,各个层次相对独立. TCP

TCP/IP 协议详解内容总结

TCP/IP 协议详解内容总结 TCP/IP协议 TCP/IP不是一个协议,而是一个协议族的统称.里面包括IP协议.IMCP协议.TCP协议. http://blog.jobbole.com/91841/

TCP/IP 协议详解

1.主机到网络层协议:以太网协议 2.IP协议 3.网际控制报文协议(ICMP) 4.传输控制协议(TCP) 5.用户数据报文协议(UDP) 6.流控制传输协议(SCTP) 7.地址解析协议(ARP) 联网的各个终端之间能否进行交互的软件基础是网络协议栈,目前主流的网络协议栈是TCP/IP协议栈. 1.主机到网络层协议:以太网协议 主机到网络层主要为IP协议和ARP协议提供服务.发送和接收网络数据报.本层中由于要实现跨网和跨设备的互通,有很多的实现方式,这里我们只关注以太网的实现方式. 以太网是

TCP/IP 协议详解和运作过程

一.TCP/IP协议族 TCP/IP协议族体系结构及主要协议.png 1.数据链路层 ARP协议和RARP协议,它们实现了IP地址和机器物理地址之间的相互转化 ARP协议(Address Resolve Protocol,地址解析协议) RARP协议(Reverse Address Resolve Protocol,逆地址解析协议) 作用:网络层是用IP地址寻址一台机器,而数据链路层是用物理地址寻址一台机器,因此网络层必须先将目标机器的IP地址转化成其物理地址,这就是ARP协议的用途.RARP协

TCP/IP协议详解内容总结

TCP/IP协议 TCP/IP不是一个协议,而是一个协议族的统称.里面包括IP协议.IMCP协议.TCP协议. TCP/IP分层: 这里有几个需要注意的知识点: 互联网地址:也就是IP地址,一般为网络号+子网号+主机号 域名系统:通俗的来说,就是一个数据库,可以将主机名转换成IP地址 RFC:TCP/IP协议的标准文档 端口号:一个逻辑号码,IP包所带有的标记 Socket:应用编程接口 数据链路层的工作特性: 为IP模块发送和接收IP数据报 为ARP模块发送ARP请求和接收ARP应答(ARP:

TCP/IP协议详解内容总结(怒喷一口老血)

TCP/IP协议 TCP/IP不是一个协议,而是一个协议族的统称.里面包括IP协议.IMCP协议.TCP协议. TCP/IP分层: 这里有几个需要注意的知识点: 互联网地址:也就是IP地址,一般为网络号+子网号+主机号 域名系统:通俗的来说,就是一个数据库,可以将主机名转换成IP地址 RFC:TCP/IP协议的标准文档 端口号:一个逻辑号码,IP包所带有的标记 Socket:应用编程接口 数据链路层的工作特性: 为IP模块发送和接收IP数据报 为ARP模块发送ARP请求和接收ARP应答(ARP:

《TCP/IP协议详解 卷1》 第二章 Internet 地址结构

Internet 地址结构 连接到Internet的每个设备至少要有一个IP地址.基于TCP/IP协议的专用网络中使用的设备也需要IP地址. 表示IP地址 IPv4地址: 32bit 采用点分四组或者点分十进制表示.例如165.195.130.105 IPv6地址: 128bit 采用块或字段的四个十六位进制数表示.例如5f05:2000:80ad:5800:0058:0800:2023:1d71 该表示方法有以下共识: 块前导0必须省略,如上面的地址可以写成5f05:2000:80ad:580

TCP/IP学习笔记(3)-----------TCP/IP协议详解

1.TCP/IP协议栈 四层模型 TCP/IP这个协议遵守一个四层的模型概念:应用层.传输层.互联层和网络接口层. 网络接口层 模型的基层是网络接口层.负责数据帧的发送和接收,帧是独立的网络信息传输单元.网络接口层将帧放在网上,或从网上把帧取下来. 互联层 互联协议将数据包封装成internet数据报,并运行必要的路由算法. 这里有四个互联协议: 网际协议IP:负责在主机和网络之间寻址和路由数据包. 地址解析协议ARP:获得同一物理网络中的硬件主机地址. 网际控制消息协议ICMP:发送消息,并报

TCP/IP协议详解——邮差与邮局

信号的传输总要符合一定的协议.比如说长城上放狼烟,是因为人们已经预先设定好狼烟这个物理信号代表了“敌人入侵”这一抽象信号.这样一个“狼烟=敌人入侵”就是一个简单的协议. 信号的传输总要符合一定的协议(protocol).比如说长城上放狼烟,是因为人们已经预先设定好狼烟这个物理信号代表了“敌人入侵”这一抽象信号.这样一个“狼烟=敌人入侵”就是一个简单的协议.协议可以更复杂,比如摩尔斯码(Morse Code),使用短信号和长信号的组合,来代表不同的英文字母.比如SOS(***—***, *代表短信