TCP编程案例

news2024/12/27 6:54:04

笔记:(本题可能需要的)

TCP协议:

TCP协议进行通信的两个应用进程:客户端、服务端。

使用TCP协议前,须先建立TCP连接,形成基于字节流的传输数据通道

传输前,采用“三次握手”方式,点对点通信,是可靠的

传输完毕,需释放已建立的连接,效率低

在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠

在发送数据结束后,释放连接时需要经过四次挥手

Socket类

网络上具有唯一标识的IP地址和端口号组合在一起构成唯一能识别的标识符套接字(Socket)

Socket相关类API

   ServerSocket类

ServerSocket类的构造方法:

ServerSocket(int port) :创建绑定到特定端口的服务器套接字。

ServerSocket类的常用方法:

Socket accept():侦听并接受到此套接字的连接。

     Socket类

Socket类的常用构造方法

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

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

   Socket类的常用方法

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

public OutputStream getOutputStream():返回此套接字的输出流,可以用于发送消息

public void close():关闭此套接字。套接字被关闭后,便不可在以后的网络连接中使用(即无法重新连接或重新绑定)。需要创建新的套接字对象。 关闭此套接字也将会关闭该套接字的 InputStream 和 OutputStream。

例题1:客户端发送内容给服务端,服务端将内容打印到控制台上。
     注意点:先启动服务端,在启动客户端
           这里的IP地址和端口号使用自己电脑的
           查询IP地址:在运行框输入ipconfig
           查询端口号:在运行框输入netstas -ano
客户端创建步骤:
》1创建一个Socket
      创建一个IP地址,创建一个端口号;Socket是由IP地址和端口号组合在一起组合在一起的;----------IP地址和端口号都是服务端的
      将IP地址和端口号传入Socket构造器中,创建Socket对象(即创建一个流套接字)
》发送数据
      通过Socket对象调用getOutputStream()方法------返回此套接字的输出流
      通过输出流对象调用write()方法--------书写要发送的信息
