Java程序猿必学第二十二篇—— 网络编程

//1.File相关
//1.1 FileFilter
//FileFilter:文件过滤器
//listFiles方法用于将当前层的文件和目录的File对象放入数组
//FileFilter则是在放入过程中的过滤
//案例:在指定的a目录下,查找当前层txt为后缀的文件
//分析:1.后缀为txt;2.是文件
//具体操作:实例化a目录的对象;取出下面的文件和目录;再进行判断
public class Test1 {
	public static void main(String[] args) {
		File file = new File("a");
		File[] files = file.listFiles(new FileFilter() {
			@Override
			public boolean accept(File pathname) {
				//如果为true,则放行;false就拦截
				return pathname.isFile()&&pathname.getName().endsWith(".txt");
				
			}
		});
		System.out.println(Arrays.toString(files));
	}
}


//1.2.Properties集合
//Properties:Map的子类,用于存储键值对
//存储键值对都是字符串类型
//与IO流有关,可以将文件的内容加载的Properties;也可以将Properties内容存储到文件
public class Test2 {
	public static void main(String[] args) throws FileNotFoundException, IOException {
		Properties properties = new Properties();
		properties.put("aaa", "12344");
		properties.put("bbb", "65555");
		properties.put("ccc", "76666");
		
		//存储
		properties.store(new FileOutputStream("a.txt"), "store");
		
		Properties p = new Properties();
		//加载文件的键值对
		p.load(new FileInputStream("a.txt"));
		//p.getProperty(key):根据key,获取value,都是字符串类型
		System.out.println(p);
	}
}

/*
2. 计算机网络
2.1 概述
什么是网络:由点(计算机)和线(网线)构造的网状结构
什么是计算机网络:不同区域的计算机,通过线路连接能够实现数据传递与资源共享的方式
什么是网络编程:实现数据传递与资源共享的具体技术

2.2 网络模型
概述:在实现通讯过程中的软硬件结合的操作
*/
 

//2.3 网络编程三要素(重点)
 
/*
IP地址:
计算机的唯一标识
有两种IP地址表示:
IPV4:分4个段,每个段最高为255;例如:192.168.1.6
IPV6:分8个段,每个段最高位FFFF;(十六进制)

IPV4分类:
A类:从1开始~126段
B类:127开始~191段
C类:192开始~223段(10个以内)
D类:224开始~239段

回环地址:127.0.0.1,代表本机测试地址


Port:
通讯软件的唯一识别:(0~65535)
0~1024: 系统已经分配或保留的端口,一般不去使用
1024以后可以使用
避开一些常用端口:例如3306,8080,1521等

协议:
TCP,UDP协议
TCP:面向连接的协议,安全但效率低--例如:打电话
UDP:无连接的协议,不安全但效率高--例如:发短信
*/

//3. 网络编程
//3.1 INetAddress类(了解)
//INetAddress类: 代表IP地址对象的类
//可以调用相关方法得到IP地址
public class Test1 {
	public static void main(String[] args) throws UnknownHostException {
		//通过ip或主机名或域名得到ip对象
		InetAddress net1 = InetAddress.getByName("192.168.1.8");
		System.out.println(net1);
		
		//一个域名可能绑定多台服务器(多个IP)
		InetAddress[] nets = InetAddress.getAllByName("www.baidu.com");
		System.out.println(Arrays.toString(nets));
		
		InetAddress net2 = InetAddress.getLocalHost();
		System.out.println(net2);  //获取本机IP
		
	}
}


//3.2 TCP-客户端发数据到服务器(重点)
//TCP编程:也叫做Socket编程,基于tcp协议的字节流的传输协议
//通讯模型: 客户端-服务器模型
//服务器:
//1.实例化服务器Socket对象,指定自身端口
//2.监听客户端的连接,如果有客户端连接了,那么创建一个socket与客户端通讯

//客户端:
//1.实例化socket对象,传入服务器的ip和端口

//谁先启动?  服务器先启动,有监听阻塞方法

//案例:服务器与客户端建立TCP连接后,进行通讯;客户端给服务器发数据


//-----Server-------
//TCP编程:也叫做Socket编程,基于tcp协议的字节流的传输协议
//通讯模型: 客户端-服务器模型
//服务器:
//1.实例化服务器Socket对象,指定自身端口
//2.监听客户端的连接,如果有客户端连接了,那么创建一个socket与客户端通讯

//客户端:
//1.实例化socket对象,传入服务器的ip和端口

//谁先启动?  服务器先启动,有监听阻塞方法

//案例:服务器与客户端建立TCP连接后,进行通讯;
//客户端给服务器发数据,服务器也可以给客户端发数据

