java网络编程技术有哪些_Java网络编程技术
《》首先我们需要知道自己的电脑在接入互联网后,互联网为自己的电脑所分配的唯一的IP地址;
这实际上是非常的容易的,只要在DOS窗口下进行命令行查询就行了:
运行——cmd——输入ipconfig/all 命令就行了
当然还有很多方法,下面的java提供的一些方法也能够完成同类的任务
按照URL和不同的协议进行网络数据的通信可以将程序设计分成多种
《1》统一资源定位地址(URL)程序设计
①在java中将网络的地址也看成是对象,也就是说我们能够将以一个网络地址为参数,
创建一个实例对象,来保存这个网络地址,通过这个网络地址的实例对象,我们能够进行很多的操作;
可以用java.net.InetAddress类的实例对象来记录网络地址,
由于这个类的构造方法是默认属性的,所以一般不能够直接创建他的实例对象,
可以通过这个类的静态方法来创建这个类的实例对象;
(1)创建实例对象:
//返回本地计算机所对应的类InetAddress的实例对象
public static IneAddress getLocalHost()
throws UnknownHostException
//根据指定的网络IP地址来创建实例对象
public static InetAddress getByAddress(byte[]addr)
throws UnknownHostException
其中的参数addr用来指定IP地址
如addr[0] = 166
addr[1]=111
addr[2]= 4
addr[3]=100
代表的IP地址为 166.111.4.100
//根据指定的域名或者IP地址来创建实例对象
public static InetAddress getByName(String host)
throws UnknownHostException
参数host可以是域名,也可是IP地址
//返回一个域名关联的所有的IP地址
public static InetAddress [ ] getAllByName
(String DNS)
我们知道一个域名可以托管给多个机器(IP地址),通过上面的方法会返回与指定的域名关联的所有的IP地址
如:InetAddress.getAllByName(www.google.com)
会返回五个不同的InetAddress对象,也就是说这个域名托管在了五个不同的IP地址上了
(2)java.net.InetAddress的成员方法
public String getHostName()
//返回实例对象记录关联的域名或者主机名
public String getHostAddress()
//返回实例对象记录关联的IP地址,所以通过这个方法能够获得一个网络中的计算机的IP地址
②首先我们需要介绍一下URL
(Uniform Resource Locator):
在网络中几乎所有的资源都可以用URL来标定,每个资源对象的URL表示这个文件在网络当中的位置,
我们通过URL就能够访问网络中的资源,这称为统一资源定位地址:
格式:
协议://主机名:端口号/文件/ #引用
如
协议:指的是网络传输协议
如HTTP——超文本传输协议
FTP——文本传输协议
主机:指的是网络资源所在的主机,
它可以用网络IP地址或者域名来表示
端口号:指的是与主机进行通信的端口号
如果没有端口号,则默认使用默认的端口号
文件:这里的文件是广义上的文件,除了普通意义上的文件
还可以是路径
引用:是指向文件内部某一节的指针
③java.net.URL对象的创建
(1)构造方法
public URL(String spec) throws MalformedURLException
spec为URL对应的字符串
(2)java.net.URL的成员方法
public String getProtocol() //返回网络协议
public String getHost() //返回主机名
public String getPort() //返回端口号
public String getFile() //返回文件名
public String getRef() //返回引用
④通过URL对象获取网络资源
在java.net.URL的成员方法中有:
public final InputStream openStream()
throws IOException
通过这个方法能够将当前的URL实例对象和它所指向的资源联系起来,同时能够将该网络资源当做一种特殊的数据流进行读取
这样一来就能够利用java.IO系统进行资源的利用了
获取网络资源的步骤:
——创建URL实例对象,使其指向指定的网络资源
——通过URL对象的openStream返回网络文件的数据流对象
——可以将上面得到的数据流对象的引用加以包装形成IO系统中
有缓存的输入流对象
——读取数据
——关闭输入流对象
注意:当网络不太稳定或者网速非常的慢时,最好将数据流包装成带有缓存的数据流对象
《2》基于TCP的网络程序设计
①TCP传输控制协议是一种基于连接的协议,可以在计算机之间通过可靠的数据传输,
当连个计算机之间建立起网络通道后,在通道的两端要分别创建套接字对象(就相当于电话线两端的听筒);
服务器和客户端都要通过套接字(Socket)对象进行数据的传输
②基于TCP的网络程序设计当中,要为服务器端和客户端分别编写程序来实现通信
——在服务器端首先创建java.net.ServerSocket的实例对象,
来注册在服务器端进行连接的端口号以及允许连接的最大客户数
——调用java.net.ServerSocket的成员方法accept,来等待并监听来自客户端的连接,
当有客户端与该服务器建立起连接时,类java.net.ServerSocket的成员方法accept就会返回在服务器端的套接字(Socket),
套接字的类型是java.net.Socket
——通过调用java.net.Socket的成员方法:
getInputStream和getOutputStream获得该套接字所对应的输入流和输出流
——通过获得的输入流和输出流就能够和客户端进行数据通信了
——当数据通信完毕后,要将数据流和套接字都关闭
——在客户端需要创建类java.net.Socket的实例对象,在创建这个套接字的实例对象时,
需要指定服务器端的主机名(IP或者域名)和进行连接的端口号,这称之为注册,
端口号和主机名必须和服务器端的一致才行,否则不能够进行正确的链接
——通过java.net.Socket的成员方法
getInputStream和getOutputStream创建套接字对应的数据流
——进行数据的通信
——将资源关闭
③下面介绍一些主要的成员方法和注意事项
(1)需要首先运行服务器端的程序,如果首先运行客户端的程序会使得客户端的链接出现异常
(2)在客户端和服务器端使用数据流的时候,一般要使用相同类型的数据流对象,否则非常容易出现乱码的现象
(3)java.net.ServerSocket构造方法
public ServerSocket (int port) throws IOException
参数port指定了服务器端采用的进行通信的端口号
这个端口号一般可以是自己设定的,(最好大于1024,因为小于1024的端口一般是规定好的用于特定的服务协议的);
客户端注册的端口号也要和这个端口号相同才行
(4)java.net.ServerSocket的成语方法:
public Socket accept() throws IOException
当服务器端调用了这个方法后,这个方法就会像一个while循环那样,持续不断的监测是否有客户端连接进来,
一旦监听到有客户端链接进来了,这个方法就会创建一个客户端的套接字对象,并返回这个对象的引用,
如果一直没有客户端连接进来的话,那么这个方法就会一直执行这个while循环,这个方法的下面的程序代码也不会被执行,
只有当连接成功并返回引用时,才会继续执行下面的代码;
实际上accept方法并不是像上面讲的那样有一个while循环,只是为了便于理解,实际上这个方法是阻塞调用,
会一直阻塞等待直到有客户端连接进来;
(5)java.net.Socket构造方法
public Socket (String host , int port)
throws UnknownHostException,IOException
参数host——指定将要连接的服务器端的主机名
参数port——指定将要连接的服务器端使用的端口号
(6)java.net.Socket的成员方法
public InputStream getInputStream()
throws IOException
public OutputStream getOutputStream()
throws IOException
public InetAddress getLocalAddress()
//返回服务器端的网络地址
public int getLocalPort()
//返回服务器端的端口号
public InetAddress getInetAddress()
//返回客户端的网络地址
public int getPort()
//返回客户端的端口号
④下面举一个实例,这个例子是应用TCP编程的,效果是开发一个像是QQ一样的聊天软件,客户端和服务器端能够进行实时通信
服务器端程序:
客户端程序:
分析:
(1)构造方法主要是完成图形化界面
(2)在程序当中,我们用的是带缓存的数据流来获取套接字端的数据的;我们注意到在获取对方发的信息时,
我们用的是readLine()
方法,注意下面这几处:
30:m_output.write(s+"\n") ;
65:m_output.write("连接成功\n") ;
75:m_output.write("exit\n");
为什么要在字符串后面加上一个“\n”呢?实际上这是个非常重要的细节,因为我们采用的是方法readLine,
这个当我们在一端的输入框中输入一串字符,如“你好吗?”之后按下回车,这时实际上,
这个回车符并没有进入网络通道中的字符缓存区中,当我们用readLine读取时,由于字符串“你好吗”后面没有回车分隔符,
所以这条信息就不能够被readLine取出来,所以最后的结果就是,两端并不能够进行实时通信,
两端的数据都不能够被对方发读出来,所以必须加上“\n”;
(3)在服务器端的69——71行中我们注释掉了两行,当我们将这两行的注释去掉后,再运行程序时,
我们可能够认为控制台中会持续的输出“You are right”;但是并非如此,实际上是:当连接成功时,
输出一行“You are right”,之后当我们从客户端输入框中输入一句话按下回车后,连续输出两行“You are right”;这就说明实际上
如果网络通道中的缓存区中没有了字符时,readLine并不会返回null,而是会一直的等待,直到再有字符添加到缓存中;
也就是说,由于网络通道是一个实时性的,所以readLine并不能识别字符何时才是真正的结束,
所以他会一直的出于等待之中,如果用的是其他数据流来读取信息的话,可能也会出现类似的情况,
之所以这么详细的解释,只是为了,再遇到这种情况时,不会大惊小怪
(4)实际上,这个历程是《雍俊海》中的实例,但是他的实例实际上用的是ObjectInputStream和ObjectOutputStream
(对象序列化数据流对象)
用到的方法是:writeObject(“连接成功”) ;
m = (String) readObject() ;
这也是可以的,我想说的是:
当我们通过套接字类java.net.Socket的成员方法getInputStream和getOutputStream得到数据流的引用后,
就可以完全通过java的IO系统来处理所有的问题
上面的这句话是成立的,只是有时候,我们用某个类型的数据流对象读取时,可能出现某些意外的情况,
但是这绝对不是因为下面的这句话:由于这是网络编程,所以这个类型的数据流可能不能够用在网络编程中,
可能换一个类型的数据流对象就好了;实际上问题一定是由于程序员自身没有注意到一些细节造成的,
就好像是上面的程序中用readLine方法,没有在字符串后面加上“\n”,造成不能够达到预期效果一样;
(5)此外程序当中用到的关于可视化的一些方法,可以查阅之前的文档,在这里我们再介绍一个实用的方法:
java.net.Socket成员方法:
· public void connect(SocketAddressendpoint, int timeout)
我们知道在客户端的程序中我们直接使用Socket的构造方法就能够指定与哪个服务器的那个接口进行连接了,
但是我们想没有想过这样一个问题,由于通过这种方法建立连接时,默认的是客户端会在无限的时间内和服务器段进行连接,
如果说在实际中由于某些网络上的原因,确实使得链接的时间非常的长的话,这时程序就会处在一种“停滞“的状态,
好像死了一样,这样的体验是非常的糟糕的;但是可能我们重新的将客户端打开就能够快速的连接成功,
就好像是刷新了一下,但是在程序处于一种死亡的状态下,没有任何的提示,莫名的让用户关了程序在重新打开是非常的难受的;
所以引入了上面的方法,能够制定链接的时间的上限,当连接时间超过上面设定的时间(毫秒)后,
就会抛出SocketTimeoutException - if timeout expires before connecting
异常,我们可以捕获这个异常,在异常处理中我们可以提示用户由于连接时间非常的常,而需要做一些其他的操作;
这样就能够是用户接受这个问题的出现;下面是使用这个方法的实例:
Socket socketObject = new Socket() ;
socketObject.connect(
new InetSocketAddress(“localhost”,5000),1000);
这样就指定了服务器localhost,端口号5000,连接时间1s
如果将时间设为0的话,就会在无限的时间之内进行连接,这是默认的连接时间
《》基于SSL的网络程序设计
①SSL——(Secure Socket Layer)安全套接层网络通讯协议
SSL协议在网络协议上的层次结构为:
SSL协议本身由SSL记录协议和SSL握手协议两部分组成
实际上基于SSL协议的通信就是一种经过加密的通信,基于这种协议的通信在传输时依然采用他下层的可靠的传输协议,
只是基于SSL协议的网络通信通过SSL记录协议对传输的数据进行加密,而且通过SSL握手协议对传输过程增加了认证过程,
因此,基于SSl协议的网络通信与直接采用它下层的传输协议的网络通信相比,增加了网络通信的安全性,但是降低了数据的传输效率
②由于基于SSL协议的网络程序需要用到创建好的密钥和证书,所以接下来我们先讲解一下密钥和证书的创建过程
创建密钥库、给密钥库中添加密钥项、显示密钥库信息、修改密钥库信息、删除密钥库密钥项、导出数字证书并创建信任密钥库等
都需要通过一个工具来完成——“密钥和证书管理工具keytool”
密钥和证书管理工具keytool采用命令行的方式执行命令
(1)创建密钥库并向密钥库中添加密钥项
密钥库——密钥项的集合
密钥项——由公钥、私钥、和证书等组成;每一个密钥项都是一个实体,并且要求定义一个密钥项别名来指向这个密钥项实体
(就像是一个引用指向一个实例对象一样),为的是能够唯一的找到指定的密钥项
在DOS窗口下创建密钥库并添加密钥项实例:
①方法1:
假设当前的目录为E:\程序设计
OU(Organization Unit)——组织(的内部)单位
O(Organization)—— 组织名称
L(Locality)——当地名称(如城市名称)
ST(State)——州或者省份名称
C(Country)——有两个字母代表的国家名称,
(如CN中国US美国)
这就是创建密钥库和添加密钥项的整个过程
②方法2:
我们还可以在命令行中一次性的给往密钥库中添加密钥项的所有的相关信息(如果指定的密钥库不存在则同时会自定创建指定的密钥库)
注意在输入上面的内容时,并没有输入回车,换行是由于窗口限制而自动换行的,
-dname后面的内容指定了密钥项实体的专用识别名(注意如果其中需要输入特殊的字符,要加上一个转义字符标记\)
(2)将密钥库中指定的密钥项删除
这仍然是通过keytool来实现的,需要用到的命令是:
-delete命令
格式如下:
(3)显示密钥库信息
需要用到的命令是:
-list –v
其中 –v代表输出详细信息,如果不加则只输出简略信息
格式如下:
分析
①从上面的显示信息中可以看到,密钥和证书管理工具keytool自动的给添加的密钥项指定的一个有效期间,
这个默认的有效期间的长度是90天,当然我们在向密钥库中添加密钥项时,可以指定添加的这个密钥项的有效期间的具体值,命令是:
-validity有效天数
这个命令必须紧跟在 –genkey的后面
如:
keytool –genkey –validity 365 –alias newmark
-keystore .\new.keystore –storepass ks123456
-dname “CN=…………………C=US”
-keypass key123456
(4)将密钥项的公钥以及其证书(certificate)
导出到指定的文件中
要想建立信任密钥库,这是必须要做的一件事
将指定的密钥项的公钥及其证书导出到指定文件的DOS格式:
keytool –export –alias密钥项别名 –keystore密钥库所在路径及其文件名 –storepass密钥库口令 –file输出的数字证书文件名
注意:
①上面的命令也是一行,中间不能够输入回车
下面给出一个运行实例:
.\后面才是密钥库的文件名
注意:..\的意思:
前面有两个句点——代表文件在当前目录的上一级目录下
n之后DOS提示“输入密钥库口令”:
我们应该输入上面指定的那个密钥库的密码,如果密码不对,
是不能够为指定的密钥库添加密钥项的;此外由于口令是敏感的字符,所以就想上面显示的那样,虽然我们输入了口令:
ks123456
但是并不会显示出来;口令都必须至少是6个字符
n需要注意的一点是:创建一个密钥库和想密钥库中添加密钥项的方法都是上面的过程:
①keytool规定如果指定的密钥库不存在,则在下面的输入都正确的情况下,系统就会自动的在指定的路径下创建指定的密钥库
下面的“输入密钥库口令”就作为创建的密钥库的密码;
②如果指定的密钥库已经存在的话,那么下面的“输入密钥库口令”,就必须和当初创建该密钥库的口令一致,
否则不能够将下面的密钥项添加进去
n接下来就是要填加密钥项了,按照提示一步一步的输入即可
n最后会提示为刚刚添加的密钥项也添加密码,我们添加的密码:
key123456
n最后我们解释一下上面的缩写的意思:
CN(Common Name)——常用名
OU(Organization Unit)——组织(的内部)单位
O(Organization)—— 组织名称
L(Locality)——当地名称(如城市名称)
ST(State)——州或者省份名称
C(Country)——有两个字母代表的国家名称,
(如CN中国US美国)
这就是创建密钥库和添加密钥项的整个过程
②方法2:
我们还可以在命令行中一次性的给往密钥库中添加密钥项的所有的相关信息(如果指定的密钥库不存在则同时会自定创建指定的密钥库)
注意在输入上面的内容时,并没有输入回车,换行是由于窗口限制而自动换行的,
-dname 后面的内容指定了密钥项实体的专用识别名(注意如果其中需要输入特殊的字符,要加上一个转义字符标记 \ )
(2)将密钥库中指定的密钥项删除
这仍然是通过keytool来实现的,需要用到的命令是:
-delete命令
格式如下:
(3)显示密钥库信息
需要用到的命令是:
-list –v
其中 –v 代表输出详细信息,如果不加则只输出简略信息
格式如下:
分析
①从上面的显示信息中可以看到,密钥和证书管理工具keytool自动的给添加的密钥项指定的一个有效期间,
这个默认的有效期间的长度是90天,当然我们在向密钥库中添加密钥项时,可以指定添加的这个密钥项的有效期间的具体值,命令是:
-validity有效天数
这个命令必须紧跟在 –genkey 的后面
如:
keytool –genkey –validity 365 –alias newmark
-keystore .\new.keystore –storepass ks123456
-dname “CN=…………………C=US”
-keypass key123456
(4)将密钥项的公钥以及其证书(certificate)
导出到指定的文件中
要想建立信任密钥库,这是必须要做的一件事
将指定的密钥项的公钥及其证书导出到指定文件的DOS格式:
keytool –export –alias密钥项别名 –keystore 密钥库所在路径及其文件名 –storepass 密钥库口令 –file 输出的数字证书文件名
注意:
①上面的命令也是一行,中间不能够输入回车
下面给出一个运行实例:
②在导出的数字证书当中不包含任何的私钥信息
同样我们可以查看证书中的内容:
-printcert -file数字证书文件名
实例:
(5)创建信任密钥库
这实际上非常的简单:过程就是
在创建信任密钥库时,将已经存在的密钥项和该密钥项对应的数字证书一并导入到这个信任密钥库中
下面给出一个实例:
这样我们就创建了一个信任密钥库,并将指定的密钥项和证书添加到了这个密钥库中
注意:
①上面所有的DOS命令中最后常常让输入“是”“否”
注意,如果当前的DOS使用的是汉字,那么必须输入汉字的
“是”“否”;如果DOS使用的是英文的话,那么应该输入
“ok””no”
②这样一来创建的client.trustStore是受信任的密钥库
证书NewMark.cer是受信任的数字证书
密钥项newmark是受信任的密钥项
③上面的-alias newmark 这句命令是可以省略的
好了所有的准备工作都已经做好了,接下来进入编程阶段
《》编写基于SSL网络协议的java程序
①基于SSL的服务端和客户端程序的基本模型
既然SSL是基于TCP的,那么必然就要进行服务端和客户端两方面的编程,下面介绍基本模型,之后还要介绍自定义模型
服务器端模型
——指定密钥库及其密码
基本模型要求密钥库只能够包含一个密钥项,并且密钥项和密钥库的密码必须一致;
如果密钥库中包含有多个密钥项或者说密钥项的密码和密钥库的不一致的话,那么就要使用自定义模型来进行编程;
当在服务器端存在符合要求的密钥库时,我们就可以在程序运行的最前面指定密钥库和密码,
指定密钥库和密码的方法是通过调用类java.lang.System的成员方法:
public static setProperty(String key , String value);
这个方法是专门用来设置系统的属性的,其中,
参数key——指定将要设置的系统属性的名称
参数value——指定上面的系统属性的值
如:
System.setProperty(“javax.net.ssl.keystore”,
“.\\new.keystore”) ;
System.setProperty(“javax.net.ssl.keyStorePassword”,
“ks123456”) ;
这样一来通过上面的两行语句就能够设定密钥库和密钥库的密码
——获取服务器端的套接字
这包括两个步骤:
1.通过javax.net.ssl.SSLServerSocketFactory的成员方法
public static ServerSocketFactory getDefault()
来获取服务器端的默认的套接字工厂实例对象的引用
2.通过javax.net.ssl.SSLServerSocketFactory的成员方法
public ServerSocket createServerSocket(int port)
throws IOException
port——端口号
来创建服务器端的套接字对象的引用
如:
SSLServerSocketFactory ssf = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault() ;
ServerSocket ss = ssf.createServerSocket(5000) ;
注意上面的向下转型,不能丢
——监听并等待来自客户端的链接,并创建套接字对象
类java.net.ServerSocket的成员方法:
public Socket accept() throws IOException
——获取套接字的输入流和输出流,与客户端进行通信
java.net.Socket成员方法:
public InputStream getInputStream() throws IOException
public OutputStream getOutputStream()
——关闭输入流合输出流以及套接字
客户端模型
——创建和导入证书
首先要做的是就是将服务器端的密钥库中的密钥项的公钥和证书导出到一个文件下,形成.er证书文件;
之后将这个证书复制到客户端,将这个证书导入到客户端信任的密钥库中;这个过程都是使用DOS命令行来执行的,
但是我们往往考虑到,不能够让客户使用命令行来自己将证书导入到信任的密钥库中,所以可以通过下面的方法来回避这个问题:
方法一:在客户端的java代码中可以调用命令行,这样导入证书的过程实际上对客户是不可见的;至于如何在java代码中调用命令行
可以查阅以前写过的资料
方法二:基于上面的思路,我们可以创建一个.bat的批处理文件,在这个文件中将客户端需要的命令行包换进去,
之后在java代码中填写代码来执行这个文件就行了,至于如何创建批处理文件,如何在代码中执行这个文件,也可以查阅曾今写过的文章
方法三:这种方法叫做部署,在安装阶段来做,目前还不知道具体如何作,但是记住有这么个方法
——指定信任密钥库
指定信任密钥库的方法还是调用java.lang.System的成员方法:
public static setProperty(String key , String value) ;
即:
System.setProperty(“javax.net.ssl.trustStore”,
“.\\client.trustStore”) ;
这样一来就指定了信任密钥库,如果上面的证书导入到了这个密钥库中话,服务器端和客户端就能够进行正常的通信了
注意:
1)在客户端并不需要指定信任密钥库的密码
2)在java的JDK中已经将一些知名的可信任的证书导入到了java的默认的信任密钥库中了,如果说,
在客户端并没有显示的指定信任密钥库,而且又指出提供验证信息的话,程序就会自动的在这个默认的信任密钥库中进行搜索,
如果存在和服务器端匹配的证书的话,那么双方就能够正常的通信;这个默认的信任密钥库的位置在:
C:\Program Files (x86)\Java\jre7\lib\security\cacerts
这个cacerts文件就是这个默认的信任密钥库;我们可以通过keytool工具,查看一下这个密钥库中的证书有哪些,
当然我们能够将我们指定的证书导入到这个默认的密钥库中,但是,我建议最好不要将那些不正规的证书导入到这个库中
——获取客户端套接字对象
分为两步:
首先通过调用javax.net.ssl.SSLSocketFactory的成员方法
public static SocketFactory getDefault() ;
获取套接字工厂
之后通过javax.net.ssl.SSLSocketFactory的成员方法:
public Socket createSocket(String host , int port) ;
来创建套接字对象
如:
SSLSocketFactory sf = (SSLSocketFactory)
SSLSocketFactory.getDefault() ;
Socket s = sf.createSocket(“219.216.181.12”,“5000”) ;
这样一来我们即获得了套接字对象,注意向下转型
——通过java.net.Socket的成员方法获取输入流和输出流对象
——通信完毕后将资源关闭
④
java网络编程技术有哪些_Java网络编程技术相关推荐
- java udp 同一个端口实现收发_Java网络编程之UDP协议
伙伴们注意了! 小编在这里给大家送上关注福利: 搜索微信公众号"速学Java"关注即可领取小编精心准备的资料一份! 今天我们来聊聊 网络编程这部分的内容 网络编程 1)计算机网络 ...
- java web 开发技术大全 代码_Java Web开发技术大全
资深程序员全力打造,深入剖析SSH框架整合开发的精髓 全方位解读Java Web开发的基础知识.高级技术及应用案例 内容全面,讲解详细,全面覆盖JSP.Se rvlet.AJAX及SSH框架整合开发 ...
- java网络编程实用精解_Java网络编程实用精解
Java网络编程实用精解 作者:盛华 出版日期:2009年10月 文件大小:17.38M 支持设备: ¥30.00 适用客户端: 言商书局 iPad/iPhone客户端:下载 Android客户端:下 ...
- java 网络编程 博客园_java网络编程
1.计算机网络基础 OSI参考模型(开放系统互连参考模型): 物理层:物理层处于OSI的最底层,是整个开放系统的基础.物理层涉及通信信道上传输的原始比特流(bits),它的功能主要是为数据端设备提供传 ...
- java 读取硬件设备发送数据_Java网络编程基础
1.软件结构 C/S结构:全称为Client/Server结构,是指客户端和服务器结构.常见程序有QQ.迅雷等软件. B/S结构:全称为Browser/Server结构,是指浏览器和服务器结构.常见浏 ...
- java爬虫技术的作用_Java网络爬虫怎么实现?
展开全部 网络爬虫是一个自动提取网页62616964757a686964616fe4b893e5b19e31333365636561的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成. 传统 ...
- java获取一个tcp包大小_Java网络编程之TCP粘包拆包
TCP是个"流"协议,所谓流,就是没有界限的一串数据.大家可以想象河里的流水,他们是连成一片的,其间并没有分界线.TCP底层并不了解上层业务数据的具体含义,他会根据TCP缓冲区的实 ...
- java主类与源代码名称_Java高级编程基础:类文件结构解析,看穿Class代码背后的秘密...
类文件结构 在说完了JVM内部结构后,接下来我们需要说一下另外一个非常重要的基础概念Class类结构. 我们既然知道了开发的Java源代码会首先被编译成字节码文件保存,JVM的类加载器会读取这些文件内 ...
- java并发编程实践 读书笔记_Java - 并发编程实践(读书笔记)
[注] 同步机制保证:1)原子性 2)内存可见性: Volatile变量只能保证:1)可见性: - 恰当的同步,同步的弱形式,确保对一个变量的更新以可预见的方式告知其他线程. [注] 用锁来协调访问变 ...
最新文章
- mysql三次握手_一文彻底搞懂 TCP三次握手、四次挥手过程及原理
- 山东大学教授建议:让博士生先回学校
- hive 创建/删除/截断 表(翻译自Hive wiki)
- 【JavaSE03】Java中分支语句-练习
- Android Intent机制详解
- 【图论】【Kosaraju】刻录光盘(ssl 2344)
- 如何从JSF获取JSON响应?
- pm2 守护 nuxt
- C#使用Windows Service
- 3个查看远端端口是否畅通的方法
- LoginActivity实现
- C语言九九乘法表的五种输出形式(完整,左上,左下,右上,右下)
- 【代码笔记】RRDNet 网络
- C语言如何生成随机数
- 小技巧——cmd杀手进程
- [转载]OFDM基本原理及系统框图
- 储存profiles是什么意思_profiler,profile在计算机中是什么意思
- 修复下载后已发生损坏的压缩包(.rar)文件
- 创新指南|如何以STEPPS模型6招打造病毒式传播产品
- 算法---斐波那契思想
热门文章
- 要求公开华人程序员自杀真相,清华学霸被Facebook开除了
- 用户体验设计中的场景服务设计
- RK3588 调试 phy
- Consider defining a bean of type ‘cn.itcast.feign.clients.UserClient‘ in your configuration.解决方案
- HTML-内嵌框架-00
- 可扩展的交互式可视化框架,用于衡量新闻中的性别偏见
- 基于SSH框架的学生考试系统(注意看文档目录)
- 实用电路:用MOS管模拟的可调功率电阻
- 十款常用Linux系统介绍
- Python实现股票量化交易学习进阶(二)之简单交易策略的定义实现