【网络编程】Java中的Socket
文章目录
- 前言
- socket是什么?
- Java中的Socket
- Java实现网络上传文件
前言
所谓Socket(套接字),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口。
套接字是通信的基石,是支持TCP/IP协议的路通信的基本操作单元。可以将套接字看作不同主机间的进程进行双间通信的端点,它构成了单个主机内及整个网络间的编程界面。
socket是什么?
一个数据包经由应用程序产生,进入到协议栈中进行各种报文头的包装,然后操作系统调用网卡驱动程序指挥硬件,把数据发送到对端主机。整个过程的大体的图示如下。
Socket 相当于是应用程序的大门,我们在网络中发送的报文都会经过这道大门才能够进入到应用程序中,让应用程序来使用报文中的数据。
要写网络程序就必须用Socket
- 通信的两端要有Socket,是两台机器间通信的端点
- 网络通信其实就是Socket间的通信
Java中的Socket
Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输,一般主动发起通信的应用程序属于客户端,等待通信请求的为服务端。
Java中的网络通信时通过Socket实现的,当我们需要通讯时(读写数据)
-
socket.getOutputStream():获取一个输出流
-
socket.getInputStream():获取一个输入流
客户端上的使用
- 客户端的Socket对象上的getOutputStream方法得到的输出流其实就是发送给服务器端的数据。
- 客户端的Socket对象上的getInputStream方法得到输入流其实就是从服务器端发回的数据。
服务器端上的使用
- 服务端的Socket对象上的getOutputStream方法得到的输出流其实就是发送给客户端的数据。
- 服务端的Socket对象上的getInputStream方法得到的输入流其实就是从客户端发送给服务器端的数据流。
Socket有两种编程方式
- TCP编程(面向连接,可靠的)
- UDP编程(无连接,不可靠)
Socket工作流程图:
Java实现网络上传文件
编写一个服务端和一个客户端,要求在某端口监听(端口可以自定义,前提是没有被占用,否则会报错)。客户端连接服务端,发送一张图片(本地磁盘的图片,可自定义);服务端收到客户端发来的图片,保存在服务端的项目工程目录src中(保存位置可自定义),之后发送收到图片并退出。客户端收到服务端发送的收到图片,在退出。
注意:理论上服务端和客户端的程序应该是在不同的机器上的,这里为了方便,使用了一台机器。所以使用了*InetAddress.getLocalHost() 获取本机IP,这里可以修改为其他主机IP地址
这里说一下用的部分知识点,如有疑问请自行百度进行查看
-
InetAddress.getLocalHost():获取本机的IP地址
-
serverSocket.accept():开始监听设置的端口,如果有连接则返回socket对象
-
BufferedOutputStream()和BufferedInputStream():字节处理流,包装
-
OutputStreamWriter(OutputStream o):将字节输出流转换为字符输出流
-
socket.shutdownInput()和socket.shutdownOutput分别为发送数据的输入/输出结束标记
-
注意:StreamUtils类是自定义的工具类,其中streamToByteArray是将文件输入流转换为字节数组文件数据;streamToString将文件输入流转换为字符串数据(具体定义代码在下方)
整体演示流程图如下:
这里需要注意:如果使用字符流进行输出,则需要刷新或关闭,才能写入数据(此案例使用的字节流)
StreamUtils工具类
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;/*** 此类用于演示关于流的读写方法**/
public class StreamUtils {/*** 功能:将输入流转换成byte[], 即可以把文件的内容读入到byte[]* @param is* @return* @throws Exception*/public static byte[] streamToByteArray(InputStream is) throws Exception{ByteArrayOutputStream bos = new ByteArrayOutputStream();//创建输出流对象byte[] b = new byte[1024];//字节数组int len;while((len=is.read(b))!=-1){//循环读取bos.write(b, 0, len);//把读取到的数据,写入bos }byte[] array = bos.toByteArray();//然后将bos 转成字节数组bos.close();return array;}/*** 功能:将InputStream转换成String* @param is* @return* @throws Exception*/public static String streamToString(InputStream is) throws Exception{BufferedReader reader = new BufferedReader(new InputStreamReader(is));StringBuilder builder= new StringBuilder();String line;while((line=reader.readLine())!=null){builder.append(line+"\r\n");}return builder.toString(); }
}
服务端
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;public class TCPFileUploadServer {public static void main(String[] args) throws Exception {//服务端在本机监听9999端口ServerSocket serverSocket = new ServerSocket(9999);//等待连接Socket socket = serverSocket.accept();//读取客户端发送的数据,通过socket得到输入流BufferedInputStream bufferedInputStream = new BufferedInputStream(socket.getInputStream());byte[] bytes = StreamUtils.streamToByteArray(bufferedInputStream);socket.shutdownInput();//将得到的bytes数组写入到服务端的指定位置String dest = "src\\test.png";BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(dest));bufferedOutputStream.write(bytes);//服务端给客户端发送回复bufferedOutputStream = new BufferedOutputStream(socket.getOutputStream());bufferedOutputStream.write("收到图片".getBytes());//字符流方式
// BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
// bufferedWriter.write("收到图片");
// bufferedWriter.flush();
// socket.shutdownOutput();//关闭资源System.out.println("关闭服务端");bufferedOutputStream.close();bufferedInputStream.close();socket.close();serverSocket.close();
// bufferedWriter.close();}
}
客户端
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.net.InetAddress;
import java.net.Socket;public class TCPFileUploadClient {public static void main(String[] args) throws Exception {//客户端连接服务端9999端口Socket socket = new Socket(InetAddress.getLocalHost(), 9999);//创建读取磁盘文件的输入流String file = "E:\\test.png";BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file));//bytes就是对应的字节数组byte[] bytes = StreamUtils.streamToByteArray(bufferedInputStream);//通过socket获取到一个输出流,将bytes数据发送到服务端BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(socket.getOutputStream());bufferedOutputStream.write(bytes);socket.shutdownOutput();//写入数据的一个结束标记//接收服务端的回复bufferedInputStream = new BufferedInputStream(socket.getInputStream());String s = StreamUtils.streamToString(bufferedInputStream);System.out.println(s);socket.shutdownInput();//关闭资源System.out.println("关闭客户端");bufferedInputStream.close();bufferedOutputStream.close();socket.close();}
}
相关文章:
【网络编程】Java中的Socket
文章目录前言socket是什么?Java中的SocketJava实现网络上传文件前言 所谓Socket(套接字),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用…...
有趣的Hack-A-Sat黑掉卫星挑战赛——跟踪卫星
国家太空安全是国家安全在空间领域的表现。随着太空技术在政治、经济、军事、文化等各个领域的应用不断增加,太空已经成为国家赖以生存与发展的命脉之一,凝聚着巨大的国家利益,太空安全的重要性日益凸显[1]。而在信息化时代,太空安…...
Ubuntu安装配置Cuda和Pytorch gpu
前言 在Ubuntu中操作系统中,通过Anconda安装对应的虚拟环境以及软件包,一般都需要适配Cuda、Pytorch版本等 以下安装配置都是在Ubuntu操作系统下 1. 安装Cuda 通过Ubuntu操作系统查看cuda适配的版本:nvidia-smi 截图如下: 查看Ubuntu版本可如下方式 (1)cat /proc/ver…...
三、Java面向对象
1 . 方法 方法(method)是程序中最小的执行单元方法就是一些代码的打包 需要的时候可以直接调用方法之间是平级的关系 不能在方法里面定义方法方法不调用就不执行 方法的定义 // 方法的定义 /* [修饰符] 返回值类型 方法名称([参数 1],[参数 2]){语句A;return 返回值; } *///…...
pygame7 弹球游戏2
上节课我们做到当球静止下来后在第0号球上画一个球杆 本节课我们将会让这个球杆将球打出来 1、鼠标事件 pygame.mouse.get_pressed():返回鼠标左键,中间,右键的情况 2、键盘事件: pygame.key.get_pressed(): 返回所有键盘的情况 3、pyg…...
计算机网络4:计算机网络体系结构
目录计算机网络体系结构1.网络模型2.每一层的代表含义2.1 OSI7层模型2.2 五层协议2.3 TCP/IP 四层协议3.数据在各层之间的传输过程4.为什么要进行分层计算机网络体系结构 1.网络模型 2.每一层的代表含义 2.1 OSI7层模型 (1)物理层:比特流–…...
1630_GNU的二进制分析工具nm简单使用探索
全部学习汇总: GreyZhang/toolbox: 常用的工具使用查询,非教程,仅作为自我参考! (github.com) GNU有一套二进制的分析工具,之前是用过objdump的,但是也没有系统掌握。如果做底层软件的设计,这些…...
【Redis】Redis高可用之Redis Cluster集群模式详解(Redis专栏启动)
📫作者简介:小明java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建工设优化。文章内容兼具广度深度、大厂技术方案,对待技术喜欢推理加验证,就职于知名金融公…...
1.8 正则表达式
正则表示式是用来匹配与查找字符串的,从网上爬取数据不可避免的会用到正则表达式。 Python 的表达式要先引入 re 模块,正则表达式以 r 引导。Re库主要功能函数函数说明re.search()在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象…...
Postgresql 根据单列或几列分组去重row_number() over() partition by
Postgresql 根据单列或几列分组去重row_number() over() partition by 一般用于单列或者几列需要去重后进行计算值的 count(distinct(eid)) 可以 比如有个例子,需要根据名称,城市去筛选覆盖的道路长度,以月因为建立了唯一索引是ok的&#…...
基于蒙特卡洛法的规模化电动车有序充放电及负荷预测(PythonMatlab实现)
💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥 🎉作者研究:🏅🏅🏅主要研究方向是电力系统和智能算法、机器学…...
Selenium常用API详解,从入门到进阶(全套)
目录 1、打开页面 2、查找页面元素 3、输入文本 4、点击操作 5、提交操作 6、清除文本 7、获取文本、属性 8、获取页面的标题和URL 9、窗口 9.1、设置窗口大小 9.2、窗口切换 9.2.1、为什么需要窗口切换? 9.2.2、获取句柄的方式 9.2.3、切换句柄 10、…...
自从学会了Python,我实现了壁纸自由(6)
小朋友们好,大朋友们好!我是猫妹!哈哈哈,又到周末啦!这周过得怎么样?马上就要开学了,寒假作业早已写好了吧?开学让人兴奋,上了很久网课都要吐啦!开学也让人有…...
Ruby 发送邮件 - SMTP
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。 Ruby提供了 Net::SMTP 来发送邮件,并提供了两个方法 new 和 start: new 方法有两个参数&am…...
Python爱心代码
前言 Python漂浮爱心,具体源码见:Python动态爱心代码_爱心代码-Python文档类资源-CSDN下载 爱心类 class Heart(): #每个爱心(爱心类) def __init__(self): self.r ra.randint(10,15) #爱心的半径 …...
【二分查找法及其应用】
文章目录一. 前提二. 基本思路三. 代码实现四. 封装在STL中的二分查找算法五. 浮点数二分一. 前提 待查找的序列是有序的;待查找的 a 采取顺序存储结构。 二. 基本思路 设在升序序列 a [ low…high ] 查找的 k , 首先找中间值 mid a [ ( lowhigh )/2 …...
Android 进阶——Framework核心 之Binder Java成员类详解(三)
文章大纲引言一、Binder Java家族核心成员关系图二、Binder Java家族核心成员源码概述1、android.os.IBinder1.1、boolean transact(int code, Parcel data, Parcel reply, int flags) send a call to an IBinder object1.2、String getInterfaceDescriptor()1.3、boolean ping…...
Maven
Maven 1.什么是Maven 官方网站 https://maven.apache.org/ Maven是一款服务于Java平台的自动化构建工具,它可以帮助我们更方便的对项目进行构建、管理项目jar包 ,包括: bulid 项目,切换 jar 版本,添加 jar, 删除 jar 包等 1.…...
1947抓住那头牛(队列 广度优先搜索)
目录 题目描述 解析 解题思路 代码部分 代码部分 运行结果 看看len数组中各个位置的标记值 为什么这样做一定是最短路径: 题目描述 农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0<N<100000)&…...
基于linux5.15.5的IMX 参考手册 ---21
基于linux5.15.5的IMX 参考手册 — 21 10.5.2高清多媒体接口(HDMI)和显示端口(DP)概述 10.5.2.1测试名称 •mxc_cec_test.out 10.5.2.1.1位置 /unit_tests/HDMI/ 10.5.2.1.2功能 验证HDMI CEC功能并向HDMI接收器发送断电命令。 1…...
Android Dalvik虚拟机 堆初始化流程
前言 上篇文章介绍了dalvik虚拟机启动流程,在dalvik虚拟机启动时调用了dvmGcStartup来启动堆。 本文介绍我们在日常开发使用Java时的堆创建流程。 Dalvik堆介绍 Dalvik虚拟机中,堆是由heap[0] Active堆和heap[1] Zygote堆两部分组成的。其中ÿ…...
0讲(补)——开发前必备基本常识
前言 专栏内容持续补充更新,目前正在进行优惠活动 目录 前言 一、函数的声明和定义 二、预编译 三、串口打印中的printf函数的使用...
JS学习笔记
1.WebAPIs简介导读Web APIs 和JS 基础关联性JS 基础阶段以及 Web APIs 阶段JS基础学习 ECMAScript 基础语法为后面作铺垫,Web APIs 是JS 的应用,大量使用JS基础语法做交互效果①JS 基础阶段我们学习的是ECMAScript 标准规定的基本语法要求同学们掌握JS 基…...
linux005之用户、组管理
linux用户管理简介: 任何使用linux系统的用户,都必须使用一个合法的账号和密码,账号和密码一般都是超级管理员创建,当然普通用户也可以创建用户,前提是必须拥有创建用户权限。 root是linux系统中默认创建的超级用户 创…...
列线图工具_Nomogram
定义 列线图是一种相对传统的分析方法,用于展示自变量和因变量的线性关系,及其特征的重要程度。 现在用SHAP,和机器学习库中的 Feature importance 工具可以实现类似甚至更好效果。不过很多传统的研究领域比较认这种方法。 列线图工具建立在…...
【C++】类和对象(一)
目录一、面向过程和面向对象初步认识二、类的引入三、类的定义四、类的访问限定符及封装4.1、访问限定符4.2、封装五、类的作用域六、类的实例化七、类对象的大小八、this指针8.1、this指针的引出8.2、this指针的特性8.3、C语言和C实现Stack的对比一、面向过程和面向对象初步认…...
Python获取搜索引擎结果
前言 想快速获取各个高校的博士招生网站,于是通过python先获取出有可能包含高校博士招生网站的URL,然后通过人为筛选得到了想要的招生网站(注意,并非直接爬取,是间接获取的)。 整理了一份网站名单&#x…...
2.4.8 PCIe——物理逻辑层——REFCLK
一、概述 pcie的参考时钟由板级输入,提供给IP内PHY层的PLL使用,由PLL产生core_clk和pipe_clk。 二、REFCLK产生方式 Serdes 所用时钟由 PHY 模块内的PLL生成,PLL的参考时钟可以由common clock(外部背板提供)、separ…...
树莓派4B arm64 搭建 docker+drone+gitea
树莓派4B arm64 搭建 dockerdronegitea 记录时间: 2023年02月10日 树莓派烧录 如何用树莓派搭建一台永久运行的个人服务器? https://mp.weixin.qq.com/s?__bizMzI5NjA0ODkwNA&mid2651847658&idx1&sn267a1257b43d4a76f2a081ed157b77f9&chksmf7b11…...
Java的JDBC编程
目录 1. 打开IDEA,新建Project 2. 引入依赖 (1)下载驱动包 (2)将驱动包导入Project 3. 编写代码 (1)创建数据源 (2)让代码和数据库服务器建立联系 (3&…...
我想在阿里巴巴做卫生纸的网站/惠州seo关键词排名
go run 简介 用于运行源码文件只能接收一个命令源码文件以及若干个库源码文件作为文件参数其内部操作步骤:先编译源码文件成临时文件,再运行临时文件,产出可执行文件和归档文件 常用标记的使用 -a: 强制编译相关代码,不论他们的…...
网站建设ktv/360搜索引擎的特点
前言xray被动扫描器,是我目前个人挖洞过程中,感觉最好用的一款扫描器。这篇博客,分享一下我使用xray的一些小心得吧官方github:https://github.com/chaitin/xray官网文档:https://xray.cool/xrayburp的使用普通使用配置…...
wordpress登入/免费网站推广产品
函数的定义与使用实例:七段数码管绘制代码复用与函数递归模块:PyInstaller 库的使用实例:科赫雪花小包裹一、函数的定义1、函数是一段代码的表示函数是一段具有特定功能的、可重用的语句组函数是一种功能的抽象,一般函数表达特定功…...
fevr wordpress/淘宝指数入口
模板介绍 大气严谨学术汇报PPT模板。一套开题报告幻灯片模板,内含蓝色多种配色,风格设计,动态播放效果,精美实用。 希望下面这份精美的PPT模板能给你带来帮助,温馨提示:本资源使用PPT或PPTX等格式&#x…...
财经网站模板/百度搜索风云榜排行榜
1、对于string,number等基础类型,和是有区别的 1)不同类型间比较,之比较“转化成同一类型后的值”看“值”是否相等,如果类型不同,其结果就是不等2)同类型比较,直接进行“值”比较,两…...
手机行情网站/国外推广网站有什么
lr脚本编程C语言1、#define COUNT 100#define SALARY 4000Action(){int total;totalCOUNT*SALARY;lr_output_message("100人合计薪资支出为%d元",total);lr_output_message("100人合计薪资支出为%o元",total);lr_output_message("100人合计薪资支出为…...