【JavaEE】TCP数据报套接字编程

2023-10-23 19:52

本文主要是介绍【JavaEE】TCP数据报套接字编程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、TCP数据报套接字编程

1.1 ServerSocket API

ServerSocket 是创建TCP服务端Socket的API
ServerSocket 构造方法:
在这里插入图片描述
ServerSocket 方法:
在这里插入图片描述

1.2 Socket API

Socket 是客户端Socket,或服务端中接收到客户端建立连接(accept方法)的请求后,返回的服务端Socket。不管是客户端还是服务端Socket,都是双方建立连接以后,保存的对端信息,及用来与对方收发数据的。
Socket 构造方法:

在这里插入图片描述
Socket 方法:
在这里插入图片描述
通过上述字节流对象进行数据传输:
InputStream读数据就相当于从网卡接收
OutputStream写数据就相当于从网卡发送

1.3 短连接和长连接

短连接:一次连接只有一个请求
长连接:一次连接有多个请求

1.4 示例一:回显服务器(echo server)

这里我们演示长连接:

1.4.1 Tcp服务器

package Tcp;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;public class TcpEchoServer {//serverSocket是外场拉客的小哥,serverSocket有且只有一个//cilentSocket是内场服务的小姐姐,cilentSocket会给每个客户端分配一个private ServerSocket serverSocket = null;public TcpEchoServer(int port) throws IOException {serverSocket = new ServerSocket(port);}public void start() throws IOException {System.out.println("服务器启动!");while(true) {Socket cilentSocket = serverSocket.accept();processConnection(cilentSocket);  //连接后通过processConnection来处理连接}}//通过这个方法来处理一个连接://1.读取请求//2.根据请求计算响应//3.把响应返回给客户端private void processConnection(Socket cilentSocket) throws IOException {System.out.printf("[%s:%d] 客户端上线!",cilentSocket.getInetAddress().toString(),cilentSocket.getPort());  //提示客户端上线并打印IP地址和端口号//try()这种写法,允许括号中写多个流对象,中间使用“;”来分割try (InputStream inputStream = cilentSocket.getInputStream();OutputStream outputStream = cilentSocket.getOutputStream()){Scanner scanner = new Scanner(inputStream);  //为了读取请求方便,把字节流转为字符流PrintWriter printWriter = new PrintWriter(outputStream);  //为了返回响应方便,把字节流转为字符流//我们读到哪里算是一个完整的请求呢;//此处做一个简单的约定://每个请求是个字符串(文本数据),每个请求之间使用\n来分割,不要忘记响应也要这样约定while(true) {  //长连接:一次连接有多个请求//1.读取请求if (!scanner.hasNext()) {  //如果客户端关闭连接了,hasNext返回false,结束while循环System.out.printf("[%s:%d] 客户端下线!",cilentSocket.getInetAddress().toString(),cilentSocket.getPort());  //提示客户端下线并打印IP地址和端口号break;}//如果没有读完,直接使用scanner读取一段字符串String request = scanner.next();  //next会往后一直读直到读到空白符(空格、换行符、制表符、翻页符等)结束(不包含空白符)。此处尽量不要使用nextLine//2.根据请求计算响应String response = process(request);  //通过process方法来处理请求并返回响应//3.把响应返回给客户端(不要忘记响应里面也是要带上换行的,方便客户端区分从哪里到哪里是一个响应)printWriter.println(response);System.out.printf("[%s:%d] req:%s ; resp:%s \n",cilentSocket.getInetAddress().toString(), cilentSocket.getPort());}} catch (IOException e) {throw new RuntimeException(e);} finally {cilentSocket.close();  //这里的cilentSocket只是给一个连接提供帮助,所以要及时释放}}private String process(String request) {return request;}public static void main(String[] args) throws IOException {TcpEchoServer tcpEchoServer = new TcpEchoServer(9090);tcpEchoServer.start();}
}

注意:如果没有客户端连接时,accept是会阻塞的

1.4.2 Tcp客户端

package Tcp;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;public class TcpEchoClient {private Socket socket = null;private void TcpEchoServer(String serverIP, int port) throws IOException {//这个操作就相当于让客户端和服务端建立Tcp连接了socket = new Socket(serverIP,port);}public void start() throws IOException {Scanner scanner = new Scanner(System.in);try (InputStream inputStreamt = socket.getInputStream(); OutputStream outputStream = socket.getOutputStream()){PrintWriter printWriter = new PrintWriter(outputStream);Scanner scanner1 = new Scanner(inputStreamt);while (true) {//1.从键盘上读取用户输入的内容System.out.println("->");String request = scanner.next();//2.把输入的内容构造成请求并发送给服务器(对应服务器的接收)//注意这里发送的请求带有换行printWriter.println(request);//3.从服务器读取相应内容String response = scanner1.next();//4.把响应结果显示在控制台上System.out.printf("req: %s; resp: %s\n", request, response);}}}public static void main(String[] args) throws IOException {TcpEchoClient client = new TcpEchoClient("127.0.0.1", 9090);client.start();}}

这篇关于【JavaEE】TCP数据报套接字编程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/270115

相关文章

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

SpringBoot+Docker+Graylog 如何让错误自动报警

《SpringBoot+Docker+Graylog如何让错误自动报警》SpringBoot默认使用SLF4J与Logback,支持多日志级别和配置方式,可输出到控制台、文件及远程服务器,集成ELK... 目录01 Spring Boot 默认日志框架解析02 Spring Boot 日志级别详解03 Sp

java中反射Reflection的4个作用详解

《java中反射Reflection的4个作用详解》反射Reflection是Java等编程语言中的一个重要特性,它允许程序在运行时进行自我检查和对内部成员(如字段、方法、类等)的操作,本文将详细介绍... 目录作用1、在运行时判断任意一个对象所属的类作用2、在运行时构造任意一个类的对象作用3、在运行时判断

java如何解压zip压缩包

《java如何解压zip压缩包》:本文主要介绍java如何解压zip压缩包问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解压zip压缩包实例代码结果如下总结java解压zip压缩包坐在旁边的小伙伴问我怎么用 java 将服务器上的压缩文件解压出来,

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

Spring WebFlux 与 WebClient 使用指南及最佳实践

《SpringWebFlux与WebClient使用指南及最佳实践》WebClient是SpringWebFlux模块提供的非阻塞、响应式HTTP客户端,基于ProjectReactor实现,... 目录Spring WebFlux 与 WebClient 使用指南1. WebClient 概述2. 核心依

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2