16 网络编程
学了这个我想你应该就能理解java的兼容性了,java不需要了解通信的规则,原理就能在其功能面操作,通过封装方法,得到数据传输的能力,只需要了解通信所需要的的然后给他信息就能进行通信连接。
计算机网络的概念
网络即将不同区域的电脑连接到一起, 组成局域网、城域网或广域网。把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而使众多的计算机可以方便地互相传递信息,共享硬件、软件、数据信息等资源。
主要功能实现:
资源共享
信息传输与集中处理
均衡负荷与分布处理
网络通信的协议
计算机网络中实现通信必须有一些约定即通信协议,对速率、传输代码、代码结构、传输控制步骤、出错控制
等制定标准。显然,每一行数据都有“姓名”、“基本工资”等“列”,也都有标准的“晨会动作”。网络通信协议由
三个要素组成 : 语义 、 语法 、 时序
语义表示要做什么,语法表示要怎么做,时序表示做的顺序。
关于网络通信的也不多介绍了。。。。。。。。。。。。
封装与拆封的概念
IP地址与端口 URL(统一资源定位系统)
( IP) 是 Internet Protocol 的外语缩写, 网络之间互连的协议也就是为计算机网络相互连接进行通信而设计的协议。 在因特网中,它是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家生产的计算机系统,只要遵守 IP 协议就可以与因特网互连互通。
端口:区分数据流向的软件 0-65535 不要使用 1024 以下的端口 ,每一个协议拥有自己的端口,在同一个协议下端口不能重复 FTP:21 HTTP:80
URL指的是统一资源定位符(Uniform Resource Locator)。包括IP与端口。
IP :相当于公司
端口:相当于公司各部 门
URL:相当于各部门的人员
URL详解:
URL无非就是一个给定的独特资源在Web上的地址。理论上说,每个有效的URL都指向一个独特的资源。这个资源可以是一个HTML页面,一个CSS文档,一幅图像,等等。而在实际中,有一些例外,最常见的情况就是URL指向了不存在的或是被移动过的资源。由于通过URL呈现的资源和URL本身由Web服务器处理,因此web服务器的拥有者需要认真地维护资源以及与它关联的URL。
我浅显的把它理解为——网址(个人理解)
示例:http://www.example.com:80/path/to/myfile.html?key1=value1&key2=value2#SomewhereInTheDocument
下面来分析一下它的几个部分:
1、http:// ——HTTP协议(超文本转移协议),当然也可以是其他协议。
2、www.baidu.com ——域名,表明在访问哪个服务器,当然也可以用IP地址代替。
3、:80 —— 端口,用于访问Web服务器上的资源的技术“门”。
4、/path/to/myfile.html —— 网络服务器上资源的路径。
5、?key1=value1&key2=value2 —— 提供给网络服务器的额外参数。这些参数用&分隔开。
6、#SomewhereInTheDocument —— 资源本身的另一部分的锚点,锚点像一个迅速定位器一样,可以在网页中设置标记,然后创建链接,创建的链接可以使我们迅速访问到指定位置(想到了书签~~)
由于网络传输中存在两种协议,所以java中就有相应的封装方法。
TCP协议与UDP协议
先运行服务器,在运行客户端。
TCP:TCP(transfer control protocol) 打电话 面向连接、安全、可靠,效率低
UDP:UDP(UserDatagramProtocol ) 发送短信 非面向连接、不安全、数据可能丢失 、效率高
UDP传输过程的模拟
需要了解两个类:
DatagramSocket:发送或接受数据报的数据报包。常用方法: send , receive , close
DatagramPacket:数据容器封包的作用。
常用方法:
- 构造函数、getAddrress(获取发送或接收方计算机的Ip地址)、
- getData(获取发送或接收的数据),
- setData(设置发送的数据)
UPD发送方(客服端)
①创建客户端 DatagramSocket类 +指定端口 (定义客户端的监听端口)
②准备数据 字节数组
③封装成数据包 需要指定包发送的地址+端口 即服务器地与端口 (打包要发送的数据)
④发送数据
⑤释放资源
public class Server {
public static void main(String[] args) throws Exception {
// 创建数据报包 工具
DatagramSocket ds = new DatagramSocket(8999);
// 准备接收数据的容器空间
byte[] b = new byte[1024];
// 数据报
DatagramPacket dp = new DatagramPacket(b,b.length);
ds.receive(dp);
//阻塞式方法
String string = new String(dp.getData(),0,dp.getLength());
//dp.getLength()返回实际收到的数据的字节数
System.out.println(string); ds.close();
}
}
UPD接收方(服务器)
①创建服务器 DatagramSocket类 +指定端口 (定义服务器端的监听端口)
②准备接收容器 字节数组 +封装成DatagramPacket数据报 (准备容器接收数据)
③接收数据
④分析数据
⑤释放资源
public class Client { public static void main(String[] args) throws Exception {
// 创建要发送数据报包的工具,我本身占用9000 端口向外面机器发数据包
DatagramSocket ds = new DatagramSocket(9000);
byte[] b = "aaaa".getBytes();
//必须告诉数据包要发到哪里去, 封装数据时才 指定 目标电脑以及端口
DatagramPacket dp = new DatagramPacket(b,b.length,new InetSocketAddress("localhost",8999));
ds.send(dp);
ds.close();
}
}
TCP(transfer control protocol)数据传输过程的模拟
基于 tcp 协议,建立稳定连接的点对点的通信;实时、快速、安全性高、占用系统资源多、效率低;“请求-响应”模式:
a)、客户端:在网络通讯中,第一次主动发起通讯的程序被称作客户端(Client)程序b)、服务器:第一次通讯中等待连接的程序被称作服务器端(Server)程序
• Socket:发送 TCP 消息
• ServerSocket:创建服务器 套接字是一种进程间的数据交换机制。这些进程既可以在同一机器上,也可以在通过网络连接的不同机器上。换句话说,套接字起到通信端点的作用。单个套接字是一个端点,而一对套接字则构成一个双向通信信道,使非关联进程可以在本地或通过网络进行数据交换。一旦建立套接字连接,数据即可在相同或不同的系统中双向或单向发送,直到其中一个端点关闭连接。
套接字与主机地址和端口地址相关联。主机地址就是客户端或服务器程序所在的主机的ip地址。端口地址是指客户端或服务器程序使用的主机的通信端口。实际上,套接字只是计算机上已编号的端口。如果发送方和接收方计算机确定好端口,他们就可以通信了。
相关类
InetAddress:封装计算机的ip地址和DNS(没有端口信息!)静态类没有构造方法。
常用方法:getLocalHost , getByName , getAllByName , getAddress , getHostNameg
ServerSocket:实现服务器套接字。服务器套接字等待网络进入请求。他根据请求的一些操作然后可能将结果返回给请求者。看API吧。中文API可以私我。
Socket:实现客服端的套接字,两台计算机通讯的端点。
TCP发送方(客户端)
①连接服务器: 创建客户端 +指定服务器地址 +端口创建客户机Socket,并设置服务器的ip及端口,客户机发出连接请求,建立连接。
②发送数据通过Socket发送数据,和接收数据
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket; import java.net.Socket;
/*** 最简单的服务器端代码 **/
public class BasicSocketServer {
public static void main(String[] args) {
try {
//建立服务器端套接字
ServerSocket serverSocket = new ServerSocket(8888);
//tcp端口一共多少个??
//监听,等待客户端请求,并愿意接收连接。
System.out.println("服务端建立监 听");
Socket socket = serverSocket.accept();
//通过流向客户端发送数据
// ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
// oos.writeObject("aaaaa");
// oos.close();
BufferedWriter bw = new BufferedWriter(newOutputStreamWriter(socket.getOutputStream()));
bw.write("hhhh"); bw.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
TCP接受方(服务器)
①创建服务器 指定端口创建服务器ServerSocket,在创建时,定义ServerSocket的监听端口(在这个端口接收客户端发来的消息!)
②等待客户端 连接ServerSocket调用accept()方法,使之处于阻塞状态
③分析接收数 据利用Socket进行接收和发送数据
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/*** 最简单的Socket客户端 **/
public class BasicSocketClient {
public static void main(String[] args) {
try {
//指定的是所要连接的服务器的ip和端口。而 不是自己机器的端口。发送端口是随机的。
Socket socket = new Socket(InetAddress.getLocalHost(),8888);
// ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
// String string = (String) ois.readObject();
// System.out.println(string);
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(br.readLine());
br.close(); socket.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}