您的位置:首页 > 理论基础 > 计算机网络

黑马程序员--java网络编程

2011-10-01 16:13 267 查看
---------------------- android培训java培训 、期待与您交流!
----------------------



我们经常会用到网络应用,比如网络聊天,发送文件等,这就需要用到网络编程。

1.TCP/IP协议

IP地址与端口号

IP地址:定位到网络中的计算机

端口号:定位到计算机中具体的网络应用程序

范围:0-65535,其中0-1023的端口用于一些知名的网络服务和应用,自己编写的程序使用1024-65535之间的端口号

UDP与TCP

TCP ,传输控制协议(Transmission Control Protocol)面向连接,可靠传输

UDP,用户数据报协议(User Dategram Protocol)无连接,不可靠传输

UDP与TCP数据帧格式:协议类型 源IP 目标IP 源端口 目标端口 帧序号 帧数据

2.Socket

网络驱动层提供给应用程序编程的接口和一种机制。

Socket类似与港口,应用程序将需要发送的数据放在Socket中,然后驱动程序使用网卡将数据发送出去,数据传输到接收方的Socket中,就好像别的程序把货物送到码头,然后接收方应用程序来码头取货物。不同的协议使用的Socket类不一样。

3.UDP网络程序

DatagramSocket

DatagramSocket构造方法:

public DatagramSocket():一般用于发送方,Socket绑定到系统分配的端口,使用网卡对应的IP地址。

public DatagramSocket(int port):一般用于接收方,Socket绑定到指定的端口,发送方才能够给其发送数据

public DatagramSocket(int port, InetAddress laddr):Socket绑定到指定的端口,使用指定的IP地址

Close方法

关闭Socket,释放资源

public void send(DatagramPacket p),发送数据报包
public void receive(DatagramPacket p),接收数据报包

DatagramPacket

如果把Socket比作码头,DatagramPacket就相当于发送和接收数据的集装箱。

构造函数:

public DatagramPacket(byte[] buf,int length):一般用于接收方,不需要指定端口号和IP,byte[] buf提供数据缓冲区,length指定接收数据包得大小

public DatagramPacket(byte[] buf, int length, InetAddress address, int port):一般用于发送方,需要指定目标的端口号和IP

getInetAddress方法和getPort方法

用于接收方获得发送方的IP和端口号

getData方法和getLength方法
public byte[] getData():返回数据缓冲区
public int getLength():返回将要发送或接收到的数据的长度。

4.私有IP通过网关代理上网的原理

私有IP 内网IP&InternetIP InternetIP1

中间部分相当于网关

私有IP访问InternetIP1的过程:

私有IP将数据发送到内网IP,然后经由InternetIP的某个端口 发送到InternetIP1,并且维护一个私有IP和InternetIP端口的映射表,InternetIP1想与私有IP通信,只需要将数据发送到私有IP对应的InternetIP端口即可。InternetIP端口会通过查映射表将数据转发到私有IP。

注意:

1.映射表是有时效性的,如果映射表过一定的时间没有使用,该记录会被清除。
2.通信必须由私有IP发起,InternetIP1不能直接与私有IP通信。

5.TCP网络程序

分为服务器端和客户端

原理:

客户端的Socket发送请求,服务器端的ServerSocket接收客户请求,accept方法处理请求创建一个Socket对象与客户端进行通信。

TCP程序必须先启动运行,TCP客户程序才能连接上TCP服务器

步骤:TCP客户端程序与TCP服务器端程序交互过程:

1.服务器程序创建一个ServerSocket,然后调用accept方法对待客户来连接。
2.客户端程序创建一个Socket并请求与服务器建立连接
3.服务器接收客户的连接请求,并创建一个新的Socket与该客户建立专线连接。
4.建立了连接的两个Socket在一个单独的线程上对话(由服务器端提供)
5.服务器等待新的连接请求,当新的连接请求到达时。重复步骤2到步骤5的过程

ServerSocket

public ServerSocket(int port) 绑定端口号
close方法:

关闭对象,释放资源

accept方法

public Socket accept() 等待连接,连接传入之前一直阻塞

TCP服务器端程序的编写要点:

1.TCP服务器端程序要想能够接收多个客户端连接,需要循环调用ServerSocket.accept方法.
2.服务器程序与每个客户端连接的会话过程不能互相影响,需要在独立的线程中运行。

6.URL

URL(UniformResourceLocator)统一资源定位符,用于访问Internet上的资源的。

URL基本组成:协议 主机名,端口号,资源名

URL的编码规则:

1.将空格转化为+
2.对于0-9,a-z,A-Z,保持不变
3.对于所有的其他字符,用这个字符的当前字符集编码在内存中的十六进制格式表示,并在每个字节前加上一个百分号(%)如字符“&”用%26表示,字符“中”用%D6%D0表示。
4.对于空格也可以直接使用其十六进制编码方式,即用%20表示,而不是将它转换为加号(+)。

HTTP请求消息

一个完整的请求消息包括:一个请求行、若干消息头,以及实体内容

HTTP响应消息

一个完整的响应消息包括:一个状态行,若干消息头,以及实体内容。

工厂设计模式

为什么要使用工厂模式

URL类根据提供的协议,需要产生相应的URLStreamHandler类来对这种协议进行处理,按照一般的思路我们可以将protocol作为参数传递进去,URL类就可以根据参数产生响应的URLStreamHandler,但是有一个问题,协议有很多种,并且不断有新的协议产生,在设计URL类的时候不可能考虑到所有的协议,所以可以把URLStreamHandler的任务专门交由一个类来处理,这个类的任务就是根据提供的协议,产生对应的URLStreamHandler,就相当于一个专门生产URLStreamHandler类的工厂一样,这样如果有新的协议出现,只需要修改工厂类,在工厂类中增加生产与这种协议对应的URLStreamHandler即可,这种工厂设计模式大大增加了程序设计的灵活性。

URL类的URLStreamHandlerFactory

public static void setURLStreamHandlerFactory(URLStreamHandlerFactory fac):设置URL类使用的URLStreamHandlerFactory ,只能被调用一次。

URLStreamHandlerFactory类的createURLStreamHandler方法

URLStreamHandler createURLStreamHandler(String protocol) :根据提供的协议产生相应的URLStreamHandler

注意

URL有一个常用的的protocol和URLStreamHandler对应的表,就算URL类没有设置URLStreamHandlerFactory,URL也可以产生常用的URLStreamHandler。

使用工厂模式的情况

1.如果在一个类中需要产生另一个类,而在设计这个类的时候不可能考虑到所有的情况,可以把产生另一个类的任务专门交由一个工厂类来处理。
2.我们不想让外界知道我们是如何产生另一个类的,我们也可以采用工厂模式将产生另一个类的过程封装起来。

URLConnection与HttpURLConnection

URLConnection的作用是与目标资源建立连接

URLConnection的连接过程:

1.创建URLConnection对象
2,调用public void setRequestProperty(String key,String value)设置一般请求属性
3.调用connect()建立连接
4.通过getHeaderFields(),getHeaderField,getContentLength,getContentEncoding等方法获取响应头字段的值
如果没有建立连接而直接调用获取信息的方法,也会自动的建立连接

getInputStream和getInputStream

getInputStream得到响应消息的流对象

getOutputStream得到请求消息的流对象

HttpURLConnection

在http协议下的URLConnection,URL与目标资源建立的底层网络连接只有一个,但是可以被多个HttpURLConnection对象共享。

一个HttpURLConnection实例对象只可以向服务器发送一次请求,并且得到服务器的一次响应。调用getInputStream和getInputStream的close方法,关闭的是流对象和所占用的系统资源,并不会关闭底层的网络连接。

disconnect方法

关闭底层的网络连接。



---------------------- android培训java培训 、期待与您交流!
----------------------

详细请查看:http://edu.csdn.net/heima
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: