Java之TCP网络编程

news2024/11/15 12:50:17

TCP网络编程

1 概述

在TCP通信协议下,计算机网络中不同设备上的应用程序之间可以通信,通信时需严格区分客户端(Client)与服务器端(Server)。

在Java中,对于这样基于TCP协议下连接通信的客户端和服务端,分别进行了抽象:

  • java.net.ServerSocket类表示服务端
  • java.net.Socket类表示客户端

使用SocketServerSocket进行的编程,也称为套接字编程。

2 通信流程

TCP客户端和服务器进行通信,其通信流程是固定的,具体如下:

服务器端:

  • 创建ServerSocket(需绑定端口,方便客户端连接)

  • 调用ServerSocket对象的accept()方法接收一个客户端请求,得到一个Socket

  • 调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流

    输入流可以读取客户端发送过来的数据

    输出流可以发送数据到客户端

  • 操作完成,关闭资源

构造方法

方法名说明
ServletSocket(int port)创建绑定到指定端口的服务器套接字

相关方法

方法名说明
Socket accept()监听要连接到此的套接字并接受它

注意:accept方法是阻塞的,作用是等待客户端连接,如果有客户端连接则立马返回,如果没有客户端连接则一致阻塞等待。

客户端:

  • 创建Socket连接服务端(需指定服务器ip地址、端口),找对应的服务器进行连接

  • 调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流

    输入流可以读取服务端输出流写出的数据

    输出流可以写出数据到服务端的输入流

  • 操作完成,关闭资源

注意,在整个过程中,服务端不能主动连接客户端,必须由客户端先行发起连接才行

构造方法

方法名说明
Socket(InetAddress address,int port)创建流套接字并将其连接到指定IP指定端口号
Socket(String host, int port)创建流套接字并将其连接到指定主机上的指定端口号

相关方法

方法名说明
InputStream getInputStream()返回此套接字的输入流
OutputStream getOutputStream()返回此套接字的输出流
image-20230404102402578

3 基础案例

搭建TCP客户端,发送信息到服务器

package com.briup.chap12;

public class Test063_TcpClient {
	public static void main(String[] args) throws Exception {
		//1.创建Socket对象(指定服务器ip port) 连接到服务器
		Socket socket = new Socket("127.0.0.1",8989);
		System.out.println("成功连接到 8989服务器,socket: " + socket);
		
		//2.获取数据传输的IO流
		InputStream is = socket.getInputStream();
		OutputStream os = socket.getOutputStream();
		
		//3.数据传输【跟服务器 业务配合 起来】
		// 先发送数据给服务器
		os.write("hello server, 我是Tcp客户端".getBytes());
		System.out.println("数据发送完成!");
		
        // 再接收从服务器返回的数据
		byte[] buff = new byte[1024];
		int len = is.read(buff);
		System.out.println("read: " + new String(buff,0,len));
		
		//4.关闭资源
		os.close();
		is.close();
		socket.close();
	}
}

搭建TCP服务器端,接收客户端发送的信息,并返回数据给客户端

package com.briup.chap12;

