`

java编程-网络编程

阅读更多
网络:
把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模宏大、功能强大的网络系统,从而使众多的计算机可以方便地互相传递信息,共享硬件、软件、数据信息等资源。

计算机的联网可以实现:
使用远程资源
共享信息、程序和数据
分布处理

按照网络规模和范围可以简单划分为:
局域网(LAN,Local Area Network)
都市网(MAN,Metropolis Area Network)
广域网(WAN,Wide Area Network)
按照网络拓扑结构可以分为:
星型网络、总线网络、环线网络、树型网络、星型环线网络等
按照传输介质划分:
双绞线、同轴电缆、光导纤维、视线介质等

专用服务器结构(Server-Based)
又称为“工作站/文件服务器”结构,由若干台微机工作站与一台或多台文件服务器通过通信线路连接起来组成工作站存取服务器文件,共享存储设备。
客户机/服务器模式(client/server)
其中一台或几台较大的计算机集中进行共享数据库的管理和存取,称为服务器,而将其它的应用处理工作分散到网络中其它微机上去做,构成分布式的处理系统。  
对等式网络:(Peer-to-Peer)
在对等式网络结构中,没有专用服务器 每一个工作站既可以起客户机作用也可以起服务器作用。

Internet的形成和发展:
第一阶段(1969~1983):1969年,美国ARPANET诞生,用于将几个军事及研究用的主机联系起来。1983年,TCP/IP应用到ARPANET中,使得internet得以迅速发展。以ARPANET 为中心,组成新的互联网(internet),称为Internet。
第二阶段(1983~1994):用于教育和科研领域的NSFNET(National Science Foundation Net)形成
第三阶段(1994~Now):Internet的商业化运作。

网络通信协议
  计算机网络中实现通信必须有一些约定即通信协议,对速率、传输代码、代码结构、传输控制步骤、出错控制等制定标准。 
网络通信结构
   为了使两个结点之间能进行对话,必须在它们之间建立通信工具(即接口),使彼此之间 能进行信息交换。接口包括两部分:
硬件装置:实现结点之间的信息传送
软件装置:规定双方进行通信的约定协议

OSI:开放系统互连(Open System Interconnection),采用分层的结构化技术。
分层的理由:
将网络简化
模块化的设计网络
OSI参考模型(OSI/RM,Open System Interconnection/Reference Model)共分为7层,最高层为用户层,最底层为物理层。
TCP协议为一种可靠的端对端协议:重发一切没有收到的数据,进行数据内容准确性检查并保证分组的正确顺序。

TCP协议位于OSI参考模型的传输层
IP协议是网络上的计算机进行连接的基础
IP协议是不可靠的:无论传送正确与否都不进行检验、不回送确认、不保证分组的正确顺序
IP协议位于OSI参考模型的网络层
TCP/IP:是Internet上不同系统之间互联的一组协议。它为分散和不同类型的硬件提供了一个通用的编程接口。TCP/IP 协议使Internet尽可能成为一个分散、无序的网络。
TCP/IP通常被看成一个4层模型:应用层、传输层、网络层以及数据链路层+物理层。



数据的封装和拆封:
位于TCP/IP各个层的数据通常用一个公共的机制来封装:定义描述元信息和数据报的部分真实信息的报头的协议,这些元信息可以是数据源、目的地和其他的附加属性。来自于高层的协议封装在较低层的数据报中,当信息在不同的层之间传递时,都会在每一层重新构建一次。

IP地址的分配:
IP地址的定义
为了实现Internet上不同计算机之间的通信,每台计算机都必须有一个不与其它计算机重复的地址---IP地址
IP地址是数字型的,32位(32bit),由4个 8位的二进制数组成,每8位之间用圆点隔开
网络标识(network id)和主机标识 (host id)
IP地址被分成了A、B、C、D、E五类,每个类别的网络标识和主机标识各有规则。

网络IP地址的构成:



常见 TCP 端口和对应服务
端口 对应服务
7 Echo服务器
21 Ftp
23 telnet
25 SMTP
53 DNS
79 Finger
80 HTTP
110 POP3
端口:
计算机与外界交流的出入口
是一种抽象的软件结构,包括一些数据结构和I/O(基本输入/输出)缓冲区
端口号可以从0到65535,通常将它分为三类:
公认端口(Well Known Ports):从0到1023,它们紧密绑定(Binding)一些服务
注册端口(Registered Ports):从1024到49151。它们松散地绑定一些服务
动态和/或私有端口(Dynamic and/or Private Ports):从49152到65535。理论上,不应为服务分配这些端口

在命令行中,可以通过“ping [host]”的方法得到指定主机的IP地址
通过java.net中的InetAddress类,可以得到指定主机的IP地址
如果没有指定机器,则将会返回本地主机的IP地址
InetAddress ia = InetAddress.getLocalHost();
InetAddress ia = InetAddress.getByName(“YourComputerName”);


实例:
http服务器实例:
ServerSocket server =new ServerSocket(123);
//等待客户端连接
Socket socket=server.accept();
System.out.println("----------------------------");
//如果客户端在请求当前服务器的时候发送的有其他信息
//那么我们就可以通过当前的socket获取到客户端的请求信息
InputStream is= socket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String str=null;
//不断循环接受客户端发过来的请求信息
// while(!"".equals(str=br.readLine())){
// System.out.println(str);
// }
//接受到客户端的第一句请求信息
str=br.readLine();
System.out.println("客户端的第一句请求信息是:"+str);
//将第一句请求信息以“ ”分成三部分
String[] ss=str.split(" ");
//取到截取后的第二部分
String s=ss[1];
System.out.println("请求信息第一句的第二部分是:"+s);
String sss=s.substring(1);

//sss就是客户端请求的文件
FileInputStream fis=new FileInputStream("D:/p/"+sss);
OutputStream os=socket.getOutputStream();
byte[] b=new byte[1024];
int len;
while((len=fis.read(b))!=-1){
os.write(b, 0, len);
os.flush();
}

fis.close();
socket.close();
模拟浏览器:
//创建一个请求去请求百度:模拟浏览器
Socket socket=new Socket("www.baidu.com",80);
//当我们的浏览器和百度建立连接之后,要自动给百度发送请求信息
PrintWriter pw=new PrintWriter(socket.getOutputStream());
//GET / HTTP/1.1
//Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
//Accept-Language: zh-cn
//Accept-Encoding: gzip, deflate
//User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
//Host: 172.16.36.30
//Connection: Keep-Alive
//

pw.println("GET / HTTP/1.1");
pw.println("Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*");
pw.println("Accept-Language: zh-cn");
pw.println("Accept-Encoding: gzip, deflate");
pw.println("User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)");
pw.println("Host: www.baidu.com");
pw.println("Connection: Keep-Alive");
pw.println("");
pw.flush();
//当请求信息发送完成之后,等待百度发回来的响应信息,并且获取到响应信息
// BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
// String s=null;
// while((s=br.readLine())!=null){
// System.out.println(s);
// }
//获取到百度的信息以字节流形式写入文件
InputStream is=socket.getInputStream();
FileOutputStream fos=new FileOutputStream("D:/baidu.html");
byte[] b=new byte[1024];
int len=-1;
while((len=is.read(b))!=-1){
fos.write(b,0,len);
fos.flush();
}
UDP协议
DatagramPacket/DatagramSocket类:
实例:
public static void main(String[] args) {
//创建一个DatagramSocket对象用于接收数据报
try {
DatagramSocket socket=new DatagramSocket(12);

//创建一个空的数据报来接收数据
byte[] b=new byte[1024];
DatagramPacket packet=new DatagramPacket(b, b.length);

socket.receive(packet);

System.out.write(b);

//当我们在接收数据报时候,我们通常使用不带主机和port的DatagramPacket以及带有port的DatagramSocket
} catch (Exception e) {
e.printStackTrace();
}

}
public static void main(String[] args) {
try {
//DatagramPacket:负责构造数据报
//DatagramSocket:负责将构造好的数据报发送
//如何构造一个数据报?--->如何创建一个DatagramPacket对象
String msg="你好---java";
byte[] b=msg.getBytes();
DatagramPacket packet1=new DatagramPacket(b, b.length);

InetAddress  addr = InetAddress.getByName("172.16.36.72");
DatagramPacket packet2=new DatagramPacket(b,b.length,addr,12);

//如何将数据报发出去?--->  如果创建一个DatagramSocket对象
DatagramSocket socket1=new DatagramSocket();
DatagramSocket socket2=new DatagramSocket(123,addr);

//如果数据报中不包含目标主机和端口号,我们就需要通过带有目标主机和端口号的DatagramSocket对象发送
//如果数据报中包含目标主机和端口号,我们就采用不带有目标主机很port的DatagramSocket对象发送
socket1.send(packet2);
//当我们需要发送数据报时候,我们通常使用带主机和port的DatagramPacket,以及不带主机和端口号的DatagramSocket

} catch (Exception e) {
e.printStackTrace();
}
}
飞秋应用:
import java.io.IOException;
import java.net.*;
/**
* 飞秋发送。。。
* @author Administrator
*
*/
public class SendFQ {
public static void main(String[] args) {
try {
//构造数据报
byte[] b="1:100:用户名:主机名:32:随机的。。。。".getBytes();
InetAddress  addr = InetAddress.getByName("172.16.36.72");
DatagramPacket packet=new DatagramPacket(b, b.length, addr, 2425);
DatagramSocket socket=new DatagramSocket();
//将数据报发出去
socket.send(packet);
} catch (Exception e) {
e.printStackTrace();
}
}

}
交换机:
MulticastSocket类:
实例:
public class Send {
public static void main(String[] args) {
try {
InetAddress addr=InetAddress.getByName("228.5.6.7");
MulticastSocket ms=new MulticastSocket();
ms.joinGroup(addr);//交换机

String msg="多播信息";
byte[] b=msg.getBytes();
DatagramPacket packet=new DatagramPacket(b, b.length,addr,6789);
ms.send(packet);


} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

}
public class Receive1 {

public static void main(String[] args) {
//因为发送者把数据发送到一个交换机
try {
InetAddress addr=InetAddress.getByName("228.5.6.7");

//创建一个MulticastSocket
MulticastSocket ms1=new MulticastSocket(6789);
ms1.joinGroup(addr);

byte[] b=new byte[100];
DatagramPacket packet=new DatagramPacket(b, b.length);
ms1.receive(packet);
int len=packet.getLength();
System.out.write(b,0,b.length);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class Receive2 {
public static void main(String[] args) {
try {
InetAddress addr=InetAddress.getByName("228.5.6.7");

//创建一个MulticastSocket
MulticastSocket ms2=new MulticastSocket(6789);
ms2.joinGroup(addr);

byte[] b=new byte[100];
DatagramPacket packet=new DatagramPacket(b, b.length);
ms2.receive(packet);
int len=packet.getLength();
System.out.write(b,0,b.length);
} catch (Exception e) {
e.printStackTrace();
}
}

}
原理:


URL类:
下载资源实例:



非阻塞通信:


  • 大小: 15.7 KB
  • 大小: 35.9 KB
  • 大小: 49.2 KB
  • 大小: 36 KB
  • 大小: 58.3 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics