java网络相关

来源:互联网 发布:无人深空3dm优化 编辑:程序博客网 时间:2024/05/03 03:23

1, IP,端口号,域名,主机

IP-一个ip地址往往对应了一个服务器,或者说一台主机。

 

端口号-每一台主机有十二万多个端口号,每一个端口号都可以发送网络请求,端口号分为TCP端口(6万),UDP端口(6万),其中小于1024号的端口往往被固定的一些应用所占有,其他引用在发送请求的时候往往不能通过这些端口进行网络请求。

 

域名-域名是方便大家记忆的网址,在访问这些网址的时候会通过两种方法转换成IP地址才能连接到相应主机访问相应的文件,其中之一,是通过,本机所特有的hosts文件,这个文件中定义了一些网址域名所对应的IP地址,当hosts文件中不存在这样的对应关系时,就会采取另一种万能的方法,就是向不属于本机的DNS服务器发送请求,DNS服务器进行解析变成IP地址返回,再访问IP地址,从而达到目的。

 

主机-主机一台电脑,或者说是一台有自己独立IP地址的电脑,注意这里电脑可以是笔记本,台式,甚至巨型计算机。

 

相关内容在此不过多进行赘述,详情请参看《TCP/IP详解》

 

Java中实现这几项功能的是使用:InetAdress来代表IP地址。

其下有两个子类:Inet4Adress Inet6Adress分别代表了IPv4和Ipv6

InetAdress没有提供构造器,而是提供了几个静态方法来获取InetAdress实例

 

方法介绍:

静态方法系:定义类-InetAdress 调用方式:InetAdress.<方法名+参数>获取实例

getByName(String host)

简介:根据主机获取相应的Ip地址,参数为host码(host文件中网址对应的ip,或者可以理解为DNS服务器中储存的网址对应的IP地址)。

返回值:InetAdress对象

 

getByAdress(byte[]addr)

简介:根据原始Ip地址获取相应的对应的IP地址

返回值:InetAdress对象

 

getLocalHost()

简介:返回本机的IP地址

返回值:InetAdress对象

常用非静态方法介系:定义类-InetAdress 调用方式InetAdress实例对象.<方法名加参数>

getCanonicalHostName()

简介:获取此IP地址的权限定域名

返回值:String

 

  getHostAdress()

简介:返回该InetAdress对象所有的IP地址字符串。

返回值:字符串。

 

getHostName()

简介:返回此IP地址的主机名。

返回值:String

 

IsReachable()

简介:用于测试相应的IP地址是否能访问该主机名。

返回值:String

 

注意:这是建立Service和Client之间连接的第一步,拿到地址才能建立连接。

这一步可以理解为:建立连接的奠基。

 

2, 资源定位指针-URL资源定位器。

(1)字符串的转换:

URLDecoder和URLEncoder编码与解码。

乱码情况在网络中是非常常见的一种情况。为了避免这种情况,应和需求。就出现了java中的这两个类。

URLDecoder类

decode(String s,String enc)静态方法,可以将看似乱码的东西(s)转换成普通编码。

 

URLEncoder类

URLEncoder(String s,String enc)静态方法,可以将普通字符(s)转换成MIME字符串。

 

(2)URL资源类

顾名思义,URL就是某一个资源所对应的地址。

URL的构造试用构造器

 

URL的访问需要使用一些非静态的方法。

getFIle()获取资源名,返回值String

getHost()获取主机名,返回值String

getPath()获取URl路径部分,返回值String

getPort()获取URl端口号,返回值int

getProtocol()获取相应的网络协议,返回值Sting

getQuery()获取该URL的查询字符串部分,返回值String

 

openConnection()代表了远程连接,返回值URlConnection对象

   openStream()用于帮助读取资源,返回值IntputStream

 

   通过openStream方法可以实现多线程下载资源,其中涉及线程同步相关知识。资源的收取,利用与线程的同步,生产者消费者模型密不可分。

 

其中重要的URLConnection类代表了远程连接,是一种非常实用的类,通过其中的getCottentLength()方法可以得到相应的资源大小,此后才可以在磁盘中建立相应的储存空间以放置这些相应的资源。

 

(3)URLConnection类-远程连接类,连接类型。

创建方法,通过URL中的openConnection方法创建相应URL所对应的连接。

必不可少的是要在使用这个对象前,对其进行一系列的属性设置,让其完备,才可以建立安全有效的连接。

 

然后介绍两种基础的连接:

网络请求,网络请求就像两台主机妈妈之间的对话,请求顾名思义,有求于人,一般是client向service发送的数据,用于表明服务器应该返回什么样类型数据的一些数据。

 

Get请求:这是一种相对于简单的请求,一般像获得html网页文件这样的简单请求通过get请求完成,这种请求的携带数据相对简单,这种请求的发送方式相对简单,生成的方式简单。但应用很广泛,可以实现大部分网络传输。

 

