TCP协议

  • 传输控制协议(Transmission Control Protocol)
  • TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。在TCP连接中必须要明确客户端与服务器端,由客户端向服务器发出连接请求,每次连接的创建都需要经过“三次握手

三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠

  • 第1次握手,客户端向服务器发出连接请求,等待服务器确认
  • 第2次握手,服务器向客户端回送一个响应,通知客户端收到了连接请求
  • 第3次握手,客户端再次向服务器发送确认信息,确认连接

完成三次握手,建立连接后,客户端和服务器就可以开始进行数据传输了。由于这种面相连接的特性,TCP协议可以保证 数据传输的安全,所以应用十分广泛。例如上传文件,下载文件,浏览网页等。

废话少说,直接放客户端的代码

package com.wangLuo;import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;/*** @author 林高禄* @create 2020-06-01-10:24*/
public class TCPClient {public static void main(String[] args) throws IOException {Socket s = new Socket("192.168.1.55",10);OutputStream os = s.getOutputStream();byte[] bys = "TCP客户端写入数据,好好学习,努力提升!".getBytes();os.write(bys);s.close();}
}

运行报一下错

Exception in thread "main" java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at java.net.Socket.connect(Socket.java:538)
    at java.net.Socket.<init>(Socket.java:434)
    at java.net.Socket.<init>(Socket.java:211)
    at com.wangLuo.TCPClient.main(TCPClient.java:13)

这是因为我们还没有接收端,接收端还没有运行,因为TCP协议是要先建立连接,再发送数据

下面就直接放接收端的代码

package com.wangLuo;import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;/*** @author 林高禄* @create 2020-06-01-10:28*/
public class TCPServer {public static void main(String[] args) throws IOException {ServerSocket ss = new ServerSocket(10);Socket s = ss.accept();InputStream is = s.getInputStream();byte[] bys = new byte[3];int len;while((len = is.read(bys)) != -1){System.out.print(new String(bys,0,len));}ss.close();}
}

接收启动接收端,再启动发送端,接收端输出:

TCP客户端写入数据,好好学习,努力提升!

了解了TCP协议后,我们改进一下,服务器做出反馈,让客户端知道,客户端也接收服务端的反馈

客户代码

package com.wangLuo;import java.io.*;
import java.net.Socket;/*** @author 林高禄* @create 2020-06-01-10:24*/
public class TCPClient {public static void main(String[] args) throws IOException {Socket s = new Socket("192.168.1.55",10);OutputStream os = s.getOutputStream();byte[] bys = "TCP客户端写入数据,好好学习,努力提升!".getBytes();os.write(bys);InputStream is = s.getInputStream();byte[] bys1 = new byte[1024];int len = is.read(bys1);System.out.println(new String(bys1,0,len));s.close();}
}

服务端代码

package com.wangLuo;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;/*** @author 林高禄* @create 2020-06-01-10:28*/
public class TCPServer {public static void main(String[] args) throws IOException {ServerSocket ss = new ServerSocket(10);Socket s = ss.accept();InputStream is = s.getInputStream();byte[] bys = new byte[3];int len;while((len = is.read(bys)) != -1){System.out.print(new String(bys,0,len));}System.out.println();System.out.println("sss");OutputStream os = s.getOutputStream();os.write("数据已收到".getBytes());ss.close();}
}

启动服务端,在启动客户端,我们发现客户端和服务端的程序并没有停止,并且服务端的“sss”并没有输出,说明服务端的代码一直没有往下执行,所以一直没有给客户端反馈,导致客户端也一直在等待服务端的反馈

这是因为我们服务端接收客户端的方式是while循环,服务器并不知道客户端何时输入完毕,所以一直在等待,这就需要客户端给服务端一个标记,让服务端知道客户端何时发送完毕,我们可以让客户端发送某些字符作为标记,然后服务端做判断,当接收到的字符是这些字符,就会结束while循环,但是这样做会有bug,就是当我们实际要发送的数据如果包含这些字符,那么传输就不完整,因为会导致服务端结束循环,往后的内容就接收不到。

别急,Java的Socket类提供了自带的标记方法,shutdownOutput(),客户端调用这个方法,向服务端表明发送数据完毕,那么我们的客户端的代码就改进一下,加多这个方法

package com.wangLuo;import java.io.*;
import java.net.Socket;/*** @author 林高禄* @create 2020-06-01-10:24*/
public class TCPClient {public static void main(String[] args) throws IOException {Socket s = new Socket("192.168.1.55",10);OutputStream os = s.getOutputStream();byte[] bys = "TCP客户端写入数据,好好学习,努力提升!".getBytes();os.write(bys);// 向服务端表明数据发送完毕s.shutdownOutput();InputStream is = s.getInputStream();byte[] bys1 = new byte[1024];int len = is.read(bys1);System.out.println(new String(bys1,0,len));s.close();}
}

启动服务端,在启动客户端,2个程序都走完停止

服务端输出:

TCP客户端写入数据,好好学习,努力提升!
sss

客户端输出:

数据已收到

TCP协议我们基本了解了,那就做一个练习,TCP多线程 实现文件上传。

TCP协议(Socket,ServerSocket)相关推荐

  1. Java中基于TCP通过socket嵌套字连接方式传送文件

    这里写目录标题 Java中通过socket连接传送文件 前言 socket嵌套字 发送方 接收方 总结 Java中通过socket连接传送文件 前言 在项目的开发中经常遇到需要传送文件的情况,有时候是 ...

  2. 全网疯传!Java利用TCP协议实现客户端与服务器通信【附通信源码

    目录 TCP协议概念 ServerSocket类 服务器端程序 客户端程序 Hello!大家好哇!我是灰小猿! 上一篇博客和大家分享了在网络编程中要注意的基础知识,关于IP.TCP.UDP以及端口和套 ...

  3. python 使用tcp协议实现web服务器(七) epoll版本web服务器

    文章目录 摘要 前置知识 运行截图 html,css文件代码 index.html login.html register.html style.css python代码 摘要 使用python 基于 ...

  4. TCP协议下 Socket 与 ServerSocket

    不多bb. package c_20_1_5;import java.io.FileInputStream; import java.io.FileOutputStream; import java. ...

  5. TCP/UDP,SOCKET,HTTP,FTP协议简析

    (一)TCP/UDP,SOCKET,HTTP,FTP简析 TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层: 网络层:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议 传 ...

  6. Android中基于TCP协议的网络通信之使用Socket进行通信

    TCP协议被称为一种端到端的协议.这是因为它为两台计算机的连接起到了重要作用:当一台计算机需要与另一台计算机进行接连时,TCP协议会他们之间建立一个连接:用于发送和接收数据的虚拟链路. TCP协议负责 ...

  7. java socket发送定长报文_一个基于TCP协议的Socket通信实例

    原标题:一个基于TCP协议的Socket通信实例 1. 前言 一般接口对接多以http/https或webservice的方式,socket方式的对接比较少并且会有一些难度.正好前段时间完成了一个so ...

  8. Java中通过TCP协议发送和接收数据-Socket编程

    TCP TCP协议是面向连接.保证高可靠性(数据无丢失.数据无失序.数据无错误.数据无重复到达)传输层协议. TCP通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端 ...

  9. java socket 通信协议_java 基于TCP协议的Socket编程和通信

    java 基于 TCP 协议的 Socket 编程和通信 在网络通讯中,第一次主动发起通讯的程序被称作客户 端 (Client) 程序, 简称客户端, 而在第一次通讯中等待连接的 程序被称作服务器端 ...

最新文章

  1. MongoDB Hot Backup 测试及痛点
  2. 为什么 HashMap 常用 String 对象作 key
  3. linux服务器上装R语言,R语言 在linux上的安装
  4. GNU C __attribute__ 机制简介
  5. 菲尔茨奖得主丘成桐在清华设立数学英才班,比肩清华姚班
  6. oracle工作日记,Oracle学习日记【4】
  7. 方法的运用_运用正确管理方法缩减库存,助力企业发展
  8. 【GIS导论】实验三 数据处理
  9. 网易通行证html代码,JavaScript实现仿网易通行证表单验证
  10. 如何导出久其报表所有数据_久其报表软件基本操作流程..docx
  11. 炫酷背光文字html,PS制作背光放射出来的文字效果
  12. 永久关闭“WPS热点”的显示_我是亲民_新浪博客
  13. 深度学习 再次爆发_如何教自己再次学习
  14. 计算机软件图标乱码,Win7系统桌面快捷图标名称显示乱码如何解决
  15. What is XMP
  16. win7 64位 system32和syswow64文件夹
  17. 五子棋双人对战c语言课程设计,五子棋(双人对战) C语言课程设计.doc
  18. TCP/UDP 端口
  19. 他,10年软件开发经验,告诉你30岁后的程序员如何成功转型?
  20. 基于php的旅游景点网站设计

热门文章

  1. 问题 I: 自然数拆分Lunatic版
  2. More effective C++学习总结
  3. No qualifying bean of type ‘com.itheima.dao.BookDao1‘ available: expected single matching bean 问题解决
  4. 物联网之boa服务器
  5. python supper菱形继承
  6. 服务器系统centos ubuntu,CentOS vs Ubuntu:为您的服务器选择最佳操作系统
  7. Ubuntu SDK 安装
  8. 腾讯安全联手知道创宇应对全球勒索攻击事件
  9. 【Java核心技术卷一】对象与类:使用预定义类与用户自定义类
  10. 面试题 10.11. 峰与谷