当前位置: 首页 > news >正文

一文讲明TCP网络编程、Socket套接字的讲解使用、网络编程案例

文章目录

  • 1 Socket讲解
  • 2 基于Socket的TCP编程
  • 3 客户端Socket的工作过程包含以下四个基本的步骤
    • 3.1 客户端创建Socket对象
  • 4 服务器程序的工作过程包含以下四个基本的步骤:
    • 4.1 服务器建立`ServerSocket`对象
  • 5 案例实现 客户端和服务端通信
    • 5.1 代码实现
    • 5.2 实现结果
  • 6 更多案例分析
    • 6.1 客户端发送信息给服务端,服务端将数据显示在控制台上
    • 6.2 客户端发送文件给服务端,服务端将文件保存在本地
    • 6.3 从客户端发送文件给服务端,服务端保存到本地。并返回“发送成功”给客户端

三连哦

1 Socket讲解

  • 利用套接字(Socket)开发网络应用程序早已被广泛的采用,以至于成为事实

上的标准。

  • 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标

识符套接字。

  • 通信的两端都要有Socket,是两台机器间通信的端点。

  • 网络通信其实就是Socket间的通信。

  • Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输。

  • 一般主动发起通信的应用程序属客户端,等待通信请求的为服务端。

  • Socket分类:

    • 1、流套接字(stream socket):使用TCP提供可依赖的字节流服务。
    • 2、 数据报套接字(datagram socket):使用UDP提供“尽力而为”的数据报服务

Socket类的常用构造器:

  • public Socket(InetAddress address,int port) :创建一个流套接字并将其连接到指定 IP 地址的指定端口号。

  • public Socket(String host,int port):创建一个流套接字并将其连接到指定主机上的指定端口号。

Socket类的常用方法:

  • public InputStream getInputStream():返回此套接字的输入流。可以用于接收网络消息

  • public OutputStream getOutputStream()返回此套接字的输出流。可以用于发送网络消息

  • public InetAddress getInetAddress():此套接字连接到的远程 IP 地址;如果套接字是未连接的,则返回 null。

  • public InetAddress getLocalAddress():获取套接字绑定的本地地址。 即本端的IP地址

  • public int getPort():此套接字连接到的远程端口号;如果尚未连接套接字,则返回 0。

  • public int getLocalPort():返回此套接字绑定到的本地端口。 如果尚未绑定套接字,则返回 -1。即本端的

端口号。

  • public void close():关闭此套接字。套接字被关闭后,便不可在以后的网络连接中使用(即无法重新连接

或重新绑定)。需要创建新的套接字对象。 关闭此套接字也将会关闭该套接字的 InputStream

OutputStream

  • public void shutdownInput():如果在套接字上调用 shutdownInput() 后从套接字输入流读取内容,则流将

返回 EOF(文件结束符)。 即不能在从此套接字的输入流中接收任何数据。

  • public void shutdownOutput()禁用此套接字的输出流。对于 TCP 套接字,任何以前写入的数据都将被发

送,并且后跟 TCP 的正常连接终止序列。 如果在套接字上调用 shutdownOutput() 后写入套接字输出流,

则该流将抛出 IOException。 即不能通过此套接字的输出流发送任何数据。

2 基于Socket的TCP编程

Java语言的基于套接字编程分为服务端编程和客户端编程,其通信模型如图所示:

在这里插入图片描述

3 客户端Socket的工作过程包含以下四个基本的步骤

  • 创建 Socket:根据指定服务端的 IP 地址或端口号构造 Socket 类对象。若服务器端响应,则建立客户端到服务器的通信线路。若连接失败,会出现异常。

  • 打开连接到 Socket的输入/出流: 使用 getInputStream()方法获得输入流,使用

getOutputStream()方法获得输出流,进行数据传输

  • 按照一定的协议对Socket进行读写操作:通过输入流读取服务器放入线路的信息

(但不能读取自己放入线路的信息),通过输出流将信息写入线程。

  • 关闭Socket:断开客户端到服务器的连接,释放线路

