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======\r\n ===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的简单通信就完成了。

利用TCP协议,实现基于Socket的小聊天程序(初级版)的更多相关文章

  1. 网络编程(二)——TCP协议、基于tcp协议的套接字socket

    TCP协议与基于tcp协议的套接字socket 一.TCP协议(流式协议) 1.可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的 ...

  2. Ubuntu利用TCP协议来获取server时间

    Linux利用TCP协议来获取server时间 这里使用Unix网络编程里面的一个小程序,该client建立一个到server的TCP连接,然后读取由server以直观可读格式简单地送回的当前时间和日 ...

  3. tcp协议下的Socket

    import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net ...

  4. Socket网络编程--聊天程序(9)

    这一节应该是聊天程序的最后一节了,现在回顾我们的聊天程序,看起来还有很多功能没有实现,但是不管怎么说,都还是不错的.这一节我们将讲多服务器问题(高大上的说法就是负载问题了.)至于聊天程序的文件发送(也 ...

  5. 基于Tcp协议的简单Socket通信实例(JAVA)

    好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~ 今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些网络编程的基础,这里就不提了,只记录最简单易懂实用的东西. ...

  6. 网络编程(二)--TCP协议、基于tcp协议的套接字socket

    一.TCP协议(Transmission Control Protocol 传输控制协议) 1.可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会 ...

  7. tcp连接是基于socket通信的吗

    https://zhidao.baidu.com/question/1305788160020716299.html ------ 网络七层协议 五层模型 TCP连接 HTTP连接 socket套接字 ...

  8. Java---基于TCP协议的相互即时通讯小程序

    这是几年前,新浪的一个面试题~要求是3天之内实现~ 通过TCP 协议,建立一个服务器端. 通过配置服务器端的IP和端口: 客户端之间就可以相互通讯~ 上线了全部在线用户会收到你上线的通知. 下线了全部 ...

  9. 基于Socket的UDP发包程序

    UDP(User Datagram Protocol,用户数据报协议)是在互联网中常用的传输层协议,该协议提供了向另一用户程序发送的消息的最简便的协议机制.与TCP一样,其默认的下层协议是IP.UDP ...

随机推荐

  1. 如何在Qt中处理(接收/发送)MFC或Windows消息(直接覆盖MainDialog::nativeEvent,或者QApplication::installNativeEventFilter安装过滤器,或者直接改写QApplication::nativeEventFilter)

    关于接收: Receive WM_COPYDATA messages in a Qt app. 还有个中文网站: 提问: 如何在Qt中模拟MFC的消息机制 关于发送: 用Qt在Windows下编程,如 ...

  2. Hadoop集群(第3期)机器信息分布表

    1.分布式环境搭建 采用4台安装Linux环境的机器来构建一个小规模的分布式集群. 图1 集群的架构 其中有一台机器是Master节点,即名称节点,另外三台是Slaver节点,即数据节点.这四台机器彼 ...

  3. .NET程序员如何快入门Spring Boot

    本篇文章将教你作为一个.NET程序员如何快入门Spring Boot.你不需要用Eclipse,也不需要用IDEA.已经习惯了VS,其他的IDE-- 但不得不说VS Code很厉害,一用就喜欢.微软给 ...

  4. SpringBoot(十九)_spring.profiles.active=@profiles.active@ 的使用

    现在在的公司用spring.profiles.active=@profiles.active@ 当我看到这个的时候,一脸蒙蔽,这个@ 是啥意思. 这里其实是配合 maven profile进行选择不同 ...

  5. 节能减排到底如何----google earth engine 告诉你!!

    (First,再次严谨说明,本人成果未经允许,切勿发表到相关学术期刊,如果有技术交流,qq1044625113,顺便打个广告,兼职GEE开发,欢迎联系!) 终于过了严寒的冬天,2017年的冬天中国南方 ...

  6. never下sqlcient

    [一]参数的输入 如执行update,我们写的代码应该是 sqlclient.Update(,, },@Name = "eee" }): 表示更新Id =1,2,3这三行的信息.这 ...

  7. CQRS之旅——旅程7(增加弹性和优化性能)

    旅程7:增加弹性和优化性能 到达旅程的终点:最后的任务. "你不能飞的像一只长着鹪鹩翅膀的老鹰那样."亨利·哈德逊 我们旅程的最后阶段的三个主要目标是使系统对故障更具弹性,提高UI ...

  8. Android短视频中如何实现720P磨皮美颜录制?

    视频中磨皮.美颜功能已成为刚需,那么如何在Android短视频中实现720P磨皮美颜录制?本篇文章中,网易云信资深开发工程师将向大家介绍具体的操作方法. 相关阅读推荐 <短视频技术详解:Andr ...

  9. javaWeb 概念介绍

    一.javaWeb 1.概念:利用java语言进行基于互联网的开发 2.软件架构 (1)C/S   Client/Server  客户端/服务器端 在用户本地有一个客户端程序,在远程有一个服务器程序 ...

  10. Java学习笔记——Linux下安装配置tomcat

    朝辞白帝彩云间,千里江陵一日还. 两岸猿声啼不住,轻舟已过万重山. ——早发白帝城 首先需要安装配置JDK,这里简单回顾下.Linux下用root身份在/opt/文件夹下创建jvm文件夹,然后使用ta ...