网络编程

1. 理解网络的相关概念

网络的概念

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

网络的分类

局域网
城域网
广域网
互联网
无线网

网络通信-IP

在网络中,每台计算机都需要遵守IP协议,产生一个唯一的上网标识
IP(Internet Protoco):
IPV4:由4个8进制组成。10001111.10001111.10001111.10001111
由于不方便记忆,转换为十进制表示,范围为:0-255
IPV6:基本上可以满足全世界的地址需求
**查看本机IP地址:**ipconfig
**测试网络连通:ping 要连接的IP地址
域名:www.baidu.com www.jd.com
DNS( Domain Name System ) 域名系统
它会在系统内准备一份域名和对应机器的IP的映射表
访问一个域名时:
1.查找浏览器内是否有缓存映射
2.查找本机的hosts文件
3.前往网络服务商提供的域名系统
特殊的IP:127.0.0.1== localhost 本机的回环地址 可以表示本机

网络通信-端口

每个成语运行时都会占用一个端口,它是唯一的。端口范围0-65535
我们如果想通过某个程序在网络内进行信息交流,必须要知道对方的IP和程序端口号
IP:端口号 例如:127.0.0.1:8080 61.135.169.125:80(HTTP协议默认端口是80)

传输协议

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

2.使用Socket实现网络应用程序

应用程序的架构

B/S ( Browser 浏览器 / Server 服务器)
基于浏览器为客户端的网络应用程序
典型:网站、小程序
优点:
1.无需下载安装,只要有浏览器就可以访问【可以留住很多用户】。
2.服务器更新,用户几乎无感知。刷新浏览器就可以得到最新的内容。
3.因为只需要有浏览器,所以在平台层面的兼容性可以忽略了。
缺点:
1.因为所有的资源都在服务器上,所以在传输过程中受到带宽信息比较大
2.在画面渲染和安全验证方面,受限严重。
3.因为资源请求是同步请求,所以用户体验很差。【由谷歌地图带起AJAX风之后,有所改善】
C/S ( Client客户端 / Server服务器 )
基于自身定制的客户端网络应用。
典型:QQ 微信 APP 端/手游
优点:
1.因为大多数普通资源都放在了客户端,所以在传输信息时,只需要加载一些重要信息即可,受到带宽信息较小。
2.在画面渲染和安全验证方面,比较强,实现也比较容易。
3.因为信息加载只需要加载必要信息,所以体验较好。
缺点:
1.必须安装客户端才能使用
2.如果服务器更新,必须要重新下载客户端。(省流/补丁更新)
3.不同的平台必须适配不同的版本。

Socket介绍

插座,通信联络点

传输协议

网络模型中传输层的协议 TCP UDP
TCP:传输控制协议
三次握手 面向连接的传输协议 适用于传输重要的 对安全要求比较高的信息。
例如: 下载文件,聊天、传输资料
为了维护连接可靠,效率较低
UDP:用户数据报协议
面向无连接的传输协议 适用于传输一些不太重要的信息。视频聊天、看视频
效率高

基于TCP

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * TCP协议的服务端:
			可以接收来自客户端的普通信息传递 还可以响应客户端
 */
public class TCPServer {

	public static void main(String[] args) throws IOException {
		ServerSocket serverSocket = null;
		Socket clientSocket = null;
		InputStream is = null;
		OutputStream os = null;
		try {
			// 1.创建ServerSocket对象 指定服务器的运行端口和主机IP
			// 端口随意指定 不要冲突   主机IP会自动获取本机的地址
			serverSocket = new ServerSocket(8080);
			// 2.监听客户端的请求 
			// 当客户端发送请求之后,服务端会将客户端的信息封装到Socket对象中
			clientSocket = serverSocket.accept();
			// 3.打开输入流  获取对应的请求信息
			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.print(str);
			}
			
			// ---------------发送响应----------------
			clientSocket.shutdownInput();
			os = clientSocket.getOutputStream();
			os.write("已经接收到你的请求信息!".getBytes());
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			// 4.释放资源
			if(os != null) {
				os.close();
			}
			if(is != null) {
				is.close();
			}
			if(clientSocket != null) {
				clientSocket.close();
			}
			if(serverSocket != null) {
				serverSocket.close();
			}
		}
		
	}

}

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/**
 * TCP协议的客户端:
 * 			可以给服务端发送普通的信息 还可以接收响应信息
 */
public class TCPClient {

	public static void main(String[] args) throws IOException {
		Socket socket = null;
		OutputStream os = null;
		InputStream is = null;
		try {
			// 1.创建Socket对象 指定服务端的主机地址和端口
			socket = new Socket("127.0.0.1", 8080);
			// 2.打开输出流 输出信息
			os = socket.getOutputStream();
			os.write("呵呵哒!!!".getBytes());
			
			// --------------接收响应----------------
			socket.shutdownOutput();
			is = socket.getInputStream();
			byte[] buffer = new byte[1024];
			int len = 0;
			while((len = is.read(buffer)) != -1) {
				String str = new String(buffer, 0, len);
				System.out.print(str);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			// 3.释放资源
			if(is != null) {
				is.close();
			}
			if(os != null) {
				os.close();
			}
			if(socket != null) {
				socket.close();
			}
		}
	}
}

基于UDP

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.UnknownHostException;

public class UDPClient {

	public static void main(String[] args) {
		DatagramSocket ds = null;
		try {
			// 1.创建DatagramPacket对象 封装服务端的地址和传输的信息
			String str = "看到我你就该凉了!";
			byte[] bytes = str.getBytes();
			InetAddress inetAddress = InetAddress.getByName("localhost");
			DatagramPacket dp = new DatagramPacket(bytes,bytes.length,inetAddress, 7777);
			// 2.发送数据报
			ds = new DatagramSocket();
			ds.send(dp);
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			// 3.释放资源
			if(ds != null) {
				ds.close();
			}
		}
	}
}
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UDPServer {

	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();
			}
		}
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值