3.1 客户端创建Socket对象

  • 客户端程序可以使用Socket类创建对象,创建的同时会自动向服务器方发起连接。Socket的构造器是:

    • Socket(String host,int port)throws UnknownHostException,IOException:向服务器(域名是host端口号为port)发起TCP连接,若成功,则创建Socket对象,否则抛出异常。

    • Socket(InetAddress address,int port)throws IOException:根据InetAddress对象所表示的

      IP地址以及端口号port发起连接

  • 客户端建立socketAtClient对象的过程就是向服务器发出套接字连接请求

在这里插入图片描述

4 服务器程序的工作过程包含以下四个基本的步骤:

  • 调用ServerSocket(int port):创建一个服务器端套接字,并绑定到指定端口上。用于监听客户端的请求。

  • 调用 accept():监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字对象。

  • 调用 该Socket类对象的 getOutputStream()getInputStream ()获取输出流和输入流,开始网络数据的发送和接收。

  • 关闭ServerSocketSocket对象:客户端访问结束,关闭通信套接字

4.1 服务器建立ServerSocket对象

  • ServerSocket 对象负责等待客户端请求建立套接字连接,类似邮局某个窗口

    中的业务员。也就是说,服务器必须事先建立一个等待客户请求建立套接字

    连接的ServerSocket对象。

  • 所谓“接收”客户的套接字请求,就是accept()方法会返回一个 Socket 对象

在这里插入图片描述

5 案例实现 客户端和服务端通信

基本思路:

  • 客户端和服务端建立连接
  • 发送接收数据进行通信
  • 关闭连接

具体实现的过程:(提示:需要客户端先发送数据给服务端,服务端在接收数据后,发送数据给客户端,然后客户端接收数据。如果客户端先接收数据后发送数据,会阻塞)

在这里插入图片描述

5.1 代码实现


