戏说TCP网络编程

1、何为TCP
? ?? ???既然说到TCP协议网络编程,那么首先来了解下什么是TCP协议。
TCP协议的全称叫Transmission Control Protocol 传输控制协议,
是一种面向连接的、可靠的、基于字节流的传输层通信协议。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上。
? ?? ???面向连接是什么呢?面向连接可以理解为指定对象,就好像平时打电话一样,你要打电话需要电话号码,也就是需要指定打电话的对象;可靠就简单了,就是在传输的过程中不会受到外界因素的印象;基于字节流也就是在传输数据的过程中是通过字节流来完成的。
2、与兄弟UDP区别
? ?? ???TCP协议有个兄弟叫UDP,那么怎么又来了个UDP呢?UDP可以认为是区别于TCP的存在的。刚才说TCP类似于打电话,那么UDP就类似于广播;TCP需要先连接才可以传数据,而UDP是广播,也就是说我只管发送数据,不管你到底有没有接收到,所以TCP是可靠的,UDP是不可靠的;如果按照人物性格区分的话,那么TCP就可以认为是一个内向的,而UDP是一个外向的。
3、初入门-TCP编程初窥
? ?? ???说了这么多,开始咱们今天的主要内容吧,首先咱们来看一下TCP网络编程的使用步骤吧。
还拿打电话来说,那么咱们打电话时候都是什么步骤呢?首先,准备好要拨打的电话号码,然后拨打电话后等待对方接通,当对方接通之后,就可以进行通话了。那么咱们拿拨打方称为客户端,被叫方称为服务端,就可以来整理TCP的步骤了,首先咱们需要准备一个IP地址(被叫电话号码),使用InetAddress类来处理;既然是拨打就需要准备电话了,使用Socket来处理,然后等待服务端(被叫方)接通,同样需要对应的类ServerSocket来处理;当连接(接通)后开始传输数据(通话),就用到字节流了。
? ?? ?? ?那么,下面咱们开始代码作业了:
首先是客户端代码(只复制方法内容):

?try?{
? ?? ?? ?? ?? ?? ?? ?? ?//准备要访问的服务器IP地址(也就是要拨打的电话号码,以本地ip为例)
? ?? ?? ?? ?? ?? ?? ?? ?InetAddress ia = InetAddress.getByName("127.0.0.1");
? ?? ?? ?? ?? ?? ?? ?? ?//创建Socket对象(电话机),需要制定端口号,8806就是端口号(端口号相当于分机)
? ?? ?? ?? ?? ?? ?? ?? ?Socket?s?=?new?Socket(ia, 8806);
? ?? ?? ?? ?? ?? ?? ?? ?//准备要传输的数据,(要通话的内容)
? ?? ?? ?? ?? ?? ?? ?? ?String data="Hello,I am TCP !";
? ?? ?? ?? ?? ?? ?? ?? ?//因为是基于字节流的,所以需要把字符串转换为字节数组
? ?? ?? ?? ?? ?? ?? ?? ?byte[] bytes = data.getBytes();
? ?? ?? ?? ?? ?? ?? ?? ?//创建输出流对象
? ?? ?? ?? ?? ?? ?? ?? ?OutputStream out = s.getOutputStream();
? ?? ?? ?? ?? ?? ?? ?? ?//传输数据(说出通话内容)
? ?? ?? ?? ?? ?? ?? ?? ?out.write(bytes);
? ?? ?? ?? ?? ?? ?? ?? ?out.flush();
? ?? ?? ?? ?? ? }?catch?(UnknownHostException e) {
? ?? ?? ?? ?? ?? ?? ?? ?e.printStackTrace();
? ?? ?? ?? ?? ? }?catch?(IOException e) {
? ?? ?? ?? ?? ?? ?? ?? ?e.printStackTrace();
? ?? ?? ?? ?? ? }
————————————————

接着是服务端代码(只复制方法内容):

try?{
? ?? ?? ?? ?? ?? ?? ?? ?//创建服务端ServerSocket对象
? ?? ?? ?? ?? ?? ?? ?? ?ServerSocket?ss?=??new?ServerSocket(8806);
? ?? ?? ?? ?? ?? ?? ?? ?//等待连接(等待别人拨打这个号码),当有人连接时返回连接socket对象
? ?? ?? ?? ?? ?? ?? ?? ?Socket s = ss.accept();
? ?? ?? ?? ?? ?? ?? ?? ?//通过获取到的连接Socket对象来获取包含客户端发送数据的输入流对象
? ?? ?? ?? ?? ?? ?? ?? ?InputStream in = s.getInputStream();
? ?? ?? ?? ?? ?? ?? ?? ?//创建放置数据的缓冲区
? ?? ?? ?? ?? ?? ?? ?? ?byte[] bys =?new?byte[1024];
? ?? ?? ?? ?? ?? ?? ?? ?//读取客户端发送的数据
? ?? ?? ?? ?? ?? ?? ?? ?int?length = in.read(bys);
? ?? ?? ?? ?? ?? ?? ?? ?//输出到控制台
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???System.out.println("客户端 :" + new? ?? ?? ?? ?? ?? ?? ?? ? String(bys,0,length));? ?? ?? ?? ?? ?
? ?? ???}?catch?(IOException e) {
? ?? ?? ?? ?? ?? ?? ?? ?e.printStackTrace();
? ?? ?? ?? ?? ? }

接着就是见证奇迹的时刻,我们一起来看运行结果吧,需要注意:一定要先运行服务端的代码,然后运行客户端的代码。

4、进击篇-TCP客户端和服务端互通数据
上文提到的只是客户端向服务端发送数据,那么咱们能不能让它们之间进行数据相互传送呢?刚才说了,TCP是面向连接的,基于字节流的,所以当连接建立好以后,我们只管将数据通过字节流进行传输就可以了。
进击的客户端代码(只复制方法内容):

try?{
? ?? ?? ?? ?? ?? ?? ?? ?//准备要访问的服务器IP地址(也就是要拨打的电话号码)
? ?? ?? ?? ?? ?? ?? ?? ?InetAddress ia = InetAddress.getByName("127.0.0.1");
? ?? ?? ?? ?? ?? ?? ?? ?//创建Socket对象(电话机),需要制定端口号,8806就是端口号(端口号相当于分机)
? ?? ?? ?? ?? ?? ?? ?? ?Socket?s?=?new?Socket(ia, 8806);
? ?? ?? ?? ?? ?? ?? ?? ?//准备要传输的数据,(要通话的内容)
? ?? ?? ?? ?? ?? ?? ?? ?String data="Hello,I am TCP !";
? ?? ?? ?? ?? ?? ?? ?? ?//因为是基于字节流的,所以需要把字符串转换为字节数组
? ?? ?? ?? ?? ?? ?? ?? ?byte[] bytes = data.getBytes();
? ?? ?? ?? ?? ?? ?? ?? ?//创建输出流对象
? ?? ?? ?? ?? ?? ?? ?? ?OutputStream out = s.getOutputStream();
? ?? ?? ?? ?? ?? ?? ?? ?//输出电话内容
? ?? ?? ?? ?? ?? ?? ?? ?out.write(bytes);
? ?? ?? ?? ?? ?? ?? ?? ?out.flush();
? ?? ?? ?? ?? ?? ?? ?? ?//从连接的Socket对象中获取输入流
? ?? ?? ?? ?? ?? ?? ?? ?InputStream inputStream = s.getInputStream();
? ?? ?? ?? ?? ?? ?? ?? ?byte[] bys =?new?byte[1024];
? ?? ?? ?? ?? ?? ?? ?? ?//读取服务端发送的数据
? ?? ?? ?? ?? ?? ?? ?? ?int?length = inputStream.read(bys);
? ?? ?? ?? ?? ?? ?? ?? ?//输出到控制台
? ?? ?? ?? ?? ?? ?? ?? ?System.out.println("服务端 :" +?new?String(bys,0,length));
? ?? ?? ?? ?? ? }?catch?(UnknownHostException e) {
? ?? ?? ?? ?? ?? ?? ?? ?e.printStackTrace();
? ?? ?? ?? ?? ? }?catch?(IOException e) {
? ?? ?? ?? ?? ?? ?? ?? ?e.printStackTrace();
? ?? ?? ?? ?? ? }
—

同样的服务端代码(只复制方法内容):

try?{
? ?? ?? ?? ?? ?? ?? ?? ?//创建服务端ServerSocket对象
? ?? ?? ?? ?? ?? ?? ?? ?ServerSocket?ss?=??new?ServerSocket(8806);
? ?? ?? ?? ?? ?? ?? ?? ?//等待连接(等待别人拨打这个号码),当有人连接时返回连接socket对象
? ?? ?? ?? ?? ?? ?? ?? ?Socket s = ss.accept();
? ?? ?? ?? ?? ?? ?? ?? ?//通过获取到的连接Socket对象来获取包含客户端发送数据的输入流对象
? ?? ?? ?? ?? ?? ?? ?? ?InputStream in = s.getInputStream();
? ?? ?? ?? ?? ?? ?? ?? ?//创建放置数据的缓冲区
? ?? ?? ?? ?? ?? ?? ?? ?byte[] bys =?new?byte[1024];
? ?? ?? ?? ?? ?? ?? ?? ?//读取客户端发送的数据
? ?? ?? ?? ?? ?? ?? ?? ?int?length = in.read(bys);
? ?? ?? ?? ?? ?? ?? ?? ?//输出到控制台
? ?? ?? ?? ?? ?? ?? ?? ?System.out.println("客户端 :" +?new?String(bys,0,length));
? ?? ?? ?? ?? ?? ?? ?? ?//准备要传输的数据,(要通话的内容)
? ?? ?? ?? ?? ?? ?? ?? ?String data="Hello,I am server !";
? ?? ?? ?? ?? ?? ?? ?? ?//因为是基于字节流的,所以需要把字符串转换为字节数组
? ?? ?? ?? ?? ?? ?? ?? ?byte[] bytes = data.getBytes();
? ?? ?? ?? ?? ?? ?? ?? ?//创建输出流对象
? ?? ?? ?? ?? ?? ?? ?? ?OutputStream out = s.getOutputStream();
? ?? ?? ?? ?? ?? ?? ?? ?//输出电话内容
? ?? ?? ?? ?? ?? ?? ?? ?out.write(bytes);
? ?? ?? ?? ?? ?? ?? ?? ?out.flush();
? ?? ?? ?? ?? ? }?catch?(IOException e) {
? ?? ?? ?? ?? ?? ?? ?? ?e.printStackTrace();
? ?? ?? ?? ?? ? }

再一次见证奇迹:
服务端

客户端

需要说明的是,咱们演示的只是获取一次数据,不管是客户端和服务端都是发送和获取都是一次。在现实生活中,打电话不会是双方直说一句话,所以需要注意,如果要达到这个效果的话,我们需要使用循环来包裹字节输入输出流部分的代码就搞定了。

原文地址:https://blog.51cto.com/14473726/2440458

时间: 2024-10-01 04:50:26

戏说TCP网络编程的相关文章

Java - TCP网络编程

Java - TCP网络编程 Server 逻辑思路: 创建ServerSocket(port),然后服务器的socket就启动了 循环中调用accept(),此方法会堵塞程序,直到发现用户请求,返回用户的socket 利用多线程对用户socket进行IO操作 注意:对Scoket/File进行创建.关闭,都需要放try catch中,检测 IOException,所以将网络IO部分整体放入try catch中即可. 1. 字符串操作 输出:PrintWriter out=new PrintWr

Linux下TCP网络编程与基于Windows下C#socket编程间通信