POST请求:这是一种相对于复杂的请求,相对于Get请求往往各方面都复杂得多,这是一种相对安全的请求,一般用于登录密码的验证,转账之类需要安全的网络传输。

 

URLConnection对象使用方法

<1>创建

<2>设置基础属性(即基础携带数据)

<3>get请求使用connect()方法建立连接。POST请求需要获取相应的输入输出流来进行传输。

<4>远程资源变为可用,通过访问相应的头字段或者使用建立连接的,输入输出流进行访问相应的源。

 

重中之重就是设置URLConnection所携带的数据。

方法列表:

下列方法都很易懂,是设置相应的头字段的值的方法。

SetAllowUserInteraction()

SetDoInput()

SetDoOUtPut()

SetifModifieSince()

SetUseCaches()

 

当然下面有一个类似于正则匹配的通用方法可以代替上述设置字段方法

 

SetRequestProperty(Stringkey,String value),key代表要匹配的相应要设置的头字段,value即要设置的值。

 

人性化的java语言中还补充了一个方法

addRequestProperty(Stringkey,String value),同上只不过这个方法用于补充,在相应的头字段后面追加一系列的值,不会覆盖之前的设置。

 

一些用于获取头字段内容的常用方法:

GetContent()返回object, 获取URLContent的内容

GetHeaderField(Stringname)返回String用于返回指定响应头字段。

GetInputStream()返回输出流,获取URLConnection的值

GetOutputStream() 返回输入流,向URLConnection发送请求参数

 

对于特定的头字段类似于set系列方法,也有特定的get系列方法如下:

GetContentEncoding()

GetContentLength()

GetContentType()

GetDate()

GetExpiration()

GetLastModified()

                                             

发送get请求案例如下:

使用发送请求的url,发送请求的参数param

New出来新的连接url,使用url的openConnection方法new出来新的UrlConnection对象

使用set系方法设置URLConnection对象的属性

使用connect方法建立连接,遍历响应头字段(URLConnection)

定义BufferReader接上使用getInputStream()方法返回的输入流

获取相应的资源

 

发送POST请求案例如下:

同样需要一个发送连接的URL对象

拿到URL连接URLConnection对象

使用set系方法设置相应属性

此时不再使用connect方法,改使用setDoOutput(true),setDoInput(true)

然后先获取输出流getOutputStream()方法输出相应参数param

然后获取输入流同上所述。

 

最后注意参数的格式:

Param应满足“name1=param1&name2=param2”

如此发送GET,POST请求成功获取相应内容也已成功

 

如此相应的连接基础已经结束,进入正题。

3, TCP网络基础之Socket网络

Socket的中文释义是插座,很形象,TCP的网络连接就是两个插座连在一起中间信息相互传输。

Java中也确实是这样实行的两个Socket对象之间的连接,不过要区分Client与Server两者之间的区别,两个端之间的Socket也略有不同。

 

接收客户端信息的类-ServerSocket类

方法介绍:

构造方法:

New

参数:

1,监听端口号

2,端口号,用于改变队列长度的int backlog

4, 端口号,用于改变队列长度的int backlog ,InnetAdress 多个IP地址限定其中一个IP地址

 

Accept()非静态方法,返回值为Socket用于建立两者之间的通信

Close()非静态方法,用于关闭使用完毕的ServerSocket对象

 

客户端与服务器之间正正的连接桥梁-Socket类

 

构造:

New

参数介绍:

InnetAdress/String remoteAdress,int port

创建远程主机连接,注意这里没有使用本机IP会自动获取,没有使用端口选择,会自动使用系统分配的端口号。

 

InnetAdress/String remoteAdress,int port, InnetAdress localAdress,int localPort

与上一个方法不同之处就在于其制定了本机的IP地址,指定了发送请求的相应端口号

上述第一个参数String的意思是可以不指定相应的InnetAdrress对象而是直接使用相应的IP地址(String)作为远程连接的IP地址。

 

当两个主机建立了相应的Socket连接以后,就可以进行相应的通信了

两个必不少的输入输出方法:

GetInputStream(),getOutputStream()两个相应的输入输出流实现了两个网络连接之间的数据传输。

 

SetSoTimeout(int timeout)非静态方法,以毫秒为单位

该方法指定了读取操作的时间限制,当操作超出一定的时间限制以后,会自动断开连接,由于网络连接往往是阻塞式的,所以这方便了下一个连接的完成。

当超时后会抛出相应的异常:

SocketTimeoutException,如此进行一番捕获后就可以实现诸多功能。

 

多线程的网络连接:

对于服务器端,每一个Socket都应该对应着一个相应的线程,这样避免了阻塞主线程使程序无法进行下去。

在此不做过多介绍。

基础的java网络通信在此告一段落。

Java中还提供了一系列的类和方法实现非阻塞的网络连接,异步IO连接,UDP连接,代理服务器连接等。

0 0
原创粉丝点击