socket网络编程-TC/IP方式

news2025/1/11 17:20:18

网络编程

1.概念:两台设备之间通过网络数据传输。
2.网络通信:将数据通过网络从一台设备传输另外一台设备。
3.java.net包下提供了一系列的类和接口,提供程序员使用,完成网络通信。
在这里插入图片描述

TCP和UDP

TCP协议:
1.使用TCP协议前,需建立TCP连接,形成传输数据通道。
2.传输前,采用“三次握手”方式,是可靠的。
3.TCP协议进行通信的两个应用进程:客户端、服务端。
4.在连接中可进行大数据量的传输。

UDP协议:
1.将数据、源、目的封装成数据包,不需要建立连接
2.每个数据报的大小限制在64Kb内
3.因无需连接,故是不可靠的
4.发送数据结束时无需释放资源,速度快。
5.举例:发短信

介绍java.net中的工具类

在这里插入图片描述

Socket介绍

1.套接字(Socket)开发网络应用程序被广泛,以至于成为事实上的标准。
2.通信额两端都要有Socket,是两台机器通信的端点。
3.网络通信其实是Socket间的通信。
4.Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输。
5.一般主动发起通信的应用程序属于客户端,等待通信请求的为服务端。
在这里插入图片描述
当我们需要通讯时(读写数据),客户端和服务端分别使用以下两个方法。
1.socket.getOutputSream()
2.socket.getInputStream()
在这里插入图片描述
Socket有TCP编程和UDP编程。

TCP网络通信编程的案例

要求:
1.编写一个服务器端和客户端。
2.服务器端在9999端口监听。
3.客户端连接到服务器,发送“Hello server”,然后退出。
4.服务器端接受到客户端发送的信息,输出,并退出。

思路

在这里插入图片描述
代码实现,客户端如下:

import java.io.IOException;
import java.io.OutputStream;
import java.net.*;

public class SocketClientTCP01 {

