什么是网络?
网络就像是虚拟的运输网,将单独的pc连接进行信息的交互与传输。因此它包含的知识点与规范很多。国际组织将网络分解成多层进行结构划分,功能明确。
网络模型
●OSI(Open System interconnection)开放系统互联
●TCP/IP
OSI七层简介:
①物理层:就是网线、光纤、无线、蓝牙将两个pc连接。(传输形式:0、1比特位)
②数据链路层:将物理层接收到的数据进行MAC地址(网卡成产是带的地址,唯一)的封装或解封装。设备:交换机:传输数据
③网络层:ip地址(192.168.1.1)的封装或解封装。设备:路由器(告诉数据路径通过那个路径②到①)
④传输层:在网络层数据知道去哪了,那么怎么去?传输层制订了一些传输数据的协议和端口号。TCP(传输控制协议):传输效率低,可靠性高。UDP(用户数据报协议):传输可靠性低
⑤ 会话层:通过传输层给的端口号(传输端口与接收端口)建立数据传输通路。开始会话,也就是你的pc发起会话或者接受会话。(就是两个pc通过ip或则MAC或者主机名进行相互认识的过程)
⑥表示层:对接收数据的数据进行解释,加密或解密、压缩或解压缩的过程。把二进制数据转换成人类识别的文字图片的过程
⑦应用层:就是指的浏览器、qq之类的应用软件。
我们以传输图片为例:
OSI七层在实际操作过程中太过于繁琐,所以将一些过程进行整合出现TCP/IP协议(四层)
网络通讯(三要素)
IP地址、端口号、传输协议。
DNS(域名系统):
建立连接必需通过ip地址,但是ip地址又不太好记,因此给每个ip地址一个域名,我们通过访问域名,通过域名解析得到对应的ip地址,进行连接通讯。
Socket(通讯端点【专业术语:套接字】):
任何要进行数据传输的(源pc与目的pc)都要有Socket才能进行数据的传输。
通过上面的传输流程与规则,JAVA封装了一些对象用于完成网络传输。
IP对象:InetAddress
UDP传输:
DatagramSocket类:创建通讯端点,为数据传输提供前提。
DatagramPacket类:将数据打包,抛出数据包进行传输。
聊天室小demo
public class Send implements Runnable { private DatagramSocket ds; public Send(DatagramSocket ds){ this.ds=ds; } @Override public void run() { try{ String line=null; BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); while((line=br.readLine())!=null){ byte[]buf=line.getBytes(); DatagramPacket packet=new DatagramPacket(buf, buf.length,InetAddress.getByName("127.0.0.1"),8800); ds.send(packet); if("886".equals(line)){ break; } } ds.close(); }catch (Exception e) { } } }
public class Rece implements Runnable{
private DatagramSocket ds;
public Rece(DatagramSocket ds){
this.ds=ds;
}
@Override
public void run() {
try{
while(true){
byte[]buf=new byte[1024];
DatagramPacket packet=new DatagramPacket(buf, buf.length);
ds.receive(packet);
String date=new String(packet.getData(),0,packet.getLength());
System.out.println(date);
if(date.equals("886")){
System.out.println(packet.getAddress().getHostAddress()+"....退出聊天室");
}
}
}catch (Exception e) {
}
}
}
public class TackHose { public static void main(String[]args) throws SocketException{ DatagramSocket send = new DatagramSocket(); DatagramSocket rece = new DatagramSocket(8800); Send s=new Send(send); Rece r=new Rece(rece); Thread t1=new Thread(s); Thread t2=new Thread(r); t1.start(); t2.start(); } }
TCP传输
Socket:客户端通讯端点
ServerSocket:服务端通讯端点
案例:
public static void main(String[] args) throws UnknownHostException, IOException { /* * 思路: * 客户端: * 1,需要先有socket端点。 * 2,客户端的数据源:键盘。 * 3,客户端的目的:socket. * 4,接收服务端的数据,源:socket。 * 5,将数据显示在打印出来:目的:控制台. * 6,在这些流中操作的数据,都是文本数据。 * * * 转换客户端: * 1,创建socket客户端对象。 * 2,获取键盘录入。 * 3,将录入的信息发送给socket输出流。 */ //1,创建socket客户端对象。 Socket s = new Socket("192.168.1.100",10004); //2,获取键盘录入。 BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in)); //3,socket输出流。 // new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); PrintWriter out = new PrintWriter(s.getOutputStream(),true); //4,socket输入流,读取服务端返回的大写数据 BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream())); String line = null; while((line=bufr.readLine())!=null){ if("over".equals(line)) break; out.println(line); //读取服务端发回的一行大写数。 String upperStr = bufIn.readLine(); System.out.println(upperStr); } s.close(); } }
public static void main(String[] args) throws IOException { /* * * 转换服务端。 * 分析: * 1,serversocket服务。 * 2,获取socket对象。 * 3,源:socket,读取客户端发过来的需要转换的数据。 * 4,目的:显示在控制台上。 * 5,将数据转成大写发给客户端。 */ //1, ServerSocket ss = new ServerSocket(10004); //2,获取socket对象。 Socket s = ss.accept(); //获取ip. String ip = s.getInetAddress().getHostAddress(); System.out.println(ip+"......connected"); //3,获取socket读取流,并装饰。 BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream())); //4,获取socket的输出流,并装饰。 PrintWriter out = new PrintWriter(s.getOutputStream(),true); String line = null; while((line=bufIn.readLine())!=null){ System.out.println(line); out.println(line.toUpperCase()); } s.close(); ss.close(); } }