一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使socket处于被动的监听模式,并为该  socket  建立一个输入数据队列,将到达的服务器, 请求保存在此队列中,直到程序处理他们. Accept():让服务器接收客户的连接请求. Connect():客户端使用connect函数来配置 socket并与远端服务器建立一个 TCP 连接. Clos

Linux下TCP网络编程与基于Windows下C#socket编程之间通信

一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使socket处于被动的监听模式,并为该  socket  建立一个输入 数据队列,将到达的服务器, 请求保存在此队列中,直到程序处理他们. Accept():让服务器接收客户的连接请求. Connect():客户端使用connect函数来配置 socket并与远端服务器建立一个 TCP 连接. Clo

JAVA学习之TCP网络编程,Socket使用

ServerSocket 此类实现服务器套接字. ServerSocket常用的构造方法有以下几个, ServerSocket() 创建非绑定服务器套接字. ServerSocket(int port) 创建绑定到特定端口的服务器套接字. ServerSocket(int port, int backlog) 利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号. ServerSocket(int port, int backlog, InetAddress bindAddr

Java笔记二十四.TCP网络编程

 TCP网络编程 转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 从上面一节内容可以知道,利用UDP通信的两个程序是平等的,无主次之分,两个程序代码可以完全一样.但利用TCP协议进行通信的两个应用程序,是有主从之分的,一个称为服务器程序,另外一个称为客户机程序.Java中提供了ServerSocket类用于创建服务器端的socket,Socket类用于创建客户端socket. 一.APIs简介 java.net.ServerSocket (1

TCP网络编程中connect()、listen()和accept()三者之间的关系

基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: connect()函数 对于客户端的 connect() 函数,该函数的功能为客户端主动连接服务器,建立连接是通过三次握手,而这个连接的过程是由内核完成,不是这个函数完成的,这个函数的作用仅仅是通知 Linux 内核,让 Linux 内核自动完成 TCP 三次握手连接(三次握手详情,请看<浅谈 TCP 三次握手>),最后把连接的结果返回给这个函数的返回值(成功连接为0, 失败为-1). 通常的情况,客户端的 c

TCP网络编程学习小结

TCP协议是TCP/IP协议族中的一个十分重要的名字(看到TCP/IP这个名字就知道TCP有多重要了),同时也是一个十分复杂的协议,在使用这个协议的时候可能会带来很多问题,这使得使用的程序员会十分头大.如果想了解TCP协议的细节,可以参考<TCP/IP详解1:协议>.闲话不多说,我们进入正题: 一.报文头 首先我们来看一下TCP协议的报文头: TCP是传输层协议,其报文头并不包含TP地址,IP地址会在IP层添加,当然,IP层处于TCP的下层,IP层的报文内容就是TCP报文. TCP/IP协议网

TCP网络编程杂谈

作为一名IT工程师,网络通信编程相信都会接触到,比如Web开发的HTTP库,Java中的Netty,或者C/C++中的Libevent,Libev等第三方通信库,甚至是直接使用Socket API,但是很多程序员都仅限于使用,对于使用的方式是否合理并没有特别深的理解,比如有一股脑的使用线程池解决问题的(虽然大部分情况采用多线程方案不会有什么问题,但是编程复杂度比起单线程提升了很多,线程开的太多也会导致切换过于频繁,性能未必有太大提升),也有始终用一条线程处理所有业务的,然后上线之后经常出现各种服

Qt基于TCP网络编程

TCP(传输控制协议 Transmission Control Protocol) 可靠.面向数据流.面向连接  的传输协议.(许多应用层协议都是以它为基础:HTTP.FTP) 使用情况: 相比UDP无连接,TCP是面向连接 相比UDP不可靠,TCP是可靠传输 相比UDP不提供流量控制,TCP是提供 相比UDP适用少量数据传输,TCP是大量数据 相比UDP速度快,TCP是慢 适用:对可靠性要求高的数据通信系统. 工作原理: TCP客户端与服务器在正式发送数据前,双方需要经过三次握手后建立连接.