Note_21 网络编程

一、网络编程
1.软件架构
	① B/S
		* Brower / Server ---> 浏览器 / 服务器
			例如:淘宝网
	② C/S
		* Client / Server ---> 客户端 / 服务端
			例如:QQ

2.网络通信
	① 七层模型
		* 数据链路层 ---> 物理层 ---> 网络层 ---> 传输层 ---> 会话层 ---> 表现层 ---> 应用层
	② 网络通信三要素
		* 通信协议(TCP、UDP):去教室的方式
		* ip:教室地址
		* 端口:座位号
		
二、TCP通信
1.客户端(socket)
	① 构造方法
		public Socket(String host, int prot)
			例如:
				Socket socket = new Socket("127.0.0.1",1818);
	② 常用方法
		* getInputStream() 
			返回此套接字的输入流。
		* getOutputStream()
			返回此套接字的输出流。
		* shutdownOutput()
			禁用此套接字的输出流。
		* getInetAddress()
			返回套接字连接的地址。
		* getLocalAddress() 
			获取套接字绑定的本地地址。
		* getPort()
			返回此套接字连接到的远程端口。
			
2.服务端(ServerSocket)
	① 构造方法
		public ServerSocket(int port)
			例如:
				ServerSocket server = new ServerSocket(1818);
	② 常用方法
		* accept() 
			侦听并接受到此套接字的连接
	③ 注意
		* 服务端未开启,客户端无法连接回报异常
			
3.示例文件上传
	//服务端
	import java.io.*;
	import java.net.ServerSocket;
	import java.net.Socket;
	import java.text.SimpleDateFormat;
	import java.util.Date;

	public class DemoServerSocket {
		public static void main(String[] args) throws Exception{
			new Thread(new Runnable() {
				@Override
				public void run() {
					try {
						method();
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}).start();
		}

		public static void method() throws Exception{
			//创建服务器连接
			ServerSocket serverSocket = new ServerSocket(5555);
			//获取通信对象
			Socket accept = serverSocket.accept();
			//获取网络输入流
			InputStream inputStream = accept.getInputStream();
			//创建缓冲流
			BufferedInputStream bis = new BufferedInputStream(inputStream);

			//创建日期格式化对象
			SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHssmmSS");

			//本地缓冲输出流,使用当前时间加上随机数避免重名
			BufferedOutputStream bos = new BufferedOutputStream(
					new FileOutputStream("src\\com\\" + sdf.format(new Date()) + new Random().nextInt(100) + ".java"));
			//创建缓冲区
			byte[] bytes = new byte[1024 * 1024];
			//读取的长度
			int len;
			//循环读取字节,并写出到服务器
			while ((len = bis.read(bytes)) != -1) {
				bos.write(bytes,0,len);
			}

			//获取网络输出流
			OutputStream outputStream = accept.getOutputStream();
			//写回信息
			outputStream.write("上传成功".getBytes());

			//释放资源
			bis.close();
			bos.close();
			accept.close();
		}
	}
	
	//客户端
	import java.io.*;
	import java.net.Socket;

	public class DemoSocket {
		public static void main(String[] args) throws Exception{
			//创建连接
			Socket socket = new Socket("127.0.0.1", 5555);
			//获取网络输出流
			OutputStream socketOutput = socket.getOutputStream();
			//创建本地缓冲输入流
			BufferedInputStream nativeInput = new BufferedInputStream(new FileInputStream(
					new File("C:\\Users\\Demo_Null\\Desktop\\socket.java")));

			//创建缓冲数组
			byte[] bytes = new byte[1024 * 1024];
			//读取的长度
			int len;
			//循环读取字节并上传到服务器
			while ((len = nativeInput.read(bytes)) != -1) {
				socketOutput.write(bytes,0,len);
			}
			//写结束标记
			socket.shutdownOutput();

			//获取网络输入流
			InputStream inputStream = socket.getInputStream();
			//创建缓冲流
			BufferedInputStream b =  new BufferedInputStream(inputStream);
			//打印服务器写回信息
			while ((len = b.read(bytes)) != -1) {
				System.out.print(new String(bytes,0,len));
			}

			//关闭套接字
			socket.close();
		}
	}

三、UDP 协议
1.使用方法
	① 发送方
		* 创建 DatagramSocket 对象(创建一个码头)
		* 创建 DatagramPacket 对象并指定IP和端口号(装箱并集装箱贴目的地和接收港编号)
		* 调用 send() 方法发送(发送集装箱)
		* 释放资源(拆码头)
	② 接收方
		* 创建 DatagramSocket 对象并指定端口号(创建一个码头并编号)
		* 创建 DatagramPacket 对象,用于接收数据(拆箱)
		* 调用 receive() 方法接收(接收集装箱)
		* 释放资源(拆码头)

2.相关类
	① DatagramSocket
		* DatagramSocket() 
			无参构造
		* DatagramSocket(prot)
			有参构造,指定端口号
		* send(DatagramPacket)
			发送数据
		* receive(DatagramPacket)
			接收数据
		* close()
			释放资源
	② DatagramPacket
		* DatagramPacket(byte[],length)
			用于接受长度为 length 的数据
		* DatagramPacket(byte[],length,address,prot)
			将参数指定内容发送到指定位置
		* getAddress()
			获取当前IP
		* getPort()
			获取当前端口号
		* getLength()
			获取数据的长度
		* InetAddress.getLocalHost()
			获取本地主机的通信地址
		* InetAddress.getByName(host)
			获取指定主机的通信地址

3.示例
	/**
	*		发送
	*/
	import java.net.*;

	public class DemoSend {
		public static void main(String[] args) {
			DatagramSocket socket = null;

			try {
				//创建 DatagramSocket
				socket = new DatagramSocket();
				//创建数据
				byte[] bytes = "你好啊!".getBytes();
				//创建 DatagramPacket
				DatagramPacket packet = new DatagramPacket(bytes,bytes.length, InetAddress.getLocalHost(),9999);
				//发送数据
				socket.send(packet);

				//接受写回数据
				//创建字节数组
				byte[] bytes1 = new byte[1024];
				//创建 DatagramPacket
				DatagramPacket packet1 = new DatagramPacket(bytes1,bytes1.length);
				//接受数据
				socket.receive(packet1);
				//打印到控制台
				System.out.println(new String(bytes1,0,bytes.length));

			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				//释放资源
				if (socket != null) {
					socket.close();
				}
			}
		}
	}
	
	
	/**
	*		接收
	*/
	import java.io.IOException;
	import java.net.DatagramPacket;
	import java.net.DatagramSocket;

	public class DemoReceive {
		public static void main(String[] args) {
			DatagramSocket socket = null;
			try {
				//创建 DatagramSocket
				socket = new DatagramSocket(9999);
				//创建字节数组
				byte[] bytes = new byte[1024];
				//创建 DatagramPacket
				DatagramPacket packet = new DatagramPacket(bytes,bytes.length);
				//接受数据
				socket.receive(packet);
				//打印到控制台
				System.out.println(new String(bytes,0,bytes.length));

				//回写消息
				//创建数据
				byte[] rbytes = "收到了".getBytes();
				//创建 DatagramPacket
				DatagramPacket rpacket = new DatagramPacket(rbytes,rbytes.length, packet.getAddress(),packet.getPort());
				//发送
				socket.send(rpacket);

			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				//释放资源
				if (socket != null) {
					socket.close();
				}
			}
		}
	}
	
	
	
	
	
	
	
	
		

 

你可能感兴趣的:(java,java开发)