iis网站在点默认文档的时候报错.,企业建设网站目的,网站备案核验点,网站结构有哪些一、网络程序设计基础
1.局域网与因特网
为了实现两台计算机的通信#xff0c;必须用一个网络线路连接两台计算机#xff08;服务器--网络--客户机#xff09;。
服务器是指提供信息的计算机或程序#xff0c;客户机是指请求信息的计算机或程序。网络用…一、网络程序设计基础
1.局域网与因特网
为了实现两台计算机的通信必须用一个网络线路连接两台计算机服务器--网络--客户机。
服务器是指提供信息的计算机或程序客户机是指请求信息的计算机或程序。网络用于连接服务器与客户机实现两者间的相互通信。但有时在某个网络中很难将服务器与客户机区分开。我们通常所说的局域区(Local Area NetworkLAN)就是一群通过一定形式连接起来的计算机。它可以由两台计算机组成也可以由同一区域内的上午台计算机组成。将LAN延伸到更大的范围这样的网络称为广域网(Wide Area NetworkWAN)。我们熟悉的因特网(Internet)就是由无数的LAN和WAN组成的。
2.网络协议
网络协议规定了计算机之间连接的物理、机械网线与网卡的连接规定、气有效的电平范围等特征计算机之间的相互寻址规则数据发送冲突解决方式长数据如何分段传送与接收等内容。就像不同的国家有不同法律一样目前网络协议也有多种。 常用网络协议
(1) IP协议
IP是Intemet Protocol的简称是一种网络协议。Internet网络采用的协议是TCP/IP协议其全称是Tinsmission ctiol Protocol Internet Protocol.Interet 依靠TCP/IP协议在全球范围内实现了不同硬件结构、不同操作系统、不同网络系统间的互联。在Interet网络上存在着数以亿计的主机每台主机都用网络为其分配的Internet地址代表自己这个地址就是IP地址。到目前为止IP地址用4个字节(byte)也就是32位的二进制数来表示称为 IPv4。为了便于使用通常取每个字节的进制数不包含符号位所以 最小为0最大佳为255(是并且每个字节之间用圆隔开表示IP地址如192.168.1.1。现在人们正在试验使用16个字节来表示IP地址这就是IPv6但IPV6还没有投入使用。TCP/IP 模式是一种层次结构共分为4层分别为应用层传输层互联网层和网络层。各层实现特定的功能提供特定的服务和访问接口并具有相对独立性。
(2)TCP与UDP协议
在TCP/IP协议栈中有两个高级协议是网络应用程序编写者应该了解的即传输控制协议-TCPTransmission ControlProtocol)与用户数据报协议-UDP(User Datagram Protocol)。
TCP协议是一种以固按连线为基础的协议它提供两台计算机间可靠的数据传送。TCP可以保证从一端数据送至连接的另一端时数据能够确实送达而且抵达的数据的排列顺序和送出时的顺序相同。因此TCP协议适合可靠性要求比较高的场合。就像拨打电话必须先拨号给对方等两端确定连接后相互才能听到对方说话也知道对我回应的是什么。
HTTP超文本传输协议、FTP文本传输协议和TelnetTelnet协议等都需要使用可靠的通信频道。例如HTTP从某个URL标准资源地址读取数据时如果收到的数据顺序与发送时不相同可能就会出现一个混乱的HTML文件或是一些无效的信息。
UDP协议是无连接通信协议不保证数据的可靠传输但能够向若干个目标发送数据或抗收来自若干个源的数据。UDP以独立发送数据包的方式进行。这种方式就像邮递员送信给收信人可以寄出多个信给同一个人且每一封信都是相对独立的各封信送达的顺序并不重要收信人接收信件的顺序也不能保证与寄出售件的顺序相同。
UDP协议适合于一些对数据准确性要求不高但对传输速度和时效性要求非常高的网站如网络聊天室、在线影片等。这是由于TCP协议在认证上存在额外耗费可能使传输速度减慢而VDP协议即使有一小部分数据包遗失或传送顺序有所不同也不会严重危害该项通信。
一些防火墙和路由器会设置成不允许UDP数据包传输因此若遇到UDP连接方面的问题,应先确定所在网络是否允许UDP协议。
3.端口和套接字
一般而言一台计算机只有单一的连到网络的物理连接Physica Connection)所有的数据都通过此连接对内、对外送达特定的计算机这就是端口。 网络程序设计中的端口port并非真实的物理存在而是一个假想的连场装置。端口被规定为一个0~65535之间的整数2^(16)-1。HTTP服务一般使用80端口FTP服务使用21端口。假如一台计算机提供了HTTP、FTP等多种服务那么客户机会通过不同的端口来确定连接到服务器的哪项服务上。如图1。
通常0~10232^(10)-1之间的端口数用于一些知名的网络服务和应用用户的普通网络应用程序应该使用 1024以上的端口数以避免端口号与另一个应用或系统服务所用端口冲突。
网络程序中的套接字Socket)用于将应用程序与端口连接起来。套接字是一个假想的连接装置就像插座一样可连接电器与电线如图2。
Java将套接字抽象化为类程序设计者只需创建Socket类对象即可使用套接字。 二、TCP程序设计基础
TCP网络程序设计是指利用Socket类编写通信程序。利用TCP协议进行通信的两个应用程序是有主次之分的一个称为服务器程序另一个称为客户机程序两者的功能和编写方法大不一样。
服务器端与客户端的交互过程如图。 ①服务器程序创建一个ServerSocket服务器套接字,调用accept()方法等待客户机来连核。 ②客户端程序创建一个 Socket请求与服务器建立连接。 ③服务器接收客户的连接请求同时创建一个新的Socket与客户机建立连接。随后服务器继续等待新的请求。
1.InetAddress类
java.net包中的InetAddress类是与IP地址相关的类利用该类可以获取IP地址 、主机地址等信息。
常用方法
静态 getByName(Sting host) 获取与Host相对应的InetAddress对象返回值为InetAddress。例主机名 DESKTOP-2TJS791 InetAddress ia DESKTOP-2TJS791/127.0.0.1 地址 12.34.56.78 InetAddress ia/12.34.56.78 8998 InetAddress ia/0.0.35.38
静态 getLocal Host() 返回本地主机的 InetAddress对象返回值为InetAddress。
非静态 get HostAddress() 获取InetAddress对象所包含的IP地址返回值为String。
非静态 getHostName() 获取此 IP地址的主机名返回值为String。
例
public class Test {public static void main(String[] args) {try {InetAddress ip InetAddress.getLocalHost();// ipDESKTOP-2TJS791/192.168.5.13String hostNameip.getHostName();//hostNameDESKTOP-2TJS791String hostAddressip.getHostAddress();//hostAddress192.168.5.13InetAddress inetAddressInetAddress.getByName(hostName);//inetAddressDESKTOP-2TJS791/192.168.5.13System.out.println(InetAddress对象本地主机ip);System.out.println(主机名hostName);System.out.println(主机地址hostAddress);System.out.println(InetAddress对象依靠主机名生成inetAddress);/** 输出结果为* * InetAddress对象本地主机DESKTOP-2TJS791/192.168.5.13* 主机名DESKTOP-2TJS791* 主机地址192.168.5.13* InetAddress对象依靠主机名生成DESKTOP-2TJS791/192.168.5.13*/} catch (UnknownHostException e) {//InetAddress类的方法会抛出UnknownHostException异常所以必须进行异常处理。这个异常在主机不存在或网络连接错误时发生。e.printStackTrace();}}}
2.ServerSocket类
java.net包中的 Senersocket类用于表示 服务器套接字其主要功能是等待来自网络上的“请求”它可通过指定的端口来等待连接的套接字。服务器套接字一次可以与一个套接字连按。如果多台客户机同时提出连接请求服务器套接字会将请求连接的客户机存入列队中然后从中取出一个套接字与服务器新建的套接字连接起来。若请求数大于最大容纳数则多出的连接请求被拒绝。队列的默认大小是50。
(1)ServerSocket构造方法通常会抛出IOException异常
Serversocket() 创建非绑定服务器套接字Server socket (int port) 创建绑定到特定端口的服务器套接字等待连接的队列长度为默认的50Server Socket(int port int backlog) 利用指定的backlog等待连接的队列最大长度不写默认50创建服务器套接字并将其绑到指定的本地端口上ServerSocket (int portint backlog InetAddress bindAddress) 使用指定的端口、侦听backlog和要绑定到的本地IP地址创建服务器。 这种情况适用于计算机上有多块网卡和多个IP地址的情况用户可以明确规定ServerSocket在哪块网卡或哪个IP地址上等待客户机的连接请求。
(2)ServerSocket类常用方法
accept() 等待客户机的连书。若进接则创建一个套接字。返回值为 Socket 。isBound() 判断 ServerSocket的绑定状态。返回值为 Boolean 。getInetAddress() 返回此服务器套接字的本地地址。返回值为 InetAddress 。isClosed() 返回服务器套按字的关闭状态。返回值为 Boolean 。closel() 关闭服务器套按字。返回值为 void 。bind (SocketAddress endpoint) 将ServerSocket 绑定到特定地址上IP地址和端口号。返回值为 void 。
getLocalPort() 返回此套接字在其上侦听的端口。返回值为 int 。
调用Serverfocket类的accept(方法会返回一个和客户端 Socket对象相连接的Socket对象。服务器端的Socket对象使用 getOutputStream()方法获得的输出流将指向客户端Socket 对象使用 getInputStream()方法获得的输入流同样服务器端的Socket 对象 使用 getInputscream()方法获得输入流将指向客户端的Socket对象使用 getOutputstream()方法获得的那个输出流。也就是说当服务器向输出流写入信息时客户端通过相应的输入流就能读取反之亦然。
accept()方法会阻塞线程的继续执行直到接收到客户的呼叫。语句如果没有客户请求accept()方法没有发生阻塞肯定是程序出现了问题。通常是使用了一个被其它程序占用的端口号ServerSocket绑定没有成功。
3.TCP网络程序
明白了TCP程序工作的过程就可以编写TCP服务器程序了。在网络编程中如果只要求客户机向服务器发送消息不要求服务器向客户机发送消息称为单向通信。客户机套接字和服务器套接字连接成功后客户机通过输出流发送数据服务器则通过输入流接收数据。
(1)例.服务器
public class Test {public static void main(String[] args) {//启动服务器new MyTCPServer().startServer(); }
}//服务器
class MyTCPServer{private BufferedReader reader;private ServerSocket server;private Socket socket;void startServer() {try {//创建服务器套接字servernew ServerSocket(8998);System.out.println(服务器套接字已经创建成功);while(true) {System.out.println(等待客户机的连接);//等待客户机连接在有客户机连接前会一直阻塞socketserver.accept();//连接成功后根据套接字获取输入流readernew BufferedReader(new InputStreamReader(socket.getInputStream()));getClientMessage();}} catch (IOException e) {e.printStackTrace();}}private void getClientMessage() {try {while(true) {//获取输入流内容String strreader.readLine();if(str!null) {System.out.println(客户机str);}else if(strnull) {//输入流中断-输入结束break;}}}catch(Exception e) {e.printStackTrace();}try {if(reader!null) {reader.close();readernull;}if(socket!null) {socket.close();socketnull;}}catch(Exception e) {e.printStackTrace();}}
}
(2)例.客户机
public class Test {public static void main(String args[]) {//启动客户机new MyTCPClient().startClient();}
}//客户机
class MyTCPClient{private PrintWriter writer; //输入流的一种使用println()输出void startClient() {System.out.println(尝试连接);try {//创建用于连接目标服务器的套接字Socket socketnew Socket(127.0.0.1,8998);//根据套接字生成输入流会产生阻塞未连接到服务器会一直阻塞writernew PrintWriter(socket.getOutputStream(),true);System.out.println(连接成功);putMessage();} catch (IOException e) {e.printStackTrace();}}private void putMessage() {//获取来自控制台的输入流BufferedReader readernew BufferedReader(new InputStreamReader(System.in));while(true) {try {//读取输入流内容String str reader.readLine();if(str!null) {//像输出流中输出writer.println(str);}else {//输入流断开-输入结束break;}} catch (IOException e) {e.printStackTrace();}}}}
三、UDP程序设计基础
用户数据报协议UDP)是网络信息传输的另一种形式。基于UDP的通信和基于TCP的通信不同基于UDP的信息传递更快但不提供可靠的保证。使用UDP传递数据时用户无法知道数据能否正确地到达主机也不能确定到达目的地的顺序是否和发送的顺序相同。虽然VDP是一种不可靠的协议但如果需要较快地传输信息并能容忍小的含案可以考虑使用UDP。
基于UDP通信的基本模式如下 将数据打包称为数据包然后将数据包发往目的地。 按收别人发来的数据包然后查看数据包
发送数据包步骤如下 (1) 使用 DatagramSocket()创建一个数据包套接字。 (2) 使用 DatagramPacket(byte[] buf, int length,EnecAuldress ddres, int port)创建要发送的数据包。 (3) 使用 DatagramPacket类的 send()方法发送数据包。
接收数据包步骤如下 (1)使用 Datagram Socket(int port)创建数据包套按字绑定到指定的端口。 (2)使用 Dacagramlacket(byter] buf,int length)创建字节数组来接收数据包。 (3)使用 DatagramPacket类的 receive()方法 接收UDP包。
1.DatagramPacket类
java.net包的 DatagramPacket类用来表示数据包。DatagramPacket类的构造函数有DatagramPacket(byte[] buf , int length) DatagramPacket(byte[] buf, int length,InetAddress address,int port) 第一种构造函数在创建DatagromPadket对象时指定了数据包的关第二种构造函数不仅指定了数据包的内存空间和大小还指定了数据包的目标地址和端口。在发送数据时必须指定接收方的 Socket的InetAddress地址和端口号因此使用第二种构造函数可创建发送数据的DatagramPacket对象。
2.DatagramSocket类
java.net包中的DatagramSocket类用于表示发送和接收数据包的套接字。该类构造函数有DatagramSocket() DatagramSocket( int port) DatagramSocket (int port,InetAddress addr) 第一种构造函数创建DatagramSocket对象构造数据报套接字并将其绑定在本地主机任何可用的端口上。第二种构造函数创建DatagramSocket对象创建数据报套接字并将其绑定在本地主机的指定端口上。第三种构造函数创建DatagramSocket对象创建数据报套接字并将其绑定到指定的本地地址上。第三种构造函数适用于有多块网卡和多个IP地址的情况。 在接收程序时必须指定一个端口等不允许系统随机产生此时可以使用第二种构造函数。比如有个朋友要你给他写信那他的地址就必须确定。在发送程序时通常使用第一种构造函数不指定端口号而是系统为我们分配一个端口号就像寄信不需要到指定的邮局一样。
3.UDP网络程序
根据前面所讲的网络编程的基本知识以及UDP网络编程的特点下面创建一个广播数据报程序。广播数据报是一项较新的技术其原理类似于电台广播。广播电台需要在指定的波段和频率上广播信息收听者也要将收音机调到指定的波和频半上广播信息收听者也要将收视调到指定的波段、率才可以收叫广播内容。
例.主机不断地重复播出节目预报到加入到同一组内的主机随时可接收到广播信息。接收者将正在接收的信息放在一个文本城中并将接收的信息放在另一个文本城中
(1)广播主机程序不断向外播出信息
public class Test {public static void main(String[] args) {//启动UDP发送端new MyUDP_Send().startUDPSend();}
}class MyUDP_Send{private String sendMessage发送的信息;private int port9898; //发送端口号发送方可无固定端口号private InetAddress groupnull; //广播组InetAddress广播地址应默认为224.255.10.0private MulticastSocket multicastSocketnull; //广播套接字用于UDP广播群发的发送与接收//如果不使用MulticstSocket而使用DatagramSocket,除不能加入广播组以外无不同void startUDPSend() {try {//广播组地址、广播地址groupInetAddress.getByName(224.255.10.0);//或使用 new MulticastSocket(); 即不使用指定端口号由系统随机分配。//或使用 new DatagramSocket(); 即不进行广播及加入广播组multicastSocketnew MulticastSocket(port);//设置广播组套接字发出的数据报包的存活时间(毫秒)multicastSocket.setTimeToLive(1);//加入广播组//将MulticastSocket加入同一个IntentAddress组成的group任何MulticastSocket向这个group发送消息其他group成员都可以收到消息multicastSocket.joinGroup(group);sendDatagramPacket();} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}private void sendDatagramPacket() {Thread threadnew Thread() {public void run() {while(true) {DatagramPacket packetnull;//创建数据的字节数组byte data[]sendMessage.getBytes();//创建数据报包-参数为用于发送的字节数组数组长度;目标地址(或广播地址);目标端口号//DatagramPacket当目标地址为广播组InetAddress时广播组中所有的MulticastSocket(目标端口)都会收到信息包packetnew DatagramPacket(data,data.length,inetAddress,port);try {//发送数据报包multicastSocket.send(packet);} catch (IOException e) {e.printStackTrace();}try {//每2秒重发一次Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}}};thread.start();}
}
MulticastSocket广播套接字用于UDP广播群发如果不使用MulticstSocket而使用DatagramSocket,除不能加入广播组以外无不同。
将MulticastSocket加入同一个IntentAddress组成的group任何MulticastSocket向这个group发送消息其他group成员都可以收到消息。
创建数据报包的参数为用于发送的字节数组数组长度;目标地址(或广播地址);目标端口号。
DatagramPacket当目标地址为广播组InetAddress时广播组中所有的MulticastSocket(目标端口)都会收到信息包。
(2)接收主机发出的数据包
public class Test {public static void main(String[] args) {//启动UDP接收端new MyUDP_Receive().startUDPReceive();}
}class MyUDP_Receive{private MulticastSocket multicastSocket; //广播套接字用于UDP广播群发的发送与接收//如果不使用MulticstSocket而使用DatagramSocket,除不能加入广播组以外无不同private InetAddress group; //广播组InetAddress广播地址应默认为224.255.10.0private int port9898;//接收端口号接收方必须有固定端口号void startUDPReceive() {try {//广播组地址、广播地址groupInetAddress.getByName(224.255.10.0);//创建接收用广播套接字-接收方必须有端口号multicastSocketnew MulticastSocket(port);//加入广播组multicastSocket.joinGroup(group);receiveDatagramPacket();} catch (IOException e) {e.printStackTrace();}}private void receiveDatagramPacket() {while(true) {//存储用字节数组byte buff[]new byte[1024];//创建接受用数据包-参数为用于接收的字节数组字节数组长度DatagramPacket packetnew DatagramPacket(buff,buff.length);//广播套接字接收数据包try {multicastSocket.receive(packet);} catch (IOException e) {e.printStackTrace();}//解析获取到的数据byte data[]packet.getData();System.out.println(接收new String(data));}}
}
接收用广播套接字-接收方必须有端口号。
创建接受用数据包的参数为用于接收的字节数组字节数组长度。
packet.getData();获取数据包的信息返回值为字节数组。