二十二 网络编程

二十二章 – 网络编程

一、理解网络的相关概念

1.网络的概念

计算机网络:

多个计算机之间通过专业的设备进行连接,形成一个网络 ,每一台计算机都是一个节点 可以进行信息的传递。

2.网络的分类

局域网 LAN

城域网 MAN

广域网 WAN

互联网

无线网

3.网络通信-IP
在网络中,每台计算机都要遵守IP协议产生一个唯一的上网标识

IP(internet Protocol)

IPV4: 由四个八位二进制组成 11001100.11001100.11001100.11001100.

由于不方便记忆 转换为十进制表示,最大的范围为0-255。

IPV6:基本上可以满足全世界的地址需求

查看本机的IP地址: ipconfig

测试网络连通: ping 要连接的IP地址

域名: www.baidu.com

DNS(Domain Name System)域名系统

会在系统内准备一份域名和对应机器IP的映射表

访问一个域名时:

1.查找浏览器内是否有缓存映射

2.查找本机hosts文件

3.前往网络服务商提供的域名系统

特殊的IP 127.2.0.1 == localhost 本机的 可以表示本机

4.网络通信-端口

每个程序运行时都会占用一个端口 他是唯一的 端口范围:0-65535

如果想通过某个程序在网络内进行信息交流 必须要知道对方的IP和程序端口号

IP端口号

例如:
127.0.0.1:8080
61.135.169.124:80(HTTP协议默认端口是80)

5.传输协议

网络模型中传输层的协议 TCP UDP

二、使用Socket实现

1.应用程序的架构

B/S(Browser浏览器/sever 服务器)

基于浏览器为客户端的网络应用程序

典型:网站、小程序

优点:

1.无需下载安装 只要有浏览器就可以访问【可以留住很多用户】

2.服务器更新,用户几乎无感知,刷新浏览器就可以得到最新的内容

3.因为只需要有浏览器,所以在平台层面的兼容性可以忽略

缺点:

1.因为所有的资源都在服务器上 所以在传输信息过程中受到带宽影响比较大

2.在画面渲染和安全验证方面受限严重

3.因为资源请求是同步请求,所以用户体验差 由谷歌地图带起AJAX风之后 有所改善

C/S(Client客户端/Sever)

基于自身定制的客户端的网络应用

典型: QQ 微信 APP

优点:

1.因为大多数普通资源都放在了客户端,所以在传输信息时只需要加载一些重要信息即可 受到带宽影响较小

2.在画面渲染和安全验证方面,比较强,实现也比较容易

3。因为信息加载只需要加载必要信息,所以体验较好

缺点:

1.必须安装客户端才能使用

2.如果服务器更新 鼻祖要重新下载客户端(省流/补丁更新)

3.不同的平台必须适配不同的版本

Socket介绍

插座,通信连路点

2.传输协议

网络模型中传输层的协议。TCP UDP

TCP:传输控制协议

三次握手 面向连接的传输协议 适用于传输重要的 对安全要求比较高的信息 下载文件 聊天、传输资料

为了维护连接可靠 效率较低

UDP:用户数据报协议

面向无连接的传输 协议 适用于传输一些不太重要的信息 视频聊天、看视频

效率较高

3.基于TCP

package tcp.demo4;
/*
*服务器
*/
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
	public static void main(String[] args) throws Exception {
		// 1.创建ServerSocket对象
		ServerSocket serverSocket = new ServerSocket(7777);
		// 2.监听客户端
		Socket clientSocket = serverSocket.accept();
		// 3.打开输入流
		InputStream is = clientSocket.getInputStream();
		byte[] buffer = new byte[1024];
		int len = 0;
		while((len = is.read(buffer)) != -1) {
			String str = new String(buffer, 0, len);
			System.out.println(str);
		}
		
		// 4.发送响应
		clientSocket.shutdownInput();
		// 打开输出流
		OutputStream os = clientSocket.getOutputStream();
		os.write("已接收到哦!".getBytes());
		
		// 5. 释放资源
		if(os != null) {
			os.close();
		}
		if(is != null) {
			is.close();
		}
		if(clientSocket != null) {
			clientSocket.close();
		}
		if(serverSocket != null) {
			serverSocket.close();
		}
	}
}

package tcp.demo4;
/*
*客户端
*/
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

public class Client {
	public static void main(String[] args) throws Exception {
		Socket socket = null;
		OutputStream os = null;
		try {
			// 1.创建Socket对象
			socket = new Socket("localhost",7777);
			// 2.打开输出流
			os = socket.getOutputStream();
			os.write("姑娘别回头!".getBytes());
			 
			// 3.接收响应
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			if(os != null) {
				os.close();
			}
			if(socket != null) {
				socket.close();
			}
		}
	}
}

4.基于UDP

package UDP.demo6;
/**
 * 服务器
 */
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class Server {
	public static void main(String[] args) {
		DatagramSocket ds = null;
		try {
			byte[] buffer = new byte[1024];
			// 1.指定数据包 用来存储客户请求的信息
			DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
			// 2.接收客户信息
			ds = new DatagramSocket(7777);
			ds.receive(dp);
			// 3.解包
			byte[] data = dp.getData();
			String str = new String(data);
			System.out.println(str);
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			// 4.释放资源
			if(ds != null) {
				ds.close();
			}
		}
	}
}
package UDP.demo6;
/**
 * 客户端
 */
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class Client {
	public static void main(String[] args) throws Exception {
		// 1.创建 DatagramPacket 对象 封装服务端的地址和传输的信息
		String str= "我是客户端!";
		// 将字符串转换为字节数组
		byte[] bytes = str.getBytes();
		InetAddress inetAddress = InetAddress.getByName("localhost");
		DatagramPacket dp = new DatagramPacket(bytes, bytes.length,inetAddress,7777);
		// 2.发送数据报
		DatagramSocket ds = new DatagramSocket();
		ds.send(dp);
		if(ds != null) {
			ds.close();
		}
	}
}

猜你喜欢

转载自blog.csdn.net/L097_/article/details/89964941
今日推荐