zoukankan      html  css  js  c++  java
  • 利用TCP协议,实现基于Socket的小聊天程序(初级版)

    TCP

    TCP (Transmission Control Protocol)属于传输层协议。其中TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用。通过面向连接、端到端和可靠的数据包发送。通俗说,TCP支持的应用协议主要有:Telnet、FTP、SMTP等

    TCP是面向对象的连接,是安全可靠的,是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂,我 们这里只做简单、形象的介绍,你只要做到能够理解这个过程即可。我们来看看这三次对话的简单过程:主机A向主机B发出连接请求数据包:“我想给你发数据, 可以吗?”,这是第一次对话;主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:“可以,你什么时候 发?”,这是第二次对话;主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”,这是第三次对话。三次“对话”的目的是使数据包的发 送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。

    首先我们来看看用TCP实现聊天程序

    实现聊天程序我们需要一个服务端一个客户端来模拟实现,我们首先来建立服务器端,直接贴代码,如下:

    复制代码
     1            //首先建立一个套接字(服务器端)
     2             Socket socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
     3             //将套接字绑定到本地的IP和端口
     4             IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 9999);
     5             //绑定套接字
     6             socketServer.Bind(endPoint);
     7             //输出语句 服务已经启动
     8             Console.WriteLine("=====TCP Server Is OK======  ===IP:" + endPoint.Address + "  Port:" + endPoint.Port+"===");
     9             //开始监听
    10             socketServer.Listen(10);
    11             //接受消息并返回的新的套接字对象
    12             Socket sk = socketServer.Accept();
    复制代码

    简要介绍下个别变量,方法的作用:

    socketServer:实例化一个服务端的Socket实例

    endPoint:网络终结点,定义了IP和Port

    Bind方法:用于将Socket实例绑定到该网络终结点上

    Listen方法:监听端口,参数为监听序列的长度,Listen是一个连接尝试,可以让一个面向连接的 Socket 侦听传入.

    Accept方法:接受通信,返回一个新的Socket对象,然后之后的通信就交由该新的对象来进行,socketServer就相当于公司的前台,只负责接待,具体的事务是通过它交由其他人来执行(个人理解)

    然后是服务器端接受数据的代码,如下:


    服务器端接受数据
                //接受数据

                //新建一个字节数组
                byte[] recveMsg=new byte[1024*1024];
                //使用receive方法接受发送到服务器端的数据
                int bytes = sk.Receive(recveMsg,SocketFlags.None);
                //将数据进行编码
                string receive = System.Text.Encoding.UTF8.GetString(recveMsg, 0, bytes);
                //将信息打印到控制台
                Console.WriteLine(receive);

    简要解释下个别变量的作用:

    recveMsg:这是一个字节数组,因为在接受数据时,我们需要将接收到的数据存放到字节数组中,所以我们要首先定义一个字节数组,这里我给了它1024*1024的大小

    bytes:这是一个int型变量,作用就是用来接收Socket用Receive接受到数据的实际长度,但为什么我们需要这个变量呢,因为在后一行代码中,我们需要将字节数组转换为字符串来进行输出,如果没有这个变量来定义大小,我们每次都会把1024*1024的字节长度转换成字符串,所以往往有时候接收到的长度没有1024*1024大小,

    因此会造成无用的转换。

    然后就是发送数据,贴上代码:

    服务器端发送数据
                //发送数据

                //实例化发送的信息
                string message="Hello Clinet,My Name Is HolyKnight_Server";
                //将字符串转换成字节数组
                byte[] sendMsg = System.Text.Encoding.UTF8.GetBytes(message);
                //发送数据
                int sendBytes = sk.Send(sendMsg, SocketFlags.None);

                //关闭套接字
                socketServer.Close();

                Console.ReadKey();

    简要的解释下个别变量的作用:

    message:这个很显然,我们用message定义了一个字符串,来模拟要发送的数据

    sendMsg:刚上面说了,接受数据时我们会用一个字节数组来接受,然后将数据存到该数组中,同理,发送也一样,发送的数据也要求是字节数组,所以我们同样定义一个字节数组来存放要发送的数据。

    sendBytes:同样一个int型的变量,来接受Socket用Send发送数据的实际长度(大小)。

    好,这样呢,我们的服务器端就搭建好了,这时我们需要一个客户端,所以下面我们来创建客户端

    同样,首先也要新建一个Socket,并绑定IP和Port,再连接到远程主机,代码如下:

    1             //新建一个套接字(客户端)
    2             Socket socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    3             //设置与远程主机连接的网络节点
    4             IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9999);
    5             //与远程主机建立连接
    6             socketClient.Connect(endPoint);

     简要解释下个别变量,方法的作用:

    socketClient:实例化一个客户端的Socket对象

    endPoint:网络终结点,这里用了127.0.0.1这个IP地址(回环地址),端口号必须和服务器端的相同

    Connect方法:已经定义好了Socket对象和网络终结点了,这里就用Connect方法来实现和远程主机建立连接了

    同样客户端也要进行发送和接受数据,由于两个方法和服务器端端的收发数据方法一致,这里就不再重复赘述了,直接贴上代码:

    发送数据:

    1             //发送数据
    2             string sendMsg = "Hello Server,My Name Is HolyKnight_Client";
    3             byte[] sendBytes = System.Text.Encoding.UTF8.GetBytes(sendMsg);
    4             int bytes = socketClient.Send(sendBytes, SocketFlags.None);

    接受数据:

    1             //接受数据
    2             byte[] receiveMsg = new byte[1024 * 1024];
    3             int receiveBytes = socketClient.Receive(receiveMsg, SocketFlags.None);
    4             string Message = System.Text.Encoding.UTF8.GetString(receiveMsg, 0, receiveBytes);
    5             Console.WriteLine(Message);

     这样,我们的客户端也就搭建好了,所以至此,我们的小聊天程序的客户端和服务器端都搭建完毕,可以来运行看效果了,运行时,我们必须首先运行服务器端,然后再开启客户端进行远程连接,首先开启服务器端:显示【TCP Server Is OK】并显示了IP和Port,表示服务器端服务已成功开启,图如下:

     接下来运行客户端程序,客户端已开启就会连上服务器端,并接受到服务器发送过来的数据,运行效果如图:

     

    此时,服务器端也应该接受到了来自客户端的数据,查看,果然收到了数据,如图:

    至此,一个基于TCP的Socket的简单通信就完成了。
  • 相关阅读:
    【codeforces 785B】Anton and Classes
    【codeforces 785C】Anton and Fairy Tale
    【t003】string
    【BZOJ 1028】[JSOI2007]麻将
    【t011】最小覆盖子串
    【BZOJ 1029】[JSOI2007]建筑抢修
    cgb2008-京淘day02
    抽象类与接口概念及代码实例
    【hihocoder 1296】数论三·约瑟夫问题
    【hihocoder 1295】Eular质数筛法
  • 原文地址:https://www.cnblogs.com/haxianhe/p/9271274.html
Copyright © 2011-2022 走看看