Java TCP协议通信超详细讲解

目录
  • 什么是tcp
  • 服务端
  • 客户端
  • 服务端与客户端代码实现实例

什么是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协议通信内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java基于TCP协议的Socket通信

    目录 简介 TCP简介 JAVA Socket简介 SocketImpl介绍 TCP 编程 构造ServerSocket 1.1 绑定端口 1.2 设定客户连接请求队列的长度 1.3 设定绑定的IP 地址 1.4 默认构造方法的作用 多线程示例 简介 TCP简介 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义.在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户

  • java实现TCP socket和UDP socket的实例

    目录 概述 传输层概述 TCP套接字编程 大致过程 详细过程 UDP套接字编程 补充 概述 我们在网络编程时,通常是让我们本地的应用程序和远程的应用程序进行通信,也就是分布式的进程之间的通信,比如我写的程序A和小明的程序B进行通信,我的程序运行时在本机就是一个进程,是有pid号的,小明的也是.那这两个程序是怎么通信的呢? 这就要理解网络分层的概念了,网络层实现的是主机到主机之间的通信,网络层的实现是ip协议,通过各自的ip地址就能实现远程数据传输,而网络层只是保证了主机A的数据能够到达主机B,并

  • Java利用TCP实现服务端向客户端消息群发的示例代码

    目录 前言 代码 tcp服务端代码 ServerThread 线程类 TcpTool 消息群发工具类 Tcp客户端代码 前言 项目需要和第三方厂商的服务需要用TCP协议通讯,考虑到彼此双方可能都会有断网重连.宕机重启的情况,需要保证 发生上述情况后,服务之间能够自动实现重新通信.研究测试之后整理如下代码实现.因为发现客户端重启后,对于服务端来说原来的客户端和服务端进程进程已经关闭,启动又和服务端新开了一个进程.所以实现原理就可以通过服务端向客户端群发实现,断开重新连接通讯. 代码 tcp服务端代

  • 基于Java的Scoket编程

    目录 一,网络编程中两个主要的问题 二,两类传输协议:TCP和UDP TCP和UDP的区别 三,基于Socket的java网络编程 1.什么是Socket 2.Socket通讯的过程 3.创建Socket 代码演示 例:基于TCP的数据传输,传递字符串 例:基于TCP的数据传输,传输对象 例:基于多线程的通讯请求,多客户端访问服务器 例:基于UDP的数据传递 一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协

  • Java实战之基于TCP实现简单聊天程序

    目录 一.如何实现TCP通信 二.编写C/S架构聊天程序 1.编写服务器端程序 - Server.java 2.编写客户端程序 - Client.java 3.测试服务器端与客户端能否通信 4.程序优化思路 - 服务器端采用多线程 一.如何实现TCP通信 要实现TCP通信需要创建一个服务器端程序和一个客户端程序,为了保证数据传输的安全性,首先需要实现服务器端程序,然后在编写客户端程序. 在本机运行服务器端程序,在远程机运行客户端程序 本机的IP地址:192.168.129.222 远程机的IP地

  • Java TCP编程之Scoket

    目录 一.什么是Scoket 二.服务器端 三.客户端 四.Socket流 五.总结 一.什么是Scoket Socket 是一个抽象概念,一个应用程序通过一个 Socket 来建立一个远程连接,而 Socket 内部通 过 TCP/IP 协议把数据传输到网络. ┌───────────┐                                   ┌───────────┐│Application│                                   │Applicat

  • Java Scoket实现双向通信代码详解

    你好我是辰兮,很高兴你能来阅读,本篇总结了Java Scoket类的相关知识,并且整理了实现双向通信的相关代码也有案例实现截图,分享获取新知,大家一起进步. 一.网络通信 网络通信,在网络中程序(发送者)与程序(接受者)之间的数据交互. 通信要素①ip + 端口号 ②传输协议 java.net包: 包含了Java用于网络通信所需的类. ServerSocket类,用于表示网络服务 创建网络服务(创建ServerSocket对象) //构造器 public ServerSocket(int por

  • Java TCP协议通信超详细讲解

    目录 什么是tcp 服务端 客户端 服务端与客户端代码实现实例 什么是tcp Tcp通信有两个特点分别是面向连接,具有可靠性. 面向连接:指的是客户端与服务端之间的连接,在通信之前会有三次握手的机制来确保连接的可靠性. 可靠性:tcp在确保他的可靠性上做了许多的功夫,这个可靠性体现在下面两方面: tcp有状态:tcp会精确的纪录哪些数据是发送了的,哪些是没有被发送的,他保证数据包是按序到达的,不允许存在半点差错 tcp是可以控制的:如果存在丢包或者网络不好的时候,会根据具体情况对数据包进行发送速

  • Java SpringMVC数据响应超详细讲解

    目录 1)页面跳转   2)回写数据 3)配置注解驱动 4)知识要点 1)页面跳转   直接返回字符串:此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转.  返回带有前缀的字符串: 转发: forward:/WEB-INF/views/index.jsp 重定向: redirect:/index.jsp 通过ModelAndView对象返回 @RequestMapping("/quick2") public ModelAndView quickMethod2(){ ModelAn

  • Java超详细讲解SpringMVC如何获取请求数据

    目录 1.获得请求参数 1)基本类型参数:​​​​​​​   2)POJO类型参数: 3)数组类型参数   4)集合类型参数   2.请求乱码问题 3.参数绑注解@RequestParam​​​​​​​ 4.获得Restful风格的参数 5.自定义类型转换器 6.获得请求头 7.文件上传 8.小结 1.获得请求参数 客户端请求参数的格式是:name=value&name=value- - 服务器端要获得请求的参数,有时还需要进行数据的封装,SpringMVC可以接收如下类型的参数: 1)基本类型

  • Java 超详细讲解字符流

    目录 一.字符流的由来 二.编码表 字符集: Unicode字符集: UTF-8编码规则: 三.字符串中的编码解码问题 编码方法(IDEA): 解码方法(IDEA): 四.字符流的编码解码问题 四.字符流写数据的五种方法 五.字符流读数据的两种方法 一.字符流的由来 由于使用字节流操控中文时不是很方便,Java就提供了字符流来进行操控中文 实现原理:字节流+编码表 为什么用字节流进行复制带有中文的文本文件时没有问题? 因为底层操作会自动进行字节拼接成中文 怎样识别该字节是中文呢? 汉字在存储时,

  • java反射超详细讲解

    目录 Java反射超详解✌ 1.反射基础 1.1Class类 1.2类加载 2.反射的使用 2.1Class对象的获取 2.2Constructor类及其用法 2.4Method类及其用法 Java反射超详解✌ 1.反射基础 Java反射机制是在程序的运行过程中,对于任何一个类,都能够知道它的所有属性和方法:对于任意一个对象,都能够知道它的任意属性和方法,这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制. Java反射机制主要提供以下这几个功能: 在运行时判断任意一个对象所属

  • 超详细讲解Java线程池

    目录 池化技术 池化思想介绍 池化技术的应用 如何设计一个线程池 Java线程池解析 ThreadPoolExecutor使用介绍 内置线程池使用 ThreadPoolExecutor解析 整体设计 线程池生命周期 任务管理解析 woker对象 Java线程池实践建议 不建议使用Exectuors 线程池大小设置 线程池监控 带着问题阅读 1.什么是池化,池化能带来什么好处 2.如何设计一个资源池 3.Java的线程池如何使用,Java提供了哪些内置线程池 4.线程池使用有哪些注意事项 池化技术

  • 超详细讲解Java异常

    目录 一.Java异常架构与异常关键字 Java异常简介 Java异常架构 1.Throwable 2.Error(错误) 3.Exception(异常) 4.受检异常与非受检异常 Java异常关键字 二.Java异常处理 声明异常 抛出异常 捕获异常 如何选择异常类型 常见异常处理方式 1.直接抛出异常 2.封装异常再抛出 3.捕获异常 4.自定义异常 5.try-catch-finally 6.try-with-resource 三.Java异常常见面试题 1.Error 和 Excepti

  • Java 超详细讲解设计模式之中的抽象工厂模式

    目录 抽象工厂模式 1.什么是抽象工厂 2.抽象工厂模式的优缺点 3.抽象工厂模式的结构与实现 4.抽象工厂方法模式代码实现 5.抽象工厂模式的应用场景 6.抽象工厂模式的扩展 抽象工厂模式 前面文章介绍的工厂方法模式中考虑的是一类产品的生产,比如案例中的百事可乐工厂只能生产百事可乐,可口可乐工厂只能生产可口可乐,也就是说:工厂方法模式只考虑生产同等级的产品. 1.什么是抽象工厂 在现实生活中许多工厂是综合型的工厂,能生产多种类)的产品,就拿案例里面的可乐来说,在节日的时候可能会有圣诞版的可乐,

  • Java 超详细讲解IO操作字节流与字符流

    目录 IO操作 字节流 FileInputStream FileOutputStream 字节流读写案例 字符流 FileReader FileWriter 字节流与字符流的区别 IO操作 字节流 java.io.InputStream 输入流,主要是用来读取文件内容的. java.io.OutputStream 输出流,主要是用来将内容字节写入文件的. FileInputStream 该流用于从文件读取数据,它的对象可以用关键字 new 来创建. 有多种构造方法可用来创建对象. 可以使用字符串

  • Java 超详细讲解设计模式之中的建造者模式

    目录 1.什么是建造者模式? 2.建造者模式的定义 3.建造者模式的优缺点 4.建造者模式的结构 5.建造者模式代码演示 6.建造者模式的应用场景 7.建造者模式和工厂模式的区别 1.什么是建造者模式? 我们知道在软件开发过程中有时需要创建一个很复杂的对象,通常由多个子部件按一定的步骤组合而成. 例如,比如我们在自己在组装一台计算机的时候,需要有 CPU.主板.内存.硬盘.显卡.机箱.显示器.键盘.鼠标等部件组装而成的.比如学校需要采购100台计算机,学校不可能自己把零件买过来自己组装,肯定是告

随机推荐