linux java socket编程_深入学习socket网络编程,以java语言为例

了解java的socket编程与Linux Socket API之间的关系

一、java的网络编程

1、socket原理

socket通信就是通过IP和端口号将两台主机建立连接,提供通信。主机A的应用程序要能和服务器B进行通信,必须通过Socket建立连接,而建立Socket连接本质上就是依靠TCP/IP协议来建立TCP连接。TCP协议是传输层协议,建立TCP连接还需要用到底层的各种协议的服务,其中最主要的是依靠IP协议来寻找网络中的主机。处于网络层的IP协议可以通过IP地址找到所要寻找的目标主机,但是一台主机可能运行着多个应用程序,我们必须指定TCP或UDP的地址(端口号)的确定端口号,因此一个Socket实例唯一代表一个主机上的应用程序的通信链路。

2、java socket的底层实现

Java socket服务器的建立步骤如下:

1.创建服务器ServerSocket对象和系统要指定的端口号

2.使用ServerSocket对象中的accept() 获取请求的客户端对象socket

3.使用socket对象中的方法getInputStream获取网络字节输入流对象InputStream

4.使用网络字节输入流对象InputStream的read方法,读取客户端发送的数据

5.使用socket对象中的方法getOutputStream获取网络字节输出流对象OutputStream

6.使用网络字节输出流对象OutputStream中的方法write(),向客户端回写数据

7.释放资源,关闭socket和ServerSocket

