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:…

mysql 手动配置服务器_Win7系统下手动配置Apache+PHP+MySQL环境WEB服务器 -电脑资料...

本来想学学php,于是就想搭建web服务器和sql环境,结果浪费掉了不少时间,大致的总结下,也算是长个记性。使用的安装包分别是httpd-2.2.22-win32-x86-no_ssl .msi,php-5.2.5-Win32.zip和mysql-installer-community-5.5.28.3.msi,很显然用的还算是…

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

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

java属于哪种语言_Java属于以下哪种语言( )_学小易找答案

【单选题】AT89s51单片机若晶振频率为fosc12MHz,则一个机器周期等于( ) μS。【单选题】下列选项中,不属于Java中关键字的是( )【简答题】写出力在坐标轴上投影计算的两条重要结论。【判断题】《周南桃夭》中多次出现的“宜”指的是适宜。【单选题】以下关于三元运算符的说法中…

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

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

java中的throw_Java中的throw和throws之间的区别

throw和throws都是异常处理的概念,其中throw用于显式地从方法或任何代码块中引发异常,而throw在方法的签名中用于指示此方法可能抛出列出的类型之一例外。以下是throw和throws之间的重要区别。序号键扔抛出1定义Throw是一个关键字,用于在函数…

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

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

java 开发帮助_java的简单编程请帮助

(选择题答案可能有多选)一、java基础1、下面那句话编译时不会出现警告或错误:(5分)a)floatf1.3;b)charc"a";c)byteb257;d)booleanbnull;e)inti10;2、下面哪段程序编译时不会有错...(选择题答案可能有多选)一、 java基础1、 下面那句话编译时不会出现警告或…

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

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

java 无法打印_为什么我在Java中尝试阻止后无法打印到控制台?

我在Android应用程序中有以下代码:public static HttpResponse dbPost(String handlerUrl, List postData) {HttpClient httpclient new DefaultHttpClient();String postUrl constants.postUrl();HttpPost httppost new HttpPost(postUrl);HttpResponse respons…

python中文件打开的合法模式组合_详解python中各种文件打开模式

在python中,总的来说有三种大的模式打开文件,分别是:a, w, r当以a模式打开时,只能写文件,而且是在文件末尾添加内容。当以a模式打开时,可以写文件,也可读文件,可是在读文件的时候,会发现读出来的…

ts 模板库文件_vue与ts的使用模版

[源码地址](https://github.com/jielanglang/simple-vue)[项目demo](https://xll.netlify.com/)# 这里讲下使用中注意的事项 具体的使用在项目源码中## 关于typescript详细配制[tsconfig配制详情](https://zhongsp.gitbooks.io/typescript-handbook/content/doc/handbook/Comp…

python查找文件是否存在_python脚本查找文件是否存在的方法

python脚本查找文件是否存在的方法:1、使用os模块os模块中的os.path.exists()方法用于检验文件是否存在。判断文件是否存在import osos.path.exists(test_file.txt)#Trueos.path.exists(no_exist_file.txt)#False2、使用Try语句可以在程序中直接使用open()方法来检查…

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

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

python pyqt5 线程 暂停 重启_PyQt5 线程阻塞?

读取串口数据实时显示到textbrower,但会线程阻塞,求大神指教# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 22.ui## Created by: PyQt5 UI code generator 5.10.1## WARNING! All changes made in this file will be lost!import s…

yolov3 python_TensorFlow的YOLOv3和YOLOv3_tiny

git clone https://github.com/Huangdebo/YOLOv3_tiny_TensorFlow.git11.简介添加YOLOv3_tiny和数据增强(剪切,变亮,更改饱和度)2.要求tensorflow> 1.8.0(更低版本也可以工作)OpenCV的Python3.运行演示(1)使用ckpt文件的单图像测试演示:p…

用python玩转数据测试与作业_用Python玩转数据分析10

MOOC上的课程《用Python玩转数据分析》的学习笔记。数据探索与预处理之数据清洗数据探索包括检查数据错误,了解数据分布特征和内在规律数据预处理包括数据清洗,数据集成(integration),数据变换,数据规约(reduction)本次主要讲解数…

excel中空格去不掉java_在Apache POI中跳过空白Excel单元格

我是Apache POI的新手,但我想做的是通过Excel文件(.xls)读取并将其放入ArrayList进行存储,以便稍后进行操作 . 我可以得到整张纸,但我的问题就在于:我得到整张纸(约54183行) .我想跳过空白的单元格,它是类型3.由于某种…

python代替javascript_Pyjamas - 用python代替javascript编写基于浏览器的应用

如果能用python代替Javascript编写基于浏览器的应用,该有多好啊。但是,Javascript是唯一一种能在浏览器里执行的语言(Flash或Silverlight除外)。换个思路,先用Python编写代码,然后在通过编译器转为为Javascript脚本,这…

java unreported exception_Java异常处理

大家好,欢迎来到乐字节小乐的Java技术分享园地在计算机程序运行的过程中,总是会出现各种各样的错误。有一些错误是用户造成的,比如,希望用户输入一个int类型的年龄,但是用户的输入是abc:// 假设用户输入了a…