public class Test063_TcpServer {
	public static void main(String[] args) throws IOException {
		// 1.创建ServerSocket(需绑定端口,方便客户端连接)
		ServerSocket server = new ServerSocket(8989);
		System.out.println("服务器成功启动,端口 8989 ...");
		
		//2.调用ServerSocket的accept()方法接收客户端请求,得到一个Socket
		//	如果客户端成功连接到服务器,直接返回 套接字对象(通信)
		//	如果没有客户端连接  服务器,则阻塞
		Socket socket = server.accept();
		System.out.println("客户端成功连接: " + socket);
		
		//3.获取网络通信的IO流对象
		InputStream is = socket.getInputStream();
		OutputStream os = socket.getOutputStream();
		
		//4.数据传输
		//	先读取 客户端发送过来的数据 并输出
		byte[] buff = new byte[1024];
		int len = is.read(buff);
		System.out.println("成功读取: ");
		System.out.println(new String(buff,0,len));
		
		//  再返回一条数据给 客户端
		System.out.println("即将发送数据 给 客户端...");
		os.write("hello world client".getBytes());
		
		System.out.println("数据成功发送!");
		
		//5.关闭资源
		os.close();
		is.close();
		socket.close();
		server.close();
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1990217.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构-常见排序的七大排序

1.排序的概念及其运用 1.1排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录…

Arkose 验证码:网络抓取工具的最佳实践

网络爬虫已经成为企业和开发人员最常用的工具,用于有效地从网络中收集数据。当然,大家都会遇到的最常见挑战是大量的 CAPTCHA 出现,这会使工作流程陷入停滞。其中,Arkose Labs Captcha(称为 Funcaptcha)以其…

探索N卡录制:游戏录屏工具会是网页录屏的最佳伴侣吗?

在这个数字时代,无论是游戏玩家、教育工作者还是内容创作者,高质量的录屏工具都是必不可少的。NVIDIA显卡(简称N卡)以其卓越的图形处理能力而闻名,而N卡录制功能则进一步扩展了其应用范围,特别是在游戏录屏…

【SpringBoot 属性加载机制】

SpringBoot 属性加载 一个 SpringBoot 应用的配置属性可以有多种不同的来源, 比如可以来自操作系统的环境变量, 比如可以来自 application.yaml 文件; 每一种不同的属性来源, 都会被 SpringBoot 封装成一个PropertySource对象, 保存在 Environment 对象的 PropertySources 类型…

proteus仿真c51单片机(三)多定时任务的编程——时分秒发生器

实验步骤 1、打开PROTEUS软件选取元件,连线绘制电路图。 2、打开KEIL软件编制程序进行调试、编译。 3、将编译的HEX代码装入PROTEUS软件绘制的电路图的单片机中。 4、仿真运行观察实验现象,若与要求的实验现象不同,检查程序和电路图找…

Linux目录结构常用命令和文件管理解析

一.Linux目录结构 bin:binary二进制,普通用户执行命令都在这里 boot:和计算机启动的相关文件都放这 dev:device设备、驱动、硬件 etc:配置文件也叫控制台文件 home:来装用户自己的文件的,普通用户的家目录主目录,每个普通用户进来都有自…

PythonStudio 控件使用常用方式(十二)TMaskEdit

PythonStudio是一个极强的开发Python的IDE工具,它使用的是Delphi的控件,常用的内容是与Delphi一致的。但是相关文档并一定完整。现在我试试能否逐步把它的控件常用用法写一点点,也作为PythonStudio的参考。 从1.2.1版开始,Python…

Android compose OutlinedTextField 输入框设置固定高度后,内容挤压显示不全

原因: decorationBox里边contentPadding() 默认为16.dp internal val TextFieldPadding 16.dp 修改方法1: copy OutlinedTextField.kt 源码,decorationBox的contentPadding参数开放出来 /*** author 创建人:蒙石瑞* date …

【大模型从入门到精通11】openAI API 提示链的力量2

这里写目录标题 提示链的力量:阅读和处理JSON字符串基于产品信息生成用户响应综合性的客户服务互动结论理论问题 提示链的力量:阅读和处理JSON字符串 当处理复杂的工作流程时,通常会以JSON格式传递数据。以下示例演示了如何将JSON字符串转换…

【Linux QT】添加Json-C库

前言 在Linux应用开发中,Linux设备和服务器通信时,两者之间数据的传输通常采用JSON数据格式来作为载体,便于两者之间的数据交互。当设备端接收到服务端下发的JSON数据,设备端需要对JSON格式的数据进行解析;当设备端需要…

Java设计模式(命令模式)

定义 将一个请求封装为一个对象,从而让你可以用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及支持可撤销的操作。 角色 抽象命令类(Command):声明用于执行请求的execute方法,通…

CSS实现hover时文本上下出现线条

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>复杂Hover效果示例</title><style>p {f…

【案例38】Can’t get connection from database 排查详细记录

问题现象 客户要搭建灰度环境&#xff0c;启动后&#xff0c;登录超级管理员报连接不上数据库的错误。 Can’t get connection from database(XXX) 问题分析 1、一般碰到这个问题&#xff0c;初步就开始怀疑是sysconfig数据源不通导致的。 发现数据源是通的。 2、在sysconf…

【案例40】Apache中mod_proxy模块的使用

NC中间件 应用场景&#xff1a;配置了apache的情况&#xff0c;包括uap集群&#xff0c;配置https等场景下均适用&#xff1b;如果是单机&#xff08;NC单结点情况不存在问题&#xff0c;则不用配置这项; was环境也不用配置此项。&#xff09; 解决方案&#xff1a;按如下两…

【15.PIE-Engine案例——加载Landsat 8 SR数据集】

加载Landsat 8 SR数据集 原始路径 欢迎大家登录航天宏图官网查看本案例原始来源 最终结果 具体代码 /*** File : Landsat8SRImages* Time : 2020/7/21* Author : piesat* Version : 1.0* Contact : 400-890-0662* License : (C)Copyright 航天宏图信息技…

【C++】BFS解决Floodfill问题

目录 Floodfill算法介绍 解决方法 BFS 图画渲染 算法思路&#xff1a; 代码实现&#xff1a; 岛屿数量 算法思路 代码实现 岛屿的最大面积 算法思想 代码实现 被围绕的区域 算法思路 代码实现 总结&#xff1a; Floodfill算法介绍 Floodfill翻译过来就是“洪…

serial靶机渗透~反序列化

反序列化又叫对象注入&#xff0c;序列化在内部没有漏洞&#xff0c;漏洞产生是因为程序在处理对象、魔术函数以及序列化相关的问题导致的&#xff0c;当传给 unserialize()的参数可控时&#xff0c;那么用户就可以注入 payload&#xff0c;进行反序列化的时候就可能触发对象中…

【iOS】AutoreleasePool自动释放池的实现原理

目录 ARC与MRC项目中的main函数自动释放池autoreleasepool {}实现原理AutoreleasePoolPage总结 objc_autoreleasePoolPush的源码分析autoreleaseNewPageautoreleaseFullPageautoreleaseNoPage autoreleaseFast总结 autorelease方法源码分析objc_autoreleasePoolPop的源码分析po…

Html详解——Vue基础

HTML是什么&#xff1f; 超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称&#xff1a;HTML&#xff09;是一种用来结构化 Web 网页及其内容的标记语言。网页内容可以是&#xff1a;一组段落、一个重点信息列表、也可以含有图片和数据表…

山海关古城信息管理测试--片区

1.片区的检验名称编号是否重复 1.1controller添加两个方法&#xff0c;检验片区编号和检验片区名称 作用为&#xff1a;调用方法判断片区编号与片区名称是否重复&#xff0c;并返回返回值 /*** 检验片区编号是否重复*/PostMapping( "/checkPqbhUnique")ResponseBody…