底层实现主要是调用系统api,具体关系如下:(底层实现参考一个在csdn的大佬写的东西 https://blog.csdn.net/vipshop_fin_dev/article/details/102966081,写得真的很好!)

6ec7f13cda987d5f6af55b81961ca968.png

Java socket客户端的建立步骤和服务器的类似,从java的角度看,使用了socket对象绑定服务器,再通过socket对象获取网络流进行数据的读写;底层实现肯定是通过jvm去调用linux底层api。

以下是用Java创建client的步骤:

1.创建一个客户端对象socket,构造方法绑定服务器的ip和端口号

2.使用socket对象中的方法getOutputStream获取网络字节输出流对象OutputStream

3.使用网络字节输出流对象OutputStream中的方法write(),向服务器发送数据

4.使用socket对象中的方法getInputStream获取网络字节输入流对象InputStream

5.使用网络字节输入流对象InputStream的read方法,读取服务器回写的数据

6.释放资源,关闭socket

3、Java实现简单网络编程

先实现一个服务端,服务端必须先起来,客户端才能访问。

1 packagenet.socket;2

3 importjava.io.IOException;4 importjava.io.InputStream;5 importjava.io.OutputStream;6 importjava.net.ServerSocket;7 importjava.net.Socket;8

9 /**

10 * Created by wenjun11 * tcp通信的服务器端:接收客户端的请求,读取客户端发送的数据,给客户端回写数据12 * 表示服务器的类:13 * public class ServerSocket extends Object此类实现服务器套接字14 *15 * 构造方法:16 * ServerSocket(int port) 创建绑定到特定端口的服务器套接字。17 * 服务器必须明确一件事情,必须指导是哪个客户端请求的服务器18 * 所以可以使用19 * Socket accept() 侦听并接受到此套接字的连接。20 *21 *29 */

30

31 public classTCPServer {32 public static void main(String[] args) throwsIOException {33 ServerSocket sever=new ServerSocket(8888);34 Socket socket=sever.accept();35 InputStream is =socket.getInputStream();36

37 byte[]bytes=new byte[1024];38 int len=0;39 while ((len=is.read(bytes))!=-1){40 System.out.println(new String(bytes,0,len));41 }42

43 OutputStream os =socket.getOutputStream();44 os.write("hi,client!".getBytes());45

46

47 sever.close();48 socket.close();49

50 }51 }

再实现一个客户端,指定ip和端口号,可以访问服务端

1 packagenet.socket;2

3 importjava.io.IOException;4 importjava.io.InputStream;5 importjava.io.OutputStream;6 importjava.net.Socket;7

8 /**

9 * Created by wenjun10 * tcp通信的客户端:向服务器发送连接请求,给服务器发送数据,读取服务器回写的数据11 * 表示客户端的类:12 * java.net.Socket:此类实现客户端套接字(也可以就叫“套接字”),套接字是两台机器间通信的端点13 * 套接字:ip+端口号14 *15 * 构造方法:16 * public Socket(String host,int port) 创建一个流套接字并将其连接到指定主机上的指定端口号。17 * 参数:18 * String host:服务器主机的名称/ip地址19 * int port:服务器的端口号20 *21 * 成员方法:22 * public OutputStream getOutputStream() 返回此套接字的输出流。23 * throws IOException24 *25 *26 * public InputStream getInputStream() 返回此套接字的输入流。27 * throws IOException28 *29 * void close() 关闭此套接字30 38 *39 * 注意:40 * 1.客户端与服务器进行交互,必须使用socket中提供的网络流,不能使用自己创建的流对象41 * 2.当我们创建客户端对象socket的时候,就会请求服务器和服务器进行3次握手及案例连接42 * 这时如果服务器没有启动,那么就会抛出异常 ConnectException: Connection refused: connect43 * 如果服务器已经启动,就可以进行交互了44 */

45

46 public classTCPClient {47 public static void main(String[] args) throwsIOException {48

49 Socket socket=new Socket("127.0.0.1",8888);50 OutputStream os =socket.getOutputStream();51 os.write("hello,server".getBytes());52 socket.shutdownOutput();53

54 InputStream is =socket.getInputStream();55 byte []bytes=new byte[1024];56 int len=0;57 while ((len=is.read(bytes))!=-1){58 System.out.println(new String(bytes,0,len));59

60 }61 socket.close();62

63 }64

65 }

实验结果:

服务器收到客户端访问,输入的数据:

041202bb2f302fb20d9d3481b0a8fa52.png

客户端收到服务器的回写数据:

e49b4ccae725aedd45f7cf6aea7fa85d.png

二、linux socket的api接口,linux提供socket的API函数很丰富,包括了sockket的创建和关闭、连接的建立和释放、数据的收发等接接口:

socket 创建套接字

connect 建立连接

bind 绑定本机端口

listen 监听端口

accept 接受连接

recv, recvfrom 数据接收

send, sendto 数据发送

close, shutdown 关闭套接字

三、总结

这次实验我用Java实现了socket连接,但是这都是很基础的东西,而对于linux底层的tcp实现原理还只是看了大佬的博客了解了理论上的原理,没能自己代码实现。在这次的实验中,也确实学到了很多东西,linux系统提供丰富的api,java的net包封装了对系统接口的调用,javac将java文件编译为.class文件在jvm上运行的时候,jvm会请求系统调用,调用系统的socketAPI,进行socket的建立、绑定,再进行进一步的通讯。之前用这个的时候确实没有想那么多,所以以后的学习中应该更加注意底层原理的学习,不能只是知道怎么用,而不清楚实现的原理。

1、api接口

[1,Api jiēkǒu]

11988473.html

1, api Interface

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

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

相关文章

python去掉空白行_python去掉空白行的多种实现代码

这篇文章主要介绍了python去掉空白行实现代码,需要的朋友可以参考下 测试代码 php.txt1:www.php.cn 2:www.php.cn 3:www.php.cn 4:www.php.cn 5:www.php.cn 6:www.php.cn 7:www.php.cn 8:www.php.cn 9:www.php.cn 10:www.php.cn 11:www.php.cn 12:www.php.cn 13:www.php.cn 14:…

html get请求_99% 的人都理解错了 HTTP 中 GET 与 POST 的区别【面试必问】

先分析一波:1、GET和POST与数据如何传递没有关系??GET和POST是由HTTP协议定义的。那么使用哪个方式与应用层的数据如何传输是没有相互关系的。从而,HTTP就没有要求,POST一定要放到请求体里面,GET就一定要放…

hive load data外部表报错_生产SparkSQL如何读写本地外部数据源及排错

https://spark-packages.org/里有很多third-party数据源的package,spark把包加载进来就可以使用了csv格式在spark2.0版本之后是内置的,2.0之前属于第三方数据源一、读取本地外部数据源1.直接读取一个json文件[hadoophadoop000 bin]$ ./spark-shell --mas…

ffmpeg命令_使用ffmpeg命令为多个短视频修改视频备注说明

今天主要给大家讲一下使用视频剪辑高手中的ffmpeg命令为多个短视频修改备注说明的详细步骤,有需要和感兴趣的宝贝们可以跟随小编一起来试试。收集视频将需要剪辑的短视频保存到同一文件夹上进入软件双击进入视频剪辑高手,选择“批量剪辑视频”功能添加视…

从事python需要掌握哪些知识和技能_零基础想转行从事Python?需要掌握如下技能...

零基础python能找到工作吗?需要掌握哪些技能?对于大部分零基础学编程半路出家的人来说,无非是想改变现状换一门新职业,所谓技术大牛不过是比小白们更早接触编程罢了,选择好自己有兴趣的职业技能,并为之学习…

java byte 判断相等_你真的了解Java中quot;==quot;和equals()的区别?

部分面试资料链接:https://pan.baidu.com/s/1qDb2YoCopCHoQXH15jiLhA密码:jsam想获得全部面试必看资料,关注公众号,大家可以在公众号后台回复“知乎”即可。“判断两个事物是否相等”,是编程中最常见的操作之一,在Java中&#xff…

数据通信原理_同网段主机通信原理

本篇文章介绍数据通信中最基础,最关键的原理之一,两台通网段的主机如何通信。获得更多技术资料和免费学习视频,加入讨论群:752160765适合两台普通电脑之间,两台服务器之间,两台手机之间,电脑和打…

java jdk 未知错误_解决JAVA JDK安装出错的最常见问题,帮你排除困扰

一般来说,安装JAVA JDK的整个流程是很简单的,只要按照提示进行操作即可,就不会出现问题。但是呢,有小伙伴反映说,之前安装了JAVA JDK,进行卸载重装的时候出现错误提示,“正在进行另一Java安装”…

定义const变量是不可以赋值_JavaScript的声明方法和作用范围,常见的结构赋值类型和使用场景...

链接:https://juejin.im/post/5d9bf530518825427b27639d声明const命令:声明常量 let命令:声明变量作用作用域全局作用域函数作用域:function() {}块级作用域:{}作用范围var 命令在全局代码中执行const命令和let命令只能…

java社区活跃度_Java并发编程-活跃度问题

在讲问题前,我先说明一下什么是活跃度?一个并发应用及时执行的能力称作活跃度。我主要讲死锁问题,顺带介绍一下饥饿,弱响应性和活锁。死锁死锁这个词大家都听过,我先来罗列一下产生死锁的四个必要条件:(1) …

java8 di_java8 多个list对象用lambda求差集操作

业务场景:调用同步接口获取当前全部有效账户,数据库已存在部分账户信息,因此需要筛选同步接口中已存在本地的帐户。调用接口获取的数据集合List list response.getData().getItems();本地查询出来的账户集合List towList accountRepository…

怎么抓python程序的包_如何在AWS上部署python应用程序

如何在AWS上部署python应用程序,学姐呕心沥血亲自总结,亲测有效,比网上看网上大把大把的文档要快得多!作者:蕾学姐亚马逊云计算服务(Amazon Web Services,缩写为AWS),由亚…

【Hadoop】Zookeeper架构/特点

Zookeeper 中的角色主要有以下三类: Zookeeper需要保证高可用性和强一致性为了支持更多的客户端,需要增加更多Server,但是Server增多,意味着投票阶段延迟增大,会影响整个系统的性能。所以在3.3.0中ZK引入的新角色&…

wpf 按钮样式_键盘 | 01.在程序集间引用样式

设置Button和TextBox的特定颜色和字体的样式和默认样式,并在程序集间引用。从零开始用WPF/C#开发一个键盘指示器项目完整开源、免费,不依赖第三方库编译好的先行版程序在微信公众号(香辣恐龙蛋)下载。文章同时发布在微信公众号(香辣恐龙蛋)、B站(香辣恐龙…

怎么去除表中的系统导出的字符_EXCEL非常有用的字符函数LEN、LENB,财务工作者的必备利器...

LEN函数与LENB函数是比较常用的函数,在实际中应用那是相当广的,尤其在财务工作中的使用频率是相当的高。我就一起看看实际工作中哪些地方用到了它。我们先简单说下它的用法,很简单,LEN(text)、LENB(text),两个用法是一…

java软尾山地车碳_JAVA FURIA 27.5入门软尾山地车评测

铝合金车架、前后100mm避震行程、超短把立、长款燕把、27.5轮径……之前跟大家讲过,在这台车上你能拥有全避震车型所应该具备的所有基础元素。2个月的时间已经过去,这台车到底怎么样呢?我们一起来看一下。优点:质量靠谱&#xff0…

java 模拟路由表_Router的路由表

Router中使用routers字段表示路由表,这是一个数组,每个元组的类型是[desnination,nexthop],其中destination表示目的网段(cidr),nexthop表示下一跳的IP,举例如下:“routes”:[ { “destination”:”10.50.10.0/24” “…

无符号有符号乘法_刘帅嵌入式系统-乘法指令

ARM有两类乘法指令:一类为32位的乘法指令,即乘法操作的结果为32位;另一类为64位的乘法指令,即乘法操作的结果为64位。两类指令共有以下6条。MUL:32位乘法指令MLA:32位带加数的乘法指令SMULL:64位…

php导出csv_原生PHP实现导出csv格式Excel文件的方法示例【附源码下载】

本文实例讲述了原生PHP实现导出csv格式Excel文件的方法。分享给大家供大家参考,具体如下:效果图源码分析index.phprequire_once "./Export.php";//测试数据$headerList [列名1,列名2,列名3];$data [[值1,值2,值3],[值11,值22,值33],[值111,值…

python 颜色_如何使用python中matplotlib库分析图像颜色

用代码分析图像可能很困难。你如何使代码“理解”图像的上下文?通常,使用AI分析图像的第一步 是找到主要颜色。在如何使用python中matplotlib库分析图像颜色中,我们将使用matplotlib的 image类在图像中找到主色 。查找主导色也是你可以使用第三方API进行…