TCP协议(Socket,ServerSocket)
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)相关推荐
- Java中基于TCP通过socket嵌套字连接方式传送文件
这里写目录标题 Java中通过socket连接传送文件 前言 socket嵌套字 发送方 接收方 总结 Java中通过socket连接传送文件 前言 在项目的开发中经常遇到需要传送文件的情况,有时候是 ...
- 全网疯传!Java利用TCP协议实现客户端与服务器通信【附通信源码
目录 TCP协议概念 ServerSocket类 服务器端程序 客户端程序 Hello!大家好哇!我是灰小猿! 上一篇博客和大家分享了在网络编程中要注意的基础知识,关于IP.TCP.UDP以及端口和套 ...
- python 使用tcp协议实现web服务器(七) epoll版本web服务器
文章目录 摘要 前置知识 运行截图 html,css文件代码 index.html login.html register.html style.css python代码 摘要 使用python 基于 ...
- TCP协议下 Socket 与 ServerSocket
不多bb. package c_20_1_5;import java.io.FileInputStream; import java.io.FileOutputStream; import java. ...
- TCP/UDP,SOCKET,HTTP,FTP协议简析
(一)TCP/UDP,SOCKET,HTTP,FTP简析 TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层: 网络层:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议 传 ...
- Android中基于TCP协议的网络通信之使用Socket进行通信
TCP协议被称为一种端到端的协议.这是因为它为两台计算机的连接起到了重要作用:当一台计算机需要与另一台计算机进行接连时,TCP协议会他们之间建立一个连接:用于发送和接收数据的虚拟链路. TCP协议负责 ...
- java socket发送定长报文_一个基于TCP协议的Socket通信实例
原标题:一个基于TCP协议的Socket通信实例 1. 前言 一般接口对接多以http/https或webservice的方式,socket方式的对接比较少并且会有一些难度.正好前段时间完成了一个so ...
- Java中通过TCP协议发送和接收数据-Socket编程
TCP TCP协议是面向连接.保证高可靠性(数据无丢失.数据无失序.数据无错误.数据无重复到达)传输层协议. TCP通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端 ...
- java socket 通信协议_java 基于TCP协议的Socket编程和通信
java 基于 TCP 协议的 Socket 编程和通信 在网络通讯中,第一次主动发起通讯的程序被称作客户 端 (Client) 程序, 简称客户端, 而在第一次通讯中等待连接的 程序被称作服务器端 ...
最新文章
- MongoDB Hot Backup 测试及痛点
- 为什么 HashMap 常用 String 对象作 key
- linux服务器上装R语言,R语言 在linux上的安装
- GNU C __attribute__ 机制简介
- 菲尔茨奖得主丘成桐在清华设立数学英才班,比肩清华姚班
- oracle工作日记,Oracle学习日记【4】
- 方法的运用_运用正确管理方法缩减库存,助力企业发展
- 【GIS导论】实验三 数据处理
- 网易通行证html代码,JavaScript实现仿网易通行证表单验证
- 如何导出久其报表所有数据_久其报表软件基本操作流程..docx
- 炫酷背光文字html,PS制作背光放射出来的文字效果
- 永久关闭“WPS热点”的显示_我是亲民_新浪博客
- 深度学习 再次爆发_如何教自己再次学习
- 计算机软件图标乱码,Win7系统桌面快捷图标名称显示乱码如何解决
- What is XMP
- win7 64位 system32和syswow64文件夹
- 五子棋双人对战c语言课程设计,五子棋(双人对战) C语言课程设计.doc
- TCP/UDP 端口
- 他,10年软件开发经验,告诉你30岁后的程序员如何成功转型?
- 基于php的旅游景点网站设计
热门文章
- 问题 I: 自然数拆分Lunatic版
- More effective C++学习总结
- No qualifying bean of type ‘com.itheima.dao.BookDao1‘ available: expected single matching bean 问题解决
- 物联网之boa服务器
- python supper菱形继承
- 服务器系统centos ubuntu,CentOS vs Ubuntu:为您的服务器选择最佳操作系统
- Ubuntu SDK 安装
- 腾讯安全联手知道创宇应对全球勒索攻击事件
- 【Java核心技术卷一】对象与类:使用预定义类与用户自定义类
- 面试题 10.11. 峰与谷