import org.junit.Test;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;/*** @author zyz* @version 1.0* @data 2023/2/18 12:39* @Description:*/
public class TCPTest4 {@Testpublic void Myclient() throws IOException {//1、准备Scoket,连接服务器,需要指定服务器的IP地址和端口号Socket socket = new Socket("127.0.0.1", 8888);//3、获取输出流,用来发送数据给服务器OutputStream outputStream = socket.getOutputStream();//2、获取输入流,用来接收服务器发给客户端的数据InputStream inputStream = socket.getInputStream();//4、通信//发送数据outputStream.write("你好,我是客户端发来的数据".getBytes());outputStream.flush();socket.shutdownOutput();//会在流末写一个“流的末尾”标记,对方才能读到-1,否则对方的读取方法会一直阻塞//4、接收byte[] data = new byte[1024];int len;while ((len = inputStream.read(data)) != -1) {System.out.println(new String(data, 0, len));}//5、关闭socket,不再与服务器通信,即断开与服务器的连接//socker关闭,意味着InputStream和OutputStrem也关闭了socket.close();}@Testpublic void MyServer() throws IOException {//1、准备一个ServerSockerServerSocket serverSocket = new ServerSocket(8888);//2、监听一个客户端的连接。accept()是一个阻塞的方法,如果没有客户端连接,将一直等待Socket socket = serverSocket.accept();System.out.println("一个客户端连接成功");//3、获取输出流,用来发送数据给客户端OutputStream outputStream = socket.getOutputStream();//获取输入流,用来接收客户端发送给服务器的数据InputStream inputStream = socket.getInputStream();//4、通信//接收数据byte[] data = new byte[1024];int len;while ((len=inputStream.read(data))!=-1){System.out.println(new String(data,0,len));}//发送数据outputStream.write("我是服务端发来的信息".getBytes());outputStream.flush();socket.shutdownOutput();//socker关闭,意味着InputStream和OutputStrem也关闭了socket.close();//6、如果不在接收任何客户端通信,可以关闭ServerSockerserverSocket.close();}
}

5.2 实现结果

在这里插入图片描述
在这里插入图片描述

6 更多案例分析

6.1 客户端发送信息给服务端,服务端将数据显示在控制台上

代码位置:代码仓库链接

6.2 客户端发送文件给服务端,服务端将文件保存在本地

代码位置:代码仓库链接

6.3 从客户端发送文件给服务端,服务端保存到本地。并返回“发送成功”给客户端

代码位置:代码仓库链接

相关文章:

一文讲明TCP网络编程、Socket套接字的讲解使用、网络编程案例

文章目录1 Socket讲解2 基于Socket的TCP编程3 客户端Socket的工作过程包含以下四个基本的步骤3.1 客户端创建Socket对象4 服务器程序的工作过程包含以下四个基本的步骤:4.1 服务器建立ServerSocket对象5 案例实现 客户端和服务端通信5.1 代码实现5.2 实现结果6 更多…...

Java中print和println的区别

1 问题在最开始学习Java的时候学到soutenter键可以输出结果,显示的是System.out.println();而在Python中是直接使用print。那么在Java中print和println有什么区别?2 方法Print输出会自动将括号中的内容转换成字符串输出,如果括号中…...

RocketMq使用规范(纯技术和实战建议)

概述: 使用规范主要从,生产、可靠性、和消费为轴线定义使用规范;kafka使用核心:削峰、解耦、向下游并行广播通知(无可靠性保证)和分布式事务,本规范仅从削峰、解耦、向下游并行广播通知论述&am…...

matlab离散系统仿真分析——电机

目录 1.电机模型 2.数字PID控制 3.MATLAB数字仿真分析 3.1matlab程序 3.2 仿真结果 4. SIMULINK仿真分析 4.1simulink模型 4.2仿真结果 1.电机模型 即: 其中:J 0.0067;B 0.10 2.数字PID控制 首先我们来看一下连续PID&#xff1…...

一文学会进程控制

目录进程的诞生fork函数fork的本质fork的常规用法fork调用失败的原因进程的死亡进程退出的场景常见的进程退出方法正常终止(代码跑完)echo $?main函数返回调用exit调用_exitexit和_exit的区别进程等待进程等待的重要性进程等待的函数waitwaitpid进程退出…...

5.2 BGP水平分割

5.2.2实验2&#xff1a;BGP水平分割 1. 实验目的 熟悉BGP水平分割的应用场景掌握BGP水平分割的配置方法 2. 实验拓扑 实验拓扑如图5-2所示&#xff1a; 图5-2&#xff1a;BGP水平分割 3. 实验步骤 &#xff08;1&#xff09;配置IP地址 R1的配置 <Huawei>…...

华为OD机试 - TLV 编码 | 备考思路,刷题要点,答疑 【新解法】

最近更新的博客 【新解法】华为OD机试 - 关联子串 | 备考思路,刷题要点,答疑,od Base 提供【新解法】华为OD机试 - 停车场最大距离 | 备考思路,刷题要点,答疑,od Base 提供【新解法】华为OD机试 - 任务调度 | 备考思路,刷题要点,答疑,od Base 提供【新解法】华为OD机试…...

【C语言每日一题】——猜名次

【C语言每日一题】——猜名次&#x1f60e;前言&#x1f64c;猜名次&#x1f64c;解题思路分享&#xff1a;&#x1f60d;解题源码分享&#xff1a;&#x1f60d;总结撒花&#x1f49e;&#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&#xff1a;全神…...

Agilent E4982A、Keysight E4982A、LCR 表,1 MHz 至 3 GHz

Agilent E4982A、Keysight E4982A、HP E4982A LCR 表&#xff0c;1 MHz 至 3 GHz 产品概览 KEYSIGHT E4982A&#xff08;安捷伦&#xff09; Keysight E4982A LCR 表为需要高频&#xff08;1 MHz 至 3 GHz&#xff09;阻抗测试的无源元件制造行业提供一流的性能&#xff0c…...

SAP 系统的配置传输

在SAP项目的实施过程中&#xff0c;经常会遇到关于配置传输的问题。即我们在某个client下面做系统配置&#xff0c;配好了之后再传到其他系统之中。 配置传输分为两种情况&#xff1a;同服务器配置传输&#xff0c;异服务器配置传输。同服务器配置传输&#xff1a; 在DEV配置cl…...

华为OD机试 - 喊七(Python)

喊七 题目 喊 7,是一个传统的聚会游戏, N 个人围成一圈,按顺时针从1 - 7编号, 编号为1的人从1开始喊数, 下一个人喊得数字是上一个人喊得数字+1, 但是当将要喊出数字7的倍数或者含有7的话, 不能喊出,而是要喊过。 假定N个人都没有失误。 当喊道数字k时, 可以统计每…...

Docker下快速搭建RabbitMQ单例及集群

引子生命在于折腾&#xff0c;为上数据实时化用到了消息传送的内容&#xff0c;当时也和总公司人员商量选型&#xff0c;kafka不能区分分公司就暂定用了RbtMQ刚好个人也在研究容器及分布式部署相关内容就在docker上实践单机 docker&#xff08;要想快 先看问题 避免踩坑&#x…...

python代码写开心消消乐

♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放,树高千尺,落叶归根人生不易,人间真情 目录 一.python是什么 二.游戏代码效果呈现 三.主代...

【郭东白架构课 模块一:生存法则】09|法则四:为什么要顺应技术的生命周期?

你好&#xff0c;我是郭东白。今天我们来讲架构师的第四条生存法则&#xff0c;那就是尊重技术的生命周期。 人类的各种活动都要遵循事物的客观生命周期。不论是农业社会种田打渔&#xff0c;还是资本社会投资创业&#xff0c;行动太早或太晚&#xff0c;都会颗粒无收。技术也…...

Linux之进程控制

一.进程创建 1.1 fork函数 我们创建进程的方式有./xxx和fork()两种 在linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。 #include <unistd.h> pid_t fork(void); 返回值&#xff1a;自进程…...

SpringBoot社区版专业版带你配置热部署

&#x1f49f;&#x1f49f;前言 ​ 友友们大家好&#xff0c;我是你们的小王同学&#x1f617;&#x1f617; 今天给大家打来的是 SpringBoot社区版专业版带你配置热部署 希望能给大家带来有用的知识 觉得小王写的不错的话麻烦动动小手 点赞&#x1f44d; 收藏⭐ 评论&#x1…...

影响AFE采样精度的因素有哪些?

**AFE&#xff08;Analog Front End&#xff09;**是模拟前端电路的缩写&#xff0c;它是模拟信号传感器和数字信号处理器之间的连接点。AFE采样精度是指模拟信号被数字化后的准确度&#xff0c;对于很多电子设备来说&#xff0c;这是一个至关重要的性能指标。本文将介绍影响AF…...

mysqlbackup备份报error:redo log was overwritten

问题原因 备份时redo log被覆盖 解决方案 方法1&#xff1a;增加innodb_log_file_size、innodb_log_files_in_group大小&#xff0c;需要重启数据库 vi my.cnf innodb_log_file_size 2G innodb_log_files_in_group 4 方法2: 动态配置redo log archive&#xff0c;不需要重启…...

Android支持库

# 支持库 注意:Android 9.0(API 级别 28)发布后,新版支持库 AndroidX 也随之诞生,它属于 Jetpack。除了现有的支持库,AndroidX 库还包含最新的 Jetpack 组件。 您可以继续使用此支持库以往的工件(这里指的是版本 27 及更早版本,且已打包为 android.support.*)在 Googl…...

Vue:filters过滤器

日期、时间格式化是Vue前端项目中较为常遇到的一个需求点&#xff0c;此处&#xff0c;围绕Vue的过滤器来介绍如何更为优雅的解决此类需求。 过滤器filters使用注意点 Vue允许开发者自定义过滤器&#xff0c;可以实现一些常见的文本格式化等需求。 使用时要注意的点在于&#…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...