Java TCP协议通信超详细讲解

 更新时间:2022年09月19日 09:39:15   作者:菜鸟小星啦  
TCP/IP是一种面向连接的、可靠的、基于字节流的传输层通信协议,它会保证数据不丢包、不乱序。TCP全名是Transmission Control Protocol,它是位于网络OSI模型中的第四层

什么是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();
		}
	}
}

到此这篇关于Java TCP协议通信超详细讲解的文章就介绍到这了,更多相关Java TCP协议通信内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringMVC数据输出相关知识总结

    SpringMVC数据输出相关知识总结

    今天带大家学习SpringMVC的相关知识,文中对SpringMVC数据输出作了非常详细的代码示例,对正在学习的小伙伴们很有帮助,需要的朋友可以参考下
    2021-06-06
  • java 字符串转化为字符数组的3种实现案例

    java 字符串转化为字符数组的3种实现案例

    这篇文章主要介绍了java 字符串转化为字符数组的3种实现案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • java 如何读取properties文件

    java 如何读取properties文件

    这篇文章主要介绍了java 如何读取properties文件,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-11-11
  • Java爬虫框架之WebMagic实战

    Java爬虫框架之WebMagic实战

    这篇文章主要介绍了Java爬虫框架之WebMagic实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Redis使用RedisTemplate模板类的常用操作方式

    Redis使用RedisTemplate模板类的常用操作方式

    这篇文章主要介绍了Redis使用RedisTemplate模板类的常用操作方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 使用Spring启动时运行自定义业务

    使用Spring启动时运行自定义业务

    这篇文章主要介绍了使用Spring启动时运行自定义业务的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • IDEA 如何导入别人的javaweb项目进行部署

    IDEA 如何导入别人的javaweb项目进行部署

    这篇文章主要介绍了IDEA 如何导入别人的javaweb项目进行部署,本文给大家分享我的详细部署过程及遇到问题解决方法,需要的朋友可以参考下
    2023-03-03
  • 详解SpringBoot自定义配置与整合Druid

    详解SpringBoot自定义配置与整合Druid

    Druid是alibaba开源平台上一个数据库连接池实现,结合了C3P0,DBCP等DB池的优点,同时也有Web监控界面。这篇文章主要介绍了Java之SpringBoot自定义配置与整合Druid的相关知识,需要的朋友可以参考下
    2021-09-09
  • Java数据库连接PreparedStatement的使用详解

    Java数据库连接PreparedStatement的使用详解

    这篇文章主要介绍了Java数据库连接PreparedStatement的使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • 解决JPA save()方法null值覆盖掉mysql预设的默认值问题

    解决JPA save()方法null值覆盖掉mysql预设的默认值问题

    这篇文章主要介绍了解决JPA save()方法null值覆盖掉mysql预设的默认值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11

最新评论