public class Server {
	public static void main(String[] args) throws IOException {
		//实例化服务器socket,指定自身端口
		ServerSocket serverSocket = new ServerSocket(9527);
		//调用accept监听客户端连接,如果有客户端连接了,则创建了socket对象与客户端通讯
		Socket socket = serverSocket.accept();  //阻塞方法
		System.out.println("有一个客户端连上来了");
		
		//接收数据--读
		InputStream is = socket.getInputStream();
		byte[] b = new byte[1024];
		int len = is.read(b);
		System.out.println(new String(b, 0,len));
		
		
		//服务器发送数据--写
		OutputStream os = socket.getOutputStream();
		os.write("服务器回应给客户端的数据".getBytes());
	
		IOUtils.closeAll(is,os,socket,serverSocket);
	}
}


//-----Client-------
public class Client {
	public static void main(String[] args) throws UnknownHostException, IOException {
		Socket socket = new Socket("127.0.0.1", 9527);
		
		//通过字节流发数据--写
		OutputStream os = socket.getOutputStream();
		os.write("客户端发送的数据..".getBytes());
		
		//客户端的接收--读
		InputStream is = socket.getInputStream();
		byte[] b = new byte[1024];
		int len = is.read(b);
		System.out.println(new String(b, 0,len));
		
		//统一资源关闭: 先关小的,再关大的
		IOUtils.closeAll(os,is,socket);
	}
}

 

 




//3.3 客户端上传图片到服务器

//案例:使用tcp编程实现图片上传到服务器
//分析:先在客户端通过输入字节流读取图片资源,然后写到socket中
     //在服务器的socket中通过读字节流接收,然后再写到服务器本地
//-------Server--------
public class Server {
	public static void main(String[] args) throws IOException {
		ServerSocket ss = new ServerSocket(10086);
		Socket socket = ss.accept();
		
		//从socket中读取字节流
		InputStream is = socket.getInputStream();
		FileOutputStream fos = new FileOutputStream("d:\\a.jpg");
		byte[] b = new byte[1024];
		int len;
		while((len=is.read(b))!=-1) {
			fos.write(b, 0, len);
		}
		System.out.println("服务器接收成功~!");
		IOUtils.closeAll(fos,is,socket,ss);
	}
}


//-------Client--------
public class Client {
	public static void main(String[] args) throws UnknownHostException, IOException {
		Socket socket = new Socket("127.0.0.1", 10086);
		
		//客户端从图片中读取资源
		FileInputStream fis = new FileInputStream("b.jpg");
		byte[] b = new byte[1024];
		int len;
		OutputStream os = socket.getOutputStream();
		while((len=fis.read(b))!=-1) {
			os.write(b, 0, len);
		}
		System.out.println("上传到服务器~~");
		IOUtils.closeAll(os,fis,socket);
		
	}
}




//3.4 多个客户端发数据给服务器

//案例:多个客户端与服务器聊天
//服务器:
//1.来一个客户端,那么产生一个socket与客户端通讯---多线程
//2.从socket总接收文本内容,通过字符缓冲流封装

//客户端:
//1.循环从客户端录入数据

//------服务器------
public class Server {
	public static void main(String[] args) throws IOException {
		ServerSocket ss = new ServerSocket(10010);
		//死循环实时监听客户端连接
		while(true) {
			Socket socket = ss.accept();
			System.out.println("有一个客户端进行了连接...");
			new ServerThread(socket).start();//在开辟的路径中,执行socket操作
		}
	}
}


//------服务器线程------
public class ServerThread extends Thread {
	private Socket socket;
	
	public ServerThread(Socket socket) {
		this.socket = socket;
	}
	
	@Override
	public void run() {
		InputStream is = null;
		BufferedReader br = null;
		try {
			is = socket.getInputStream();
			br = new BufferedReader(new InputStreamReader(is));
			while(true) {
				String msg = br.readLine();
				System.out.println(msg);
				
				if(msg.equals("886")) {
					break;
				}
			}
		} catch (IOException e) {
			System.out.println("有异常中断。。。");
		}finally {
			System.out.println("有一个客户端退出了连接");
			IOUtils.closeAll(is,br,socket);
		}
		
	}
}


//------客户端------
public class Clent {
	public static void main(String[] args) throws UnknownHostException, IOException {
		Socket socket = new Socket("127.0.0.1", 10010);
		
		System.out.println("请从客户端进行录入:");
		OutputStream os = socket.getOutputStream();  //字符缓冲流包装
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
		//从键盘录入
		Scanner sc = new Scanner(System.in);
	
			while(true) {
				String msg = sc.next();
				bw.write(msg);
				bw.newLine();  //换行
				bw.flush();    //刷新
				
				if(msg.equals("886")) {  //约定
					break;
				}
			}
			IOUtils.closeAll(os,bw,socket);
	}
}

 





猜你喜欢

转载自blog.csdn.net/m0_62718093/article/details/121233687