》关闭资源(在关闭前都要判断该对象是否创建成功)
      关闭流资源
      关闭流套接字资源
  @Test// 客户端
    public void client() throws IOException {
        Socket socket = null;
        OutputStream os = null;
        try {
            //创建一个Socket
            InetAddress inetAddress = InetAddress.getByName("192.168.242.33");//声明对方的IP地址
            int port=10620;//声明对方的端口号
            socket = new Socket(inetAddress, port);
            //发送数据
            os = socket.getOutputStream();
            os.write("你好,我是客户端,请多多关照".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭Socket
            try {
                if(socket!=null)
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(os!=null)
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
服务端创建步骤
》创建一个ServerSocket(即创建绑定到特定端口的服务器套接字)
》调用accept(),接受客户端的Socket
      通过前面ServerSocket的对象调用accept()方法(阻塞式方法)-----------侦听并接受到此套接字的连接。
      调用accept()方法返回的是一个Socket类的对象--------表示连接成功,接受客户端的Socket
》接收数据
      通过前面得到的Socket的对象来调用getInputStream()------------得到流对象
      通过流的对象来读取数据
》关闭资源(在关闭前都要判断该对象是否创建成功)
      关闭ServerSocket资源
      关闭Socket资源
      关闭流资源
 @Test//服务端
    public void server() throws IOException {
        ServerSocket serverSocket = null;
        Socket socket = null;//阻塞式的方法
        InputStream is = null;
        try {
            //创建一个ServerSocket
            int port=10620;
            serverSocket = new ServerSocket(port);
            //调用accept(),接受客户端的Socket
            socket = serverSocket.accept();
            //接收数据
            is = socket.getInputStream();
            byte[] buffer=new byte[1024];
            int len;
            ByteArrayOutputStream baos = new ByteArrayOutputStream();//内部维护了一个byte数组
            while ((len=is.read(buffer))!=-1){
                //错误的
//                String str = new String(buffer, 0, len);
//                System.out.println(str);
                //正确的
                baos.write(buffer,0,len);
            }
            System.out.println(baos.toString());
            System.out.println("数据接收完毕");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭Socket,ServerSocket,流
            try {
                if(socket!=null)
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(serverSocket!=null)
                serverSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(is!=null)
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

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

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

相关文章

数据结构初阶之顺序表的介绍与动态顺序表的实现

一、线性表 线性表(linear list)是由 n 个具有相同特性的数据元素组成的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构,也就说是连续…

学习日志020---qt信号与槽

作业 import sysfrom PySide6.QtWidgets import QApplication, QWidget,QPushButton,QLineEditfrom Form import Ui_Form from second import Ui_second from PySide6.QtCore import Qtclass MyWidget(QWidget,Ui_Form):def __init__(self):super().__init__()self.setupUi(se…

大语言模型技术相关知识-笔记整理

系列文章目录 这个系列攒了很久。主要是前段之间面试大语言模型方面的实习(被拷打太多次了),然后每天根据面试官的问题进行扩展和补充的这个笔记。内容来源主要来自视频、个人理解以及官方文档中的记录。方便后面的回顾。 文章目录 系列文章…

9.13[debug]

这个错误表明 Git 尝试通过 HTTPS 协议连接到 Gitee 上的仓库时,实际上却尝试连接到了本地的 127.0.0.1(即 localhost)的 7890 端口,这通常是因为 HTTP 代理配置错误或全局 Git 配置中的代理设置不正确 如果这些命令返回了代理设…

Android笔记(三十四):onCreate执行Handler.post在onResume后才能执行?

背景 偶然发现一个点,就是在onCreate执行Handler.post在onResume后才执行,以下是测试代码 多次运行的结果一致,为什么execute runnable不是在onCreate和onResume之间执行的呢,带着疑问撸了一遍Activity启动流程 关键源码分析 …

Python基于 Opencv+wxPython 的人脸识别上课考勤系统,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

Alogrithm:费式数列

1. 说明 Fibonacci 为1200年代的欧洲数学家,在他的著作中曾经提到:「若有一只免子每个月生一只小免子,一个月后小免子也开始生产。起初只有一只免子,一个月后就有两只免子,二个月后有三只免子,三个月后有五…

【机器学习】机器学习的基本分类-监督学习-决策树-CART(Classification and Regression Tree)

CART(Classification and Regression Tree) CART(分类与回归树)是一种用于分类和回归任务的决策树算法,提出者为 Breiman 等人。它的核心思想是通过二分法递归地将数据集划分为子集,从而构建一棵树。CART …

[高阶数据结构七]跳表的深度剖析

1.前言 跳表是一种查找结构,它有着与红黑树、AVL树和哈希表相同的作用,那么已经学习了红黑树和哈希表这种效率高的数据结构,那么为什么还需要学习跳表呢?--请听我娓娓道来。 本章重点: 本章着重讲解跳表的概念&#x…

基于MATLAB的信号处理工具:信号分析器

信号(或时间序列)是与特定时间相关的一系列数字或测量值,不同的行业和学科将这一与时间相关的数字序列称为信号或时间序列。生物医学或电气工程师会将其称为信号,而统计学家或金融定量分析师会使用时间序列这一术语。例如&#xf…

Linux Shell 脚本:一键在 Ubuntu 系统中打开和关闭网络代理

文章目录 shell脚本使用说明验证设置 shell脚本 以下是一个简单的 Shell 脚本&#xff0c;用于在 Ubuntu 系统中打开和关闭网络代理开关 #!/bin/bash# 检查传入的参数 if [ "$#" -ne 1 ]; thenecho "Usage: $0 <1|0>"echo "1: Enable proxy (…

Android ConstraintLayout 约束布局的使用手册

目录 前言 一、ConstraintLayout基本介绍 二、ConstraintLayout使用步骤 1、引入库 2、基本使用&#xff0c;实现按钮居中。相对于父布局的约束。 3、A Button 居中展示&#xff0c;B Button展示在A Button正下方&#xff08;距离A 46dp&#xff09;。相对于兄弟控件的约束…

【AI工具】强大的AI编辑器Cursor详细使用教程

目录 一、下载安装与注册 二、内置模型与配置 三、常用快捷键 四、项目开发与问答 五、注意事项与技巧 参考资料 近日&#xff0c;由四名麻省理工学院&#xff08;MIT&#xff09;本科生共同创立的Anysphere公司宣布&#xff0c;其开发的AI代码编辑器Cursor在成立短短两年…

Linux-GPIO应用编程

本章介绍应用层如何控制 GPIO&#xff0c;譬如控制 GPIO 输出高电平、或输出低电平。 只要是用到GPIO的外设&#xff0c;都有可能用得到这些操作方法。 照理说&#xff0c;GPIO的操作应该是由驱动层去做的&#xff0c;使用寄存器操作或者GPIO子系统之类的框架。 但是&#xff0…

前端开发 之 15个页面加载特效下【附完整源码】

文章目录 十二&#xff1a;铜钱3D圆环加载特效1.效果展示2.HTML完整代码 十三&#xff1a;扇形百分比加载特效1.效果展示2.HTML完整代码 十四&#xff1a;四色圆环显现加载特效1.效果展示2.HTML完整代码 十五&#xff1a;跷跷板加载特效1.效果展示2.HTML完整代码 十二&#xff…

STM32 DMA直接存储器存取原理及DMA转运模板代码

DMA简介&#xff1a; 存储器映像&#xff1a; 注意&#xff1a;FLASH是只读的&#xff0c;DMA不能写入&#xff0c;但是可以读取写到其他存储器里 变量是存在运行内存SRAM里的&#xff0c;常量&#xff08;const&#xff09;是放在程序存储器FLASH里的 DMA框图&#xff1a; …

transformers实现一个检索机器人(一)

简介 检索机器人是一种能够自动搜索和提供信息的系统&#xff0c;它可以帮助我们快速找到需要的信息。这类机器人通常使用自然语言处理&#xff08;NLP&#xff09;技术来理解用户的查询&#xff0c;并利用搜索引擎或数据库来获取相关信息。 那么我们要通过transforme实现什么…

开源ISP介绍(2)————嵌入式Vitis搭建

Vivado搭建参考前一节Vivado基于IP核的视频处理框架搭建&#xff1a; 开源ISP介绍&#xff08;1&#xff09;——开源ISP的Vivado框架搭建-CSDN博客 导出Hardware 在vivado中导出Hardware文件&#xff0c;成功综合—实现—生成比特流后导出硬件.xsa文件。&#xff08;注意导…

力扣-图论-2【算法学习day.52】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非…

【PlantUML系列】序列图(二)

目录 一、参与者 二、消息交互顺序 三、其他技巧 3.1 改变参与者的顺序 3.2 使用 as 重命名参与者 3.3 注释 3.4 页眉和页脚 一、参与者 使用 participant、actor、boundary、control、entity 和 database 等关键字来定义不同类型的参与者。例如&#xff1a; Actor&…