摘要
先记录网络的基本知识,在这个基础上再记录网络编程中的三要素,再根据传输层的协议TCP和UDP讲解对应java的实现方式,最后讲解URLConnection的使用。
1.网络基本知识
计算机网络主要有2中模型OSI七层参考模型和现在真正在使用的TCP/IP四层模型。下面主要讲解TCP/IP4层参考模型。
七层:
应用层
表示层
会话层
传输层
网络层
链路层
物理层
四层参考模型:
应用 |
传输层 |
网络层 |
网络接口层 |
第一层:网络接口层
包括用于协作IP数据在已有网络介质上传输的协议。实际上TCP/IP标准并不定义与ISO数据链路层和物理层相对应的功能。相反,它定义像地址解析协议(Address Resolution Protocol,ARP)这样的协议,提供TCP/IP协议的数据结构和实际物理硬件之间的接口。
第二层:网络层(Internet Layer)。网络层解决的是计算机到计算机间的通信问题,它包括三个方面的功能:
·处理来自传输层的分组发送请求,收到请求后将分组装入IP数据报,填充报头,选择路径,然后将数据报发往适当的网络接口。
·处理数据报。
·处理网络控制报文协议、即处理路径、流量控制、阻塞等。
对应于OSI七层参考模型的网络层。本层包含IP协议、RIP协议(Routing Information Protocol,路由信息协议),负责数据的包装、寻址和路由。同时还包含网间控制报文协议(Internet Control Message Protocol,ICMP)用来提供网络诊断信息。
第三层:传输层
传输层解决的是计算机程序到计算机程序之间的通信问题。对应于OSI七层参考模型的传输层,它提供两种端到端的通信服务。其中TCP协议(Transmission Control Protocol)提供可靠的数据流运输服务,UDP协议(Use Datagram Protocol)提供不可靠的用户数据报服务。
第四层:应用层
对应于OSI七层参考模型的应用层和表达层。因特网的应用层协议包括Finger、Whois、FTP(文件传输协议)、Gopher、HTTP(超文本传输协议)、Telent(远程终端协议)、SMTP(简单邮件传送协议)、IRC(因特网中继会话)、NNTP(网络新闻传输协议)等。
2.网络编程中的三要素
i.ip
唯一标识网络上的主机,制定了它我们才能找到需要通讯的主机
ii.端口
当我们将数据发送至目标主机后,主机如何将数据发送给对应的运用程序呢?在网络通讯中计算机有虚拟的端口,运用程序使用对应的一些端口通过监听端口获取数据,这样主机获取了信息之后根据端口号将数据发送给对应的程序。
iii.协议
定义了通讯主机之间的通讯共同遵循的规则
简单的话说ip找到哪台主机,端口找到那个运用程序,协议是信息传递过程中共同遵循的规则,从而使传递正确无误。
协议中比较重要的有TCP和UDP他们都是传输层协议
TCP:面向连接的协议,通过三次握手建立连接,连接之后可以传送大量数据,由于需要建立连接效率较低,但可以提供可靠的数据传输
UPD:数据包协议,无连接,传输数据时将数据划分成数据包将数据包发送,每个数据包大小必须小于64k,由于是无连接协议效率比较高,但是它是不可靠的协议,它只管往外传输数据而不管目标主机是否接收到了或在接受了正确的数据。
如何选取上面的协议:
需要可靠地传输TCP,无需可靠且有大量数据要传输等即时功能例如视频使用UDP。
3.使用DatagramSocket实现UDP编程
实现步骤:
发送端:
建立socket
建立数据包
通过socket将数据发送
关闭socket
接收端:
建立socket监听指定端口
接受数据包
解析数据
关闭socket
简单实例代码如下:
接收端
public class UDPReveive {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
DatagramSocket ds = new DatagramSocket(10000);
DatagramPacket dp = new DatagramPacket(new byte[1024], 1024);
while(true){
ds.receive(dp);
String str = new String(dp.getData(),0,dp.getLength());
System.out.println(str+" port:"+dp.getPort());
if(str.equals("exit")){
break;
}
}
ds.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
发送端:
public class UDPSend {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
DatagramSocket ds = new DatagramSocket(8888);
byte[] buf = "exit".getBytes();
//DatagramPacket dp = new DatagramPacket(buf, buf.length, new InetSocketAddress(InetAddress.getByName("127.0.0.1"),10000));
DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("localhost"), 10000);
ds.send(dp);
ds.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
4.使用ServerSocket和Socket来实现TCP编程
public class UDPSend {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
DatagramSocket ds = new DatagramSocket(8888);
byte[] buf = "exit".getBytes();
//DatagramPacket dp = new DatagramPacket(buf, buf.length, new InetSocketAddress(InetAddress.getByName("127.0.0.1"),10000));
DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("localhost"), 10000);
ds.send(dp);
ds.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
实现步骤:
服务器端:
建立serversocket监听指定端口
通过accept获和客户端通讯的socket
通过socket的输出输入流和客户端进行通讯
管理socket和serversocket
客户端:
建立通讯socket
通过socket获取输入和输出流和服务器进行交互
管理socket
服务器端代码如下:
public class TCPServer {
public static void main(String[] args)throws Exception{
ServerSocket ss = new ServerSocket(8888);
Socket so = ss.accept();
InputStream is = so.getInputStream();
byte[] buf = new byte[1024];
int len = 0;
len = is.read(buf);
System.out.println(new String(buf,0,len));
OutputStream os = so.getOutputStream();
os.write("哥们你也好啊".getBytes());
so.close();
ss.close();
}
客户端代码如下:
public class TCPCustomer {
public static void main(String args[])throws Exception{
Socket socket= new Socket("127.0.0.1", 8888);
OutputStream os = socket.getOutputStream();
os.write("哥们你好".getBytes());
InputStream is = socket.getInputStream();
byte[] buf = new byte[1024];
int len = 0;
len = is.read(buf);
System.out.println(new String(buf,0,len));
socket.close();
}
}
5.通过URLConnection实现其他协议的通讯
实现步骤,创建一个URLConnection对象
通过该对象获取对应的输入和输出流
发送数据
由于此处和TCP的协议编码较为相同这里就不堆砌代码了。
总结
java网络编程是java的重点知识,理解了网络编程才能对java ee的运用才有底层的认识,才能真正的学会java ee的运用及其开发。