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

news2024/11/16 10:34:49

文章目录

  • 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 {

    @Test
    public 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();

    }

    @Test
    public void MyServer() throws IOException {
        //1、准备一个ServerSocker
        ServerSocket 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、如果不在接收任何客户端通信,可以关闭ServerSocker
        serverSocket.close();
    }
}

5.2 实现结果

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

6 更多案例分析

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

代码位置:代码仓库链接

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

代码位置:代码仓库链接

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

代码位置:代码仓库链接

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

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

相关文章

cgroup基础介绍

一项新概念的产生,必然有其原因,cgroup也不例外,最初由谷歌工程师Paul Menage和Rohit Seth提出【1】:因为计算机硬件能力越来越强大,为了提高机器的使用效率,可以在同一台机器上运行不同运算模型的工作。开…

安卓---第5章 数据存储---保存QQ账号与密码

文章目录案例1: 使用文件存储 保存QQ账号与密码功能描述saveqq_1.xmlFileSaveQQ.javasaveqq_1案例2 使用SP保存QQ账号与密码功能描述SPSaveQQ.java其他代码1. 数据存储方式2. 文件存储将数据存入文件中内部存储:外部存储:从文件中读取数据读取内部存储读…

信息系统服务管理

一、信息系统服务业及发展二、信息系统工程监理的概念及发展三、信息系统运行维护的概念和发展 IT服务管理(ITSM) 四、信息技术服务管理的标准和框架 IT服务标准体系(ITSS) 一、信息系统服务业及发展 总结:前景很好 二、信息系…

计网传输层协议:UDP和TCP

文章目录一. 应用层和传输层的联系二. UDP协议三. TCP协议1. TCP报头介绍2. TCP实现可靠传输的核心机制2.1 确认应答2.2 超时重传3. 连接管理(三次握手, 四次挥手)3.1 建立连接(三次握手)3.2 断开连接(四次挥手)4. 滑动窗口5. 流量控制6.拥塞控制7. 延时应答8. 捎带应答9. 面向…

5.InfluxDB定时任务与报警

定时任务 InfluxDB的定时任务本质上是定时执行一个Flux脚本,一般回先查询数据再聚合修改最后可以写回另外一个bucket中 常用的定时任务使用场景 降采样 : 如果数据的输入频率特别快比如IOT温度计设备每秒往InfluxDB写入一条数据会有大量的数据写入一个InfluxDB的bucket (因为…

kubernetes教程 --Pod详解

Pod详解 每个Pod中都可以包含一个或者多个容器,这些容器可以分为两类: 用户程序所在的容器,数量可多可少 Pause容器,这是每个Pod都会有的一个根容器,它的作用有两个: 可以以它为依据,评估整个…

ADS仿真,3db均衡器是否可以补偿3db插入损耗?

背景高速信号走线经常会有走线超长的问题,走线过长带来的直接影响是对应的插入损耗IL会增加,当超过标准要求时需增加Redriver等补偿,最常用的调整时增加预加重和去加重。而调整预加重时首先遇到的一个问题是补偿多少db?是否3db的均衡就可以补…

剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

摘要 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 一、双指针解析 考虑定义双指针 i , j分列数组左右两端,循环执行: 指针 i从左向右寻找偶数;指针 j从右向左寻找奇数;将偶数nums[i]和奇数 nums[j]交换。 可始终保证&…

C#:Krypton控件使用方法详解(第六讲) ——kryptonTextBox

今天介绍的Krypton控件中的kryptonTextBox,下面开始介绍这个控件的属性:首先介绍的是外观属性:Cursor属性:表示鼠标移动过该控件的时候,鼠标显示的形状。属性值如下图所示:Lines属性:表示在显示…

HTML转EXE工具(HTML App Build)最新版

HTML转EXE工具(HTM2EXE)最初发布于2022-08-17。可以将Web前端转换成Windows32或者64的EXE执行程序。当时由于时间紧,未能进行优化,特别是浏览器采用的是IE内核,所以使用起来会有一些兼容性问题,当时就记录了…

万字长文讲述由ChatGPT反思大语言模型的技术精要

文|张俊林 源|知乎张俊林 导读:ChatGPT出现后惊喜或惊醒了很多人。惊喜是因为没想到大型语言模型(LLM,Large Language Model)效果能好成这样;惊醒是顿悟到我们对LLM的认知及发展理念&#xff0c…

机器学习笔记

一 1.类型 有监督:分类、回归 无监督:聚类、降维 2.挑战: 过拟合:泛化能力弱 欠拟合:模型过于简单 二、 1.开发流程 数据收集->数据清洗->特征工程->数据建模 2.选择性能指标: 回归问题 均方根…

node-sass@4.14.1 包含风险, 如何升级依赖至 dart-sass

文章目录需求我上网都查到了哪些信息在 github 看到了 node-sass 依赖的最新版本的列表:关于方案2的失败不同版本的 nodejs 和 node-sass依赖的**适配关系**从何得知替代方案——dart-sass如何安装 dart sass?需求 在做一个基于Node、React的前端项目&a…

这才是打开Java面试的正确方式,金三银四互联网大厂Java面试八股来袭

前言 招聘旺季已经到了,不知道大家是否准备好了,面对金三银四的招聘旺季,如果没有精心准备那笔者认为那是对自己不负责任;就我们 Java 程序员来说,多数的公司总体上面试都是以自我介绍项目介绍项目细节/难点提问基础知…

【LeetCode】剑指 Offer(3)

目录 写在前面: 题目:剑指 Offer 09. 用两个栈实现队列 - 力扣(Leetcode) 题目的接口: 解题思路: 代码: 过啦!!! 写在最后: 写在前面&…

追光进行时:沿着全光运力的新航道,加速驶向算力时代

2021年,工信部印发《新型数据中心发展三年行动计划(2021—2023年)》,明确指出“用3年时间,形成总体布局持续优化,全国一体化算力网络国家枢纽节点、省内数据中心、边缘数据中心梯次布局”,“算力…

LeetCode230218_148、654. 最大二叉树

给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums 构建的 最大二叉树…

页面置换算法

页面置换算法 在进程运行过程中,若需要访问的物理块不在内存中,就需要通过一定的方式来将页面载入内存,而此时内存很可能已无空闲空间,因此就需要一定的算法来选择内存中要被置换的页面,这种算法就被称为页面置换算法…

redis容器部署及相关配置文件解释

背景:我们项目上的redis除了几个核心业务的集群部署是用二进制部署的,其他环境基本都是容器部署。所以整理了一下redis容器相关的配置。docker-compose部署的配置version: 3services:redis:image: redis:6.2.5container_name: redisrestart: alwaysports…

springmvc+jsp电影院购票售票选座推荐网站java ssm

本电影购票推荐网站以SSM作为框架,B/S模式以及MySql作为后台运行的数据库。本系统主要包括以下功能模块:个人中心、用户管理、电影信息管理、电影类型管理、影院信息管理、系统管理、订单管理等模块,通过这些模块的实现能够基本满足日常电影购…