网络基础概念
什么是计算机网络
把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而使众多的计算机可以方便的互相穿传递信息,共享硬件、软件、数据信息等资源。
计算机的主要功能
- 资源共享
- 资源传输与集中处理
- 均衡符合与分布处理
- 综合信息服务(www/综合业务数字网络 ISDN)
网络通信协议及接口
什么是网络通信协议
计算机网络中实现通信必须有一些约定即通信协议,对速率、传输代码、代码结构、传输控制步骤、出错控制等制定标准
网络通信接口
为了使两个结点之间能进行对话,必须在他们之间建立通信工具(即接口),使彼此之间能进行信息交换。
接口包括两部分:
1. 硬件装置:实现结点之间的信息传送
2. 软件装置:规定双方进行通信的约定协议
协议分层的思想
为什么要分层
由于结点之间的联系复杂,在制定协议时,吧复杂分解成一些简单的成分,在复合起来。最常用的复合方式是层次方式,即同层之间可以通信、上一层可以调用下一层,而与在下一层不发生关系,各层互不影响,利于系统的开发和扩展
通信协议的分层规定
把用户应用程序作为最高层,把物理通信线路作为最低层,将其间的协议处理分为若干层,规定每层处理的任务,也规定每层的接口标准,如下图
参考模型
数据在网络之间的传输过程中分为数据封装和数据拆封
数据封装:
数据拆封:
接收到了数据以后
IP协议
IP(Internet Protocol)协议时网际层的主要协议,支持网间的互连的数据报通信。
主要功能有
1. 无连接数据报传送
2. 数据报路由选择和差错控制
TCP协议和UDP协议
TCP(transmission control protocol)
是专门设计用于在不可靠的因特网上提供可靠的、端到端的字节通信的协议,它是一种面向连接的协议。TCP是字节流而非报文流
UDP(user data protocol)
UDP向应用程序提供了一种发送封装的原始IP数据报的方法、并且发送时无需连接,是一种不可靠的连接
TCP-Socket编程
Socket
两个Java程序可通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称为一个socket
Socket通常来实现client-server连接
Java.net包中定义了两个类Socket和ServerSocket,分别用来实现双向连接的client和server端
建立连接时所需的寻址信息为远程计算机的IP地址和端口号(Port number)
*自己程序编写用的端口号用1024以后的,1024以前的为系统用的端口
端口号又分为TCP端口和UDP端口,每个都是65536个端口*
Socket通信模型
看一个Socket封装的例子
//服务器端
import java.net.*;
import java.io.*;
public class TCPServer {
public static void main(String[] args) throws Exception {
//阻塞式的,等待客户端连接
//指定监听6666端口
ServerSocket ss = new ServerSocket(6666);
//连接多个客户端连接
while(true) {
//接受客户端,将客户端的连接封装为一个Socket对象
Socket s = ss.accept();
System.out.println("a client connect!");
DataInputStream dis = new DataInputStream(s.getInputStream());
System.out.println(dis.readUTF());
//System.out.println("客户端IP"+s.getInetAddress()+"客户端Port:"+s.getPort());
dis.close();
s.close();
}
}
}
//客户端
import java.net.*;
import java.io.*;
public class TCPClient {
public static void main(String[] args) throws Exception {
//连接到6666端口,客户端的端口是系统随机选择的一个端口
Socket s = new Socket("127.0.0.1", 6666);
//获得s的输入流
OutputStream os = s.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
Thread.sleep(30000);
dos.writeUTF("hello server!");
dos.flush();
dos.close();
s.close();
}
}
注意先启动服务器端,再启动客户端,并且同一个服务器端在一个时间点内只能启动一个(端口被占用)
UDP
不可靠的,效率高,数据报/非连接(音频,视频)
举个UDP例子:
//服务器端
import java.net.*;
import java.io.*;
public class TestUDPServer
{
public static void main(String args[]) throws Exception
{
//用于接受对方发过来的数据
byte buf[] = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
//监听UDP的5678端口
DatagramSocket ds = new DatagramSocket(5678);
while(true)
{
//将接收到的包存在dp里面
ds.receive(dp);
ByteArrayInputStream bais = new ByteArrayInputStream(buf);
DataInputStream dis = new DataInputStream(bais);
System.out.println(dis.readLong());
}
}
}
//客户端
import java.net.*;
import java.io.*;
public class TestUDPClient
{
public static void main(String args[]) throws Exception
{
long n = 10000L;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
dos.writeLong(n);
byte[] buf = baos.toByteArray();
System.out.println(buf.length);
DatagramPacket dp = new DatagramPacket(buf, buf.length,new InetSocketAddress("127.0.0.1", 5678));
//客户端本身占据了9999端口,向5678端口发送数据
DatagramSocket ds = new DatagramSocket(9999);
ds.send(dp);
ds.close();
}
}
URL(Uniform Resource Locator)
统一资源定位符,表示Internet上某一资源的地址,通过它我们可以访问Internet上的各种网络资源,浏览器通过给定的URL可以在网络上查找相应的文件或其他资源
URL的基本结构由5部分构成:<传输协议>://<主机名>:<端口号>/<文件名>,例如: h ttp://192.168.1.100:8080/helloworld/index.jsp
URL的实现
java.net中实现了URL类,可通过构造器初始化URL对象,例如
URL url = new URL ("http://www.baidu.com/")
URL方法: openStream():能从网络上读取数据
若希望输出数据,例如向服务器端的 CGI (公共网关接口-Common Gateway Interface-的简称,是用户浏览器和服务器端的应用程序进行连接的接口)程序发送一些数据,则必须先与URL建立连接,
然后才能对其进行读写,此时需要使用 URLConnection 。
URLConnection:表示到URL所引用的远程对象的连接。当与一个URL建立连接时,首先要在一个 URL 对象上通过方法 openConnection() 生成对应的
URLConnection 对象。如果连接过程失败,将产生IOException.
URL netchinaren = new URL (“http://www.baidu.com/index.shtml“);
URLConnectonn u = netchinaren.openConnection( );
综合示例代码如下:
//URL:统一资源定位符,一个URL的对象,对应着互联网上一个资源。
//我们可以通过URL的对象调用其相应的方法,将此资源读取(“下载”)
public class TestURL {
public static void main(String[] args) throws Exception {
//1.创建一个URL的对象
URL url = new URL("http://127.0.0.1:8080/examples/HelloWorld.txt?a=b");//File file = new File("文件的路径");
/*
* public String getProtocol( ) 获取该URL的协议名
public String getHost( ) 获取该URL的主机名
public String getPort( ) 获取该URL的端口号
public String getPath( ) 获取该URL的文件路径
public String getFile( ) 获取该URL的文件名
public String getRef( ) 获取该URL在文件中的相对位置
public String getQuery( ) 获取该URL的查询名
*/
// System.out.println(url.getProtocol());
// System.out.println(url.getHost());
// System.out.println(url.getPort());
// System.out.println(url.getFile());
// System.out.println(url.getRef());
// System.out.println(url.getQuery());
//如何将服务端的资源读取进来:openStream()
InputStream is = url.openStream();
byte[] b = new byte[20];
int len;
while((len = is.read(b)) != -1){
String str = new String(b,0,len);
System.out.print(str);
}
is.close();
//如果既有数据的输入,又有数据的输出,则考虑使用URLConnection
URLConnection urlConn = url.openConnection();
InputStream is1 = urlConn.getInputStream();
FileOutputStream fos = new FileOutputStream(new File("abc.txt"));
byte[] b1 = new byte[20];
int len1;
while((len1 = is1.read(b1)) != -1){
fos.write(b1, 0, len1);
}
fos.close();
is1.close();
}
}