	public static void main(String[] args) {
		
	
		
		try {
			// 思路
			// 1.连接服务端
			// 解读:连接本机的9999,如果连接成功,返回socket对象
			Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
			System.out.print("服务 socket = " + socket.getClass());
			// 2. 连接上后,生成Socket,通过socket.getOutputStream()
			// 得到 和 socket对象关联的输出流对象 
			OutputStream outputStream = socket.getOutputStream();
			// 3.通过输出流,写入数据到据通道
			outputStream.write("hello , server ".getBytes());
			// 4. 关闭流
			outputStream.close();
			socket.close();
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

服务端如下:

import java.io.IOException;
import java.io.InputStream;
import java.net.*;
public class SocketServerTCP01 {
	public static void main(String[] args) {
		try {
            // 1.在本机的9999端口监听,等待连接
			//细节:一台主机只能有重复的端口存在
			//细节:ServerSocket可以通过accept()返回多个Socket[多个客户端]
			ServerSocket serverSocket =  new ServerSocket(9999);
			System.out.print("我在9999端口等待监听,等待连接");
            // 2.当没有客户端连接9999端口时,程序会阻塞,等待连接
			//如果有客户端连接,则会返回Socket对象,程序继续
			Socket socket = serverSocket.accept();
			System.out.print("服务端 socket = " + socket.getClass());
            // 3.通过socket.getInputStream(),读取客户端写入到数据通道的数据,显示
			InputStream input = socket.getInputStream();
			// 4.读取IO相关
			byte [] buf = new byte[1024];
			int readLen = 0 ; 
			while((readLen = input.read(buf)) != -1) {
				//根据读取到的实际长度,显示内容
				System.out.print(new String(buf , 0 , readLen));
			}
			input.close();
			socket.close();
				
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

案例,服务端与客户端相互发送
在这里插入图片描述
其中服务端 代码如下:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketTCP02Server {

    public static void main(String[] args) {
        try {
            // 1.在本机的9999端口监听,等待连接
            //细节:一台主机只能有重复的端口存在
            //细节:ServerSocket可以通过accept()返回多个Socket[多个客户端]
            ServerSocket serverSocket =  new ServerSocket(9999);
            System.out.print("我在9999端口等待监听,等待连接 \n");
            // 2.当没有客户端连接9999端口时,程序会阻塞,等待连接
            //如果有客户端连接,则会返回Socket对象,程序继续
            Socket socket = serverSocket.accept();
            System.out.print("服务端 socket = " + socket.getClass() + "\n");
            // 3.通过socket.getInputStream(),读取客户端写入到数据通道的数据,显示
            InputStream input = socket.getInputStream();
            // 4.读取IO相关
            byte [] buf = new byte[1024];
            int readLen = 0 ;
            while((readLen = input.read(buf)) != -1) {
                //根据读取到的实际长度,显示内容
                System.out.print(new String(buf , 0 , readLen));
            }
            // 获取socket相关的输出流
            OutputStream outputStream = socket.getOutputStream();
            outputStream.write("hello , client ".getBytes());

            socket.shutdownOutput();
            //关闭资源
            input.close();
            socket.close();
            outputStream.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端程序为:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class SocketTCP02Client {
    public static void main(String[] args) {
        try {
            // 思路
            // 1.连接服务端
            // 解读:连接本机的9999,如果连接成功,返回socket对象
            Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
            System.out.print("服务 socket = " + socket.getClass() + "\n");
            // 2. 连接上后,生成Socket,通过socket.getOutputStream()
            // 得到 和 socket对象关联的输出流对象
            OutputStream outputStream = socket.getOutputStream();
            // 3.通过输出流,写入数据到据通道
            outputStream.write("hello , server ".getBytes());
            //发送结束标志  半双工吗?
            socket.shutdownOutput();
            //4.获取和socket关联的输入流,读取数据(byte),并显示

            InputStream inputStream = socket.getInputStream();

            // 4.读取IO相关
            byte [] buf = new byte[1024];
            int readLen = 0 ;
            while((readLen = inputStream.read(buf)) != -1) {
                //根据读取到的实际长度,显示内容
                System.out.print(new String(buf , 0 , readLen));
            }
            // 5. 关闭流
            inputStream.close();
            outputStream.close();
            socket.close();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

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

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

相关文章

RabbitMQ基本介绍及简单上手

(一)什么是MQ MQ(message queue)本质上是队列,满足先入先出,只不过队列中存放的内容是消息而已,那什么是消息呢? 消息可以是字符串,json也可以是一些复杂对象 我们应用场…

【Rust自学】11.3. 自定义错误信息

喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 11.3.1. 添加错误信息 在 11.2. 断言(Assert) 中我们学习了assert!、assert_eq!和assert_ne!这三个宏,而这篇文章讲的就是它…

某漫画网站JS逆向反混淆流程分析

文章目录 1. 写在前面1. 接口分析2. 反混淆分析 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Pyth…

网络分析与监控:阿里云拨测方案解密

作者:俞嵩(榆松) 随着互联网的蓬勃发展,网络和服务的稳定性已成为社会秩序中不可或缺的一部分。一旦网络和服务发生故障,其带来的后果将波及整个社会、企业和民众的生活质量,造成难以估量的损失。 2020 年 12 月: Ak…

STL——二叉搜索树

目录 二叉搜索树的概念 ⼆叉搜索树的性能分析 ⼆叉搜索树的插⼊ ⼆叉搜索树的查找 ⼆叉搜索树的删除 中序遍历结果为升序序列 二叉搜索树的概念 ⼆叉搜索树⼜称⼆叉排序树,它或者是⼀棵空树,或者是具有以下性质的⼆叉树 • 若它的左⼦树不为空&#…

【文件I/O】UNIX文件基础

IO编程的本质是通过 API 操作 文件。 什么是 IO I - Input 输入O - Output 输出 这里的输入和输出都是站在应用(运行中的程序)的角度。外部特指文件。 这里的文件是泛指,并不是只表示存在存盘中的常规文件。还有设备、套接字、管道、链接…

VS调试MFC进入系统源代码配置

调试MFC代码有时候能进入MFC的源代码,有时候不能.之前一直没有深入研究.后面经过查资料发现每次调试必能进入源代码的配置.很简单,只需要3步. 1.打开工具->选项->调试->符号,勾选Microsoft符号服务器. 2.打开项目->属性->配置属性->常规,MFC的使用修改成&qu…

车载网络:现代汽车的数字心跳

在汽车领域,“智能汽车”一词毫不夸张。如今的汽车已不再是原始的机械工程,而是通过先进的车载网络无缝连接的精密数字生态系统。这些滚动计算机由复杂的电子控制单元(ECU)网络提供动力,ECU是负责管理从发动机性能到信息娱乐系统等一切事务的…

mycat介绍与操作步骤

文章目录 1.分库分表2.mycat 入门2.1 概述2.2 案例:水平分表1)准备工作2)配置3)启动并测试 3.mycat 配置详解3.1 schema.xml3.2 rule.xml3.3 server.xml 4.mycat 分片:垂直拆分1)准备工作2)配置…

【Python】Python之Selenium基础教程+实战demo:提升你的测试+测试数据构造的效率!

这里写目录标题 什么是Selenium?Selenium基础用法详解环境搭建编写第一个Selenium脚本解析脚本脚本执行结果常用的元素定位方法常用的WebDriver方法等待机制 Selenium高级技巧详解页面元素操作处理弹窗和警告框截图和日志记录多窗口和多标签页操作 一个实战的小demo…

Apache XMLBeans 一个强大的 XML 数据处理框架

Apache XMLBeans 是一个用于处理 XML 数据的 Java 框架,它提供了一种方式将 XML Schema (XSD) 映射到 Java 类,从而使得开发者可以通过强类型化的 Java 对象来访问和操作 XML 文档。下面将以一个简单的案例说明如何使用 Apache XMLBeans 来解析、生成和验…

带格式 pdf 翻译

支持 openAI 接口,国内 deepseek 接口兼容 openAI 接口, deepseek api 又非常便宜 https://pdf2zh.com/ https://github.com/Byaidu/PDFMathTranslate

ubuntu22.04降级安装CUDA11.3

环境:主机x64的ubuntu22.04,原有CUDA12.1,但是现在需要CUDA11.3,本篇文章介绍步骤。 一、下载CUDA11.3的run文件 下载网址:https://developer.nvidia.com/cuda-11-3-1-download-archive?target_osLinux&target_…

9 异常

如果你希望在软件调试上有所突破,或者想了解如何通过异常进行反调试,或者想自己写一个调试器,那么就必须要深入了解异常,异常与调试是紧密相连的,异常是调试的基础。 异常产生后,首先是要记录异常信息(异常的类型、异常发生的位置等),然后要寻找异常的处理函数,我们…

springBoot整合ELK Windowsb版本 (elasticsearch+logstash+kibana)

springBoot整合ELK Windowsb版本 【elasticsearchlogstashkibana】 下载软件启动服务1、elasticsearch2、kibana3、logstash 集成springboot1、添加依赖2、在logback.xml添加相关配置3、修改logstash 配置4、重启logstash 最后测试 下载软件 elasticsearch 官网 https://www.…

详解Sonar与Jenkins 的集成使用!

本文阅读前提 本文假设读者熟悉Jenkins和SonarQube的基础操作。 核心实现功能 Jenkins中运行的job来调用SonarScanner,最后可实现测试结果与SonarQube中同步查看。 Jenkins中安装Sonar相关插件 配置Sonarqube Dashboard>Manage Jenkins>Systems 指定son…

鸿蒙面试 2025-01-10

写了鉴权工具,你在项目中申请了那些权限?(常用权限) 位置权限 : ohos.permission.LOCATION_IN_BACKGROUND:允许应用在后台访问位置信息。 ohos.permission.LOCATION:允许应用访问精确的位置信息…

php 使用simplexml_load_string转换xml数据格式失败

本文介绍如何使用php函数解析xml数据为数组。 <?php$a <xml><ToUserName><![CDATA[ww8b77afac71336111]]></ToUserName><FromUserName><![CDATA[sys]]></FromUserName><CreateTime>1736328669</CreateTime><Ms…

【多空资金博弈】综合副图指标,资金做多线,短线做多雷达,中长线共振,大资金进场会涨等技术信号

如上图&#xff0c;副图指标【多空资金博弈】&#xff0c;红线做多资金线&#xff0c;绿色线为做空资金线&#xff0c;紫色柱线为短线做多雷达信号&#xff0c;紫色圆柱叠加文字为大资金进场信号&#xff0c;堆量柱线和紫色空心柱线为底部吸筹建仓信号&#xff0c;三条横向虚线…

Win11家庭版转专业版

Win11家庭版转专业版&#xff08;亲测有效&#xff09; 第一步 【断网】输入这个密钥&#xff1a; R8NJ8-9X7PV-C7RCR-F3J9X-KQBP6 第二步 点击下一步会自动重启 第三步 【联网】输入这个密钥&#xff1a; F3NWX-VFMFC-MHYYF-BCJ3K-QV66Y 注意 两次输入密钥的地方一致 …