`
manwuyuantao
  • 浏览: 8099 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Java编程语言-网络编程

 
阅读更多

 

2.Java网络编程

2.1网络模型

OSI参考模型

TCP/IP参考模型

 

应用层:HTTP

传输层:TCPUDP

网际层:IP

 

2.2网络通讯要素

1.IP地址

2.端口号(有效端口:0~65535其中0~1024系统使用或保留端口)

3.传输协议

 

IP地址:

用于标识网络中的设备

本地回环地址:127.0.0.1(网卡的默认IP地址)

主机名:localhost

java.net包中 InetAddress类是对IP地址进行相关操作的类。此类不可以NEW对象,可以通过相关方法返回一个InetAddress对象。

 

2.3 UDP协议与TCP协议的区别

UDP:将数据及源和目的封装成数据包中,不需要建立连接;

每个数据包的大小限制在64K内;

因无连接所以传输速度快;

但是这种无连接的协议不可靠。

TCP:需要建立连接,形成传输数据的通道;

在连接中进行大数据量传输;

通过三次握手完成连接,是可靠协议;

因必需建立连接所以效率会稍低。

 

Socket

Socket就是为网络服务提供的一种机制;

通信的两端都有Socket

网络通信其实就是Socket间的通信;

数据在两个Socket间通过IO传输。

 

2.4 UDP传输步骤

DatagramSocketDatagramPacket

1.建立发送端,接收端

通过DatagramSocket创建对象

构造函数有很多根据需要进行创建对象

注意:建立接收端时需要通过构造函数创建对象设置端口。

2.建立数据包

通过DatagramPacket创建对象

构造函数有很多根据需要进行创建对象

注意:建立发送端时需要通过构造函数设置数据、IP和端口等信息。

3.调用Socket的发送/接收方法

发送:send(DatagramPacket p)发送数据报包。

接收:receive(DatagramPacket p)接收数据报包。

接收后可以使用数据包对象方法获取具体的内容:

InetAddressgetAddress() 返回某台机器的 IP地址,此数据报将要发往该机器或者是从该机器接收到的。

byte[]getData() 返回接收到的数据缓冲区。

int getLength()返回将要发送或接收到的数据的长度。

intgetPort() 返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。

4.关闭Socket

注:发送端与接收端是两个独立的运行程序

 

局域网段:192.168.1.0~192.168.1.255

其中192.168.1.0是代表网络段,192.168.1.255代表广播地址。

 

2.5 TCP传输步骤

SocketServerSocket

1,建立客户端和服务器端

客户端:通过Socket类创建对象,并利用构造函数传入服务端主机名(ip)和端口,

也可通过相关方法进行设置。

服务端:通过ServerSocket类创建对象,利用构造函数设置服务端的端口,也可

通过相关方法进行设置。

2,建立连接后,通过Socket中的IO流进行数据的传输

客户端:建立客户端对象后通过getOutputStream()getInputStream()方法获取一个

IO流对象,通过write()read()方法与服务端进行传输数据。

服务端:通过ServerSocket对象的accept方法获取连接过来的客户端(Socket)对象

(没有连接就会等,所以这个方法是堵塞的),通过获取到的客户端对象

来获取此对象的IO流(接收或发送)数据并对数据进行处理。(通过获

取到的客户端对象,就可以用其此对象的相关方法来获取客户端的相关信

息如IP)

3,关闭Socket

注:客户端和服务器端是两个独立的应用程序

注:客户端调用close方法后会自动向服务端发送结束标记(-1),服务端与此客户端的连接就会自动断开。

注:如果客户端和服务端都有阻塞式方法(如read方法)时很有可能会出现莫名的等待而显示不出数据,这是因为阻塞式方法没有读到结束标记。如读键盘输入的字符数据时结束标记是回车符,此时应在write()方法后加上结束标记newLine()同时刷新(flush)缓冲。

注:还有一些其它问题会导致客户端或服务端形成阻塞,比如客户端让服务端传一个文件,客户端传完文件后服务端会形成阻塞其实服务已经把数据都读取完了只是因为客户端没有向服务端发送结束标记,所以服务端会形成阻塞一直在那等,解决此办法可以在客户端自定义一个结束标记在开始传数据前传给服务端在客户端传完数据后再向服务端传送一次标记代表传完,服务端接收数据前接收到结束标记并把这个标记放在读取数据遍历中进行判断。另外一种方法也可以解决客户端或服务端阻塞的情况:

Socket类中的方法:shutdownOutput()此方法代表关闭客户端的输出流,也就是相当于给流中加入一个结束标记-1

Socket类中还有另外一个方法shutdownInput()代表关闭输入流,相当于给流中加入一个结束标记-1

 

2.6 URL

String getAuthority()

获取此 URL的授权部分。

Object getContent()

获取此 URL的内容。

Object getContent(Class[] classes)

获取此 URL的内容。

int getDefaultPort()

获取与此 URL关联协议的默认端口号。

String getFile()

获取此 URL的文件名。

String getHost()

获取此 URL的主机名(如果适用)。

String getPath()

获取此 URL的路径部分。

int getPort()

获取此 URL的端口号。

String getProtocol()

获取此 URL的协议名称。

String getQuery()

获取此 URL的查询部分。

String getRef()

获取此 URL的锚点(也称为“引用”)。

String getUserInfo()

获取此 URL userInfo部分。

int hashCode()

创建一个适合哈希表索引的整数。

URLConnectionopenConnection()

返回一个 URLConnection对象,它表示到 URL所引用的远程对象的连接。

URLConnectionopenConnection(Proxy proxy)

openConnection()类似,所不同是连接通过指定的代理建立;不支持代理方式的协议处理程序将忽略该代理参数并建立正常的连接。

InputStream openStream()

打开到此 URL的连接并返回一个用于从该连接读入的 InputStream

boolean sameFile(URL other)

比较两个 URL,不包括片段部分。

protectedvoid set(String protocol, String host, int port, String file, String ref)

设置 URL的字段。

protectedvoid set(String protocol, String host, int port, String authority, String userInfo, String path, String query, String ref)

设置 URL的指定的 8个字段。

static void setURLStreamHandlerFactory(URLStreamHandlerFactory fac)

设置应用程序的 URLStreamHandlerFactory

String toExternalForm()

构造此URL 的字符串表示形式。

String toString()

构造此 URL的字符串表示形式。

URI toURI()

返回与此 URL等效的 URI

 

URLConnection是一个抽象类它代表应用程序和 URL所指向的主机之间进行通信链接,可以通过URL类的openConnection()方法返回一个URLConnection对象,可以通过此对象方法获取主机的流等操作。方法如下:

InputStream getInputStream()返回从此打开的连接读取的输入流。

OutputStream getOutputStream()返回写入到此连接的输出流。

方法有很多不一一列出,具体查看AIP文档。

 

小知识点:

1Socket类创建对象时有空参数的构造函数,那那么创建后可以通过自身的connect(SocketAddress endpoint)方法连接到服务器,其中参数SocketAddress类为抽象类但它有子类是InetSocketAddress类。

InetSocketAddress类和InetAddress类的区别:

InetAddress:是对IP地址进行相关操作的类。此类不可以NEW对象,可以通过相关方法返回一个InetAddress对象。

InetSocketAddress:是对IP地址+端口进行相关的操作,此类可以创建对象。

 

2ServerSocket类的构造函数有种是ServerSocket(int port, int backlog) ,其中参数backlog代表队列的最大长度,意思就是说能同时连接服务器的最大客户端个数(同时在线数)

 

 

2.7域名解析

平时我们访问网站都用的主机名如:www.baidu.com,其实先用主机名本地的host文件(详细见下)找有没有与之对应的,如果没有再拿主机名到公网DNS服务器上找到与之对应的IP地址,然后再拿IP地址去访问百度的主机服务器。

本地主机的IP与主机名:

http://127.0.0.1:8080

http://localhost:8080

其实本地IPlocalhost的映射关系就在本机上:c:\window\system32\drivers\ext\host

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics