黑马程序员——网络编程

来源:互联网 发布:软件培训老师 编辑:程序博客网 时间:2024/05/20 20:46

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

1.本地回路的ip地址:127.0.0.1;可以通过ping 127.0.0.1检查计算机上的Tcp/Ip是否正确安装。

同一台计算机中两个网络应用程序不能用同一个端口接收网络数据。端口号的范围0~65535,0~1023之间的端口数是用于一些知名的网络服务和应用。
2.TCP,传输控制协议(Transmisssion Control Protocol),是面向连接的通信协议。
UDP,用户数据报协议(User Datagram Protocol),是无连接通信协议。
3.Socket是网络驱动层提供给应用程序编程的接口和一种机制。Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP和Port。应用程序通过调用bind将socket的信息给驱动程序建立关系。
java中的网络编程类都位于java.net包中。其中DataguamSocket类用于UDP通信;ServerSocket类用于TCP通信的服务器端;Socket类用于TCP通信的服务器和客户端。
4.DatagramSocket类:
构造函数:
public DatagramSocket();用于UDP程序先发送数据时
public DataguaSocket(int port);用于UDP程序先接受别人发来的数据时
public DatagramSocket(int port,InetAddress laddr);用于UDP程序在有多个IP地址的计算机上运行时
Close方法:当应用程序不在需要使用DatagramSocket对象时就调用此方法把对象关闭,以通知驱动程序释放此对象保留的资源,系统就可以把此对象的端口给其他对象使用。
Send(DatagramPacket p)方法用于发送UDP数据包;
receive(DatagramPacket p) 方法用于接受UDP数据包;
5.如果把DatagramSocket比作创建的港口码头,那么DatagramPacket就是发送和接收数据的集装箱。
构造方法:
public DatagramPacket(byte[] buf,int length)用于接收数据时
public DatagramPacket(byte[] buf,int length, InetAddress address,int port)用于发送数据时指定接收方的IP地址和端口号。

getInetAddress和getPort方法分别用于发送方的Ip地址和端口号;getData和getLength方法可以得到DatagramPacket对象的字节数组缓冲区和实际接受到数据的长度。

6.InetAddress是用于表示计算机IP地址的一个类,而在日常应用中的计算机地址是用"192.168.0.1","www.it315.org"等字符串格式来表示的。
getByName静态方法可以根据那些字符串格式IP地址来返回一个相应的InetAddress对象;ck
getHostAddress方法可以返回一个InetAddress对象当中的字符串格式的IP地址。
7.当发送的数据中有中文时应该转换成字节数组在求长度。如:“it 咨询交流网".getBytes().length()才能得到实际信息长度。
8.UDP接收程序必须先启动运行,才能接收UDP发送程序发送的数据。
9.TCP客户端程序与TCP服务器端程序的交互过程:
(1)服务器程序创建一个ServerSocket,然后调用accept方法等待客户来连接。
(2)客户端程序创建一个Socket并请求与服务器建立连接。
(3)服务器接收客户的连接请求,并创建一个新的Socket与该客户建立专线连接。
(4)建立了连接的两个Socket在一个单独的线程(由服务器程序创建)上对话。
(5)服务器开始等待新的连接请求,当新的连接请求到达时,重复步骤(2)到步骤(5)发的过程。
10.ServerSocket的其中的一个构造函数Public ServerSocket(int port,int backlog)中的backlog为当服务器比较忙时可以与它保持连接请求的等待客户数量,默认值为50.
11.服务器端接收到客户端Scoket的连接请求时会通过accept()方法返回一个与客户端Socket建立专线连接的服务器端的Socket对象,不能使用Socket构造方法创服务器端的Socket对象。
12.当服务器端的Socket对象与客户端Socket对象建立专线连接后,它们以网络字节流的形式进行数据交换,Socket的getInputStream与getOutputStream分别用于返回Socket的输入流对象和输出流对象。
13.TCP服务器程序必须先启动运行,TCP客户程序连接上TCP服务器。
14.使用BufferedReader包装类,从网络输入流中一次读取一行文本。如:
ServerSocket ss=new ServerSocket(8001);
Socket s=ss.accept();
InputStream ips=s.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(ips));
15.使用Windows提供的telnet程序可以测试TCP服务器程序。如在命令行输入:
telnet 192.168.0.1(服务器的IP地址) 8001(服务器的监听端口)就可以作为一个客户端程序使用。打开本地回显可以通过先命令行中输入telnet进入telnet命令窗口中,然后输入
set LOCAL_ECHO就可以了。

16.TCP服务器程序模型的编程要点:
(1)TCP服务器程序要想能接收多个客户端连接,需要循环调用ServerSocket.accept方法。
(2)服务器程序与每个客户端连接的会话过程不能相互影响,需要在独立的线程中运行。
(3)一个线程服务对象与一个服务器端的Socket对象相关联,共同来完成与一个客户端的会话。
17.如何检测和解决端口冲突的问题:
(1)使用netstat -na可以查看当前正在被使用的TCP端口号。
(2)通过一个配置参数来指定TCP服务程序所使用的端口号。
(3)将用户所指定的端口号保存到一个文件中,当服务器程序下次启动运行时,直接从文件中读取那个端口号。
18.URL(Uniform Resource Locator 统一资源定位符)的基本组成:协议,主机名,端口号,资源名。例如:

http://www.it315.org:8080/index.html。
19.相对URL:例如:"/a.html"表示主机上某种协议的根目录、"./a.html"表示当前下的子目录或文件、"../a.html"表示当前资源所在目录的父目录、"../../a.html"表示父目录的父目录、"a.html"表示当前下的子目录或文件。
20.URL编码规则:
(1)将空格转换为加号(+);
(2)对0-9,a-z,A-Z之间的字符保持不变。
(3)对于所有其他的字符,用这个字符的当前字符集编码在内存中的十六进制格式表示,并在每个字节前加上一个百分号(%)。如字符"+"用+表示,字符"="用=表示,字符"&"用&表示,每个中文字符在内存中占有两个字节,字符"中"用��表示。
(4)对于空格也可以直接使用十六进制编码方式即用 表示,而不是将它转换成加号(+);
21.java.net包中提供了URLEncoder和URLDecoder这两个类,来实现URL编码和解码。
22.(1)基于HTTP 1.0协议的客户机与服务器的信息交换过程一次建立连接只能建立一个发送请求消息和响应就关闭连接了。而基于HTTP 1.1协议的客户机与服务器的信息交换过程只要建立连接就可以发送多个请求信息与响应,只有发出关闭连接请求后才关闭连接。
(2)一个完整的http请求消息包括:一个状态行、若干消息头、以及实体内容;且消息头与实体内容是可选的,并且它们之间要用空行隔开的,即使没有实体内容也要用空行表示消息头的结束。一个完整的HTTP响应消息和请求消息一样。消息头中消息描述":"后要用空格,如:server: Microsoft-IIS/5.0。
(3)需要了解以下几个消息头:
Connection:用于指定处理完本次请求/响应后,客户端与服务器是否继续保持连接。设置值可以为Keep-Alive和close。
Accept-Language:用于指出客户机期望服务器返回的文档所使用的国家语言,可以指定多个以逗号分隔的国家语言。
Content-Length:用于表示实体内容的长度(字节数).
Range:用于指定服务器只需返回文档中的部分内容及内容范围,有以下几个使用格式:
1)Range: bytes=100-599返回第100到599之间的内容包括100和599。
2)Range:bytes=100-返回第100个之后的所有内容。
3)Range: bytes=-100返回最后100个字节内容。
Content-Range:用于指定服务器返回的部分实体内容的位置信息,例如:Content-Range: bytes 2543-4532/7898。bytes为返回的类型,2543-4532为返回的是从2543-4532的实体内容,7898为实体内容总字节数。
4)HTTP请求消息在命令行中输入如:
telnet www.google.com 80
GET / HTTP/1.1(为返回主页)
Host:
Accept-Language: zh-cn,ar-bh
Connection: close
(此处空行记住)
23.(1)URL类的其中一个构造方法如: public URL(String protocol,String host,int port,String file,URLStreamHandler handler)其实URL类的每个构造方法都可引发MalformedURLException异常。
(2)URL类的只有调用openConnection方法去调用它的URLStreamHandler(协议处理器)的 openConnection方法返回一个URLCOnnection对象,利用这个对象才能访问网络资源的内容。
(3)URL类的setURLStreamHandlerFactory(URLStreamHandlerFactory fac)静态方法在java虚拟机中最多只能调用一次,并且这个方法的调用在创建任何URL类实例对象前。设置完后当创建URL类的实例对象时java虚拟机会根据其中出现的协议名调用URLStreamHandlerFactory类的createURLStreamHandler(String protocol)方法创建一个与这个协议名对应的协议处理器。当createURLStreamHandler(String protocol)方法返回的结果为NULL或者没有通过方法setURLStreamHandlerFactory(URLStreamHandlerFactory fac)设置时,java虚拟机会根据里面保存的对照表自动装载协议名对应的协议处理器,如果找不到URL构造方法就会抛出MalformedURLException异常。
(4)在URLConnection连接URL网络资源之前可以调用setRequestProperty方法来设置HTTP协议的各个请求消息头内容,当URLConnection对象调用Connection方法与远程资源建立连接以后,URLConnection对象就可以调用各种get方法读取远程资源的内容。如getHeaderFields方法可以读取HTTP服务器回送的所有响应消息头。URL对象已经与远程资源建立网络连接,应用程序就不能再调用URLConnection对象的设置连接参数与请求属性方法了,如果继续调用Connection方法也会被忽略,因为已经建立了连接。创建URLConnection对象时并没有与远程资源建立底层连接,但当没有建立连接时调用URLConnection类中的一些get方法时,那么这些方法就会自动调用Connection方法与远程资源建立连接。getInputStream和getOutputStream方法分别返回HTTP响应实体内容的InputStream对象和写入HTTP请求消息的OutPutStream对象。
(5)每个HttpURLConnection实例对象只能用于一次对话请求,就是只能向服务器发送一次请求和得到服务器一次响应结果。但是应用程序与HTTP服务器之间建立的底层网络连接可以被多个HttpURLConnection实例对象共享,这样就可以充分利用HTTP 1.1的持续连接的特性。调用HttpURLConnection中的InputStream或者OutputStream流对象的close方法只能关闭相应HttpURLConnection对象的相关网络资源,不会影响到那个共享连接。调用HttpURLConnection的disconnect方法可以关闭底层共享网络。

---------------------- android培训、 java培训、 期待与您交流! -------------------------------------
原创粉丝点击