Java TCP协议通信超详细讲解
作者:菜鸟小星啦 发布时间:2021-05-30 20:53:35
什么是tcp
Tcp通信有两个特点分别是面向连接,具有可靠性.
面向连接:指的是客户端与服务端之间的连接,在通信之前会有三次握手的机制来确保连接的可靠性.
可靠性:tcp在确保他的可靠性上做了许多的功夫,这个可靠性体现在下面两方面:
tcp有状态:tcp会精确的纪录哪些数据是发送了的,哪些是没有被发送的,他保证数据包是按序到达的,不允许存在半点差错
tcp是可以控制的:如果存在丢包或者网络不好的时候,会根据具体情况对数据包进行发送速度的控制或者对数据包进行重新发送.
如下图是实现服务器端与客户端通信的思路:
服务端
服务端用到的类是ServerSocket
ServerSocker类在他的api文档里面也说了他是实现服务器的一个类
了解一个类我们还是老样子先了解他的构造方法,我们看一下api文档
我们常用的构造方法是第一个ServerSocket()
和第二个serverSocket(int port)
.接下来我们只讲这两个方法.
我们先来讲讲serverSocket()
这个构造方法吧!
serverSocket()
这个构造方法是创建一个没有绑定端口的对象,一般他和如下方法配套使用
用以上的方法可以绑定一个你指定的ip地址和端口号.
接下来我们再讲讲第二个常用的构造方法吧 !
ServerSocket(int port)
这个构造函数创建的是一个绑定本机的一个自定义端口的一个ServerSocket
对象.
如下面的例子
ServerSocket serverSocket = new ServerSocket(6666); //绑定端口号为6666的端口
ServerSocket
常用的方法
accept()
方法是一个 * ,是一个阻塞式,它要等有服务端来连接了才能进行下一步,如果没有客户端来连接就会一直等待下去,直到接收到连接才往下运行.这个方法返回的是一个Socket对象,有客户端来连接,就会产生一个Socket对象.这个Socket对象就负责与服务端进行通信
close
方法是释放服务器所占用的资源,并且断开全部客户端的连接.
客户端
Socket类
是实现客户端通信
接下来我们解析socket
类
我们就看常用的socket类的构造方法吧
第一个构造方法
是创建一个连接到的一个指定的ip地址以及指定的端口号的服务器的socket对象.如果你得到的一个Ip地址是一个字符串类型我们还可以使用另一个构造方法
这个构造方法同样的也是创建一个连接到的一个指定的ip地址以及指定的端口号的服务器的socket对象
我们来看看他的常用方法
我们这里着重讲的是getOutputStream()
方法与getInputStream()
getOutputStream()
返回的是一个OutputStream字节输出流对象,我们从这里可以知道我们可以发送数据给服务器/客户端。
getInputStream()
返回有的是InputStream字节输入流对象,我们可以通过这个对象接受服务器/客户端发来的消息。
服务端与客户端代码实现实例
服务端代码
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 服务端
* @author Administrator
*
*/
public class Server {
public static void main(String[] args) {
ServerSocket server = null;
Socket socket = null;
try {
//准备服务器端用的通讯对象(套接字),指明端口号为8888
server = new ServerSocket(8888);
//到指定端口去阻塞监听,一旦有客户端请求发送过来,那么立即自动与客户端建立连接
socket = server.accept();
System.out.println("服务器端准备ok");
//我要发送到客户端的内容
String msg = "你好,我是服务器,这是我的第一次通讯,请问你收到了吗";
OutputStream os = socket.getOutputStream();//准备输出对象
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
bw.write(msg);
bw.newLine();
bw.flush();
//接收客户端发送的信息
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String reply = br.readLine();
System.out.println("我是服务器,接收到信息:"+reply);
br.close();
is.close();
bw.close();
os.close();
socket.close();
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端代码
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* 客户端
* @author Administrator
*
*/
public class Client {
public static void main(String[] args) {
Socket socket = null;
try {
socket = new Socket("localhost", 8888);
System.out.println("客户端准备完成");
//客户端开始接受请求
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String msg = br.readLine();
System.out.println("我是客户端,接收到信息:"+msg);
//客户端接收到服务器端的信息之后,需要反馈信息给服务器
//客户端想要反馈给服务器端的信息
String reply = "我是客户端,收到你的信息,这是我的反馈";
OutputStream os = socket.getOutputStream();//准备客户端的输出流
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
bw.write(reply);
bw.newLine();
bw.flush();
bw.close();
os.close();
br.close();
is.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
来源:https://blog.csdn.net/m0_48844699/article/details/126614414


猜你喜欢
- 无论使用何种IDE开发Android,集成官方Android SDK并创建Android工程之后,该工程都会默认包括一整套Android项目
- 开发一个需要常住后台的App其实是一件非常头疼的事情,不仅要应对国内各大厂商的ROM,还需要应对各类的安全管家...虽然不断的研究各式各样的
- SpringCloud启动失败问题Nacos配置读取失败org.yaml.snakeyaml.error.YAMLException: ja
- 想必大家都知道,国内的Android应用基本都是免费的
- 在java里, 我们可以使用Executors.newFixedThreadPool 来创建线程池, 然后就可以不停的创建新任务,并用线程池
- 在spring boot 项目中使用thymeleaf模板,将后台数据传递给前台界面。1、将后台数据传递给前台有很多种方式,可以将后台要传递
- 业务处理这是通过 Spring 在 Controller中注入Service模型层而在 Service模型层 结合 Mybatis / My
- MS的CMD命令行是一种重要的操作界面,一些在C#中不那么方便完成的功能,在CMD中几个简单的命令或许就可以轻松搞定,如果能在C#中能完成C
- 本文中我们会讲解如何在Spring Boot JPA中实现class和数据表格的映射。默认实现Spring Boot JPA底层是用Hibe
- 介绍try-with-resources是Java中的环绕语句之一,旨在减轻开发人员释放try块中使用的资源的义务。它最初在Java 7中引
- 使用Socket实现多人聊天应用,供大家参考,具体内容如下 在讲scoket通信器先可以先了解一下网络协议手机能够使用联网功能是因
- 一、组件型注解:1、@Component 在类定义之前添加@Component注解,他会被spring容器识别,并转为bean。2、@Rep
- 这篇文章主要介绍了MyBatis Mapper接受参数的四种方式代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考
- 本文主要给大家介绍java的InputStream 流的使用。(1)FileInputstream: 子类,读取数据的通道使用步骤:1.获取
- 此项目使用了OpenCVSharp加载本地摄像头,多个摄像头支持切换展示,也可以展示rtsp地址。使用NuGet如下:代码如下一、创建Mai
- 一、数据类型与变量的介绍在程序运行的过程中计算机需要记录大量的状态 数据(这里我们统称数据)。那这些数据都存放在哪呢?程序在运行过程中的数据
- Java自定义动态数组1、静态数组向动态数组转变(1)静态数组,数组空间固定长度这个数组空间总长为4,如果此时新插入一个数据就会报数组空间不
- 本文介绍了JAVA中实现原生的 socket 通信机制原理,分享给大家,具体如下:当前环境jdk == 1.8知识点socket 的连接处理
- Android 中 ActivityLifecycleCallbacks的实例详解  
- idea 很强大,但是初次安装默认的有很多设置并不是满足我们开发的需要。以前经常一安装就要捣鼓很久,为此吐血整理初次安装设置一、切换主题(配