Java基础--day18(网络编程)

1.网络

由点和线构成,表示诸多对象间的相互联系(概念而已,不重要)

2.计算机网络

为实现资源共享和信息传递,通过通信线路连接起来的若干主机

按照地理范围网络分为:
局域网、城域网、广域网(互联网、物联网和万维网)

3.网络模型
OSI(Open System Interconnection)开放式系统互联
七层:
第一层:物理层,它为设备之间的数据通信提供传输信号和物理介质(双绞线、光导纤维)
第二层:数据链路层,通过规程或协议(差错控制)来控制传输数据的正确性(MAC)
第三层: 网络层,它负责定义能够标识所有网络节点的逻辑地址(IP地址)
第四层:传输层,负责是否选择差错恢复协议、数据流重用,错误顺序重排(TCP、UDP)
第五层:会话层
第六层:表示层
第七层:应用层,负责文件访问和管理、可靠运输服务、远程操作服务(HTTP、FTP、SMTP)


TCP/IP协议
第一层:网络接口层(物理层+数据链路层),负责建立电路连接
第二层:网络层,负责分配地址和传送二进制数据,主要协议是IP协议
第三层:传输层,负责传送文本数据,主要协议是TCP、UDP协议
第四层:应用层(会话层+表示层+应用层),负责传送各种最终形态的数据,是直接与用户 打交道的层,典型的协议是HTTP、FTP协议等
4.通信协议

TCP协议:传输控制协议
它是一种面向连接的、可靠的、基于字节流的传输层通信协议。数据大小无限制。建立连接的过程需要三次过程,断开连接的过程需要四次挥手

建立连接的过程:在这里插入图片描述
断开连接的过程:
在这里插入图片描述

UDP协议:用户数据包协议
它是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,每个包的大小为64KB

IP协议:互联网协议/国际协议
负责数据从一台机器发送到另一台机器;给互联网的每台设备分配一个唯一标识(IP地址)

5.IP与端口
IP分类:
A类:政府机构,1.0.0.1~255.255.255.254
B类:中型企业,128.0.0.1~191.255.255.254
C类:个人用户,192.0.0.1~223.255.255.254
D类:用于组播,224.0.0.1~239.255.255.254
E类:用于实验,240.0.0.1~255.255.255.254
回环地址:127.0.0.1,指本机,一般用于测试使用
测试IP命令(查看本机网卡是否损坏): ping ip地址
查看IP命令(查看本机的IP地址):ipconfig


端口号:在通信实体上进行网络通讯程序的唯一标识
端口分类:
1、公认端口:0~1023
2、注册端口:1024~49151
3、动态或私有端口:49152~65535
常用端口:
MySql:3306
Oracle:1521
Tomcat:8080
SMTP:25
Web服务器:80
FTP服务器:21

端口为什么重要呢?比如你和你的朋友微信或qq聊天,那么你和你朋友的电脑ip地址是不变的,那么怎么区分你朋友是微信给你发的消息还是qq发给你的消息呢?这就需要端口号

6.网络编程
InetAddress类:
概念:表示互联网协议(IP)地址对象,封装了与该IP地址相关的所有信息,并提供获取信息的常用方法。
方法:
1、public static InetAddress getLocalHost()返回本地主机的地址
2、public static InetAddress getByName(String host)根据主机名称获得地址对象
3、public static InetAddress[] getAllByName(String host) 获取所有相关地址对象
4、public String getHostAddress()获取IP地址字符串
5、public String getHostName()获得IP地址主机名

//1.创建本机IP地址对象
				//1.1getLocalhost()
				InetAddress ia=InetAddress.getLocalHost();
				System.out.println("主机地址:"+ia.getHostAddress()+"主机名:"+ia.getHostName());
				
				//1.2getByName("ip地址")
				InetAddress ia2=InetAddress.getByName("192.168.137.1");
				System.out.println("主机地址:"+ia2.getHostAddress()+" 主机名:"+ia2.getHostName());
				
				//1.3getByName("127.0.0.1")
				InetAddress ia3=InetAddress.getByName("127.0.0.1");
				System.out.println("主机地址:"+ia3.getHostAddress()+" 主机名:"+ia3.getHostName());
				
				//1.4getByName("localhost")
				InetAddress ia4=InetAddress.getByName("localhost");
				System.out.println("主机地址:"+ia4.getHostAddress()+" 主机名:"+ia4.getHostName());
				
		//2.创建局域网IP地址对象
				InetAddress ia5=InetAddress.getByName("192.168.137.110");
				System.out.println(ia5.isReachable(2000));
				System.out.println("主机地址:"+ia5.getHostAddress()+" 主机名:"+ia5.getHostName());
				
		//3.创建外网IP地址对象
				InetAddress ia6=InetAddress.getByName("www.baidu.com");
				System.out.println(ia6.isReachable(2000));
				System.out.println("主机地址:"+ia6.getHostAddress()+" 主机名:"+ia6.getHostName());
				
				InetAddress[]  ia7=InetAddress.getAllByName("www.baidu.com");
				for (InetAddress inetAddress : ia7) {
					System.out.println(inetAddress.getHostAddress());
				}
/**打印结果为:
主机地址:192.168.137.1主机名:LAPTOP-THIJCNUT
主机地址:192.168.137.1 主机名:LAPTOP-THIJCNUT.mshome.net
主机地址:127.0.0.1 主机名:www.xmind.net
主机地址:127.0.0.1 主机名:localhost
false
主机地址:192.168.137.110 主机名:192.168.137.110
true
主机地址:39.156.66.18 主机名:www.baidu.com
39.156.66.18
39.156.66.14
*/

基于TCP的网络编程
1、服务器端:
1)创建ServerSocket,指定端口号
2)调用accept等待客户端接入
3)使用输入流,接收请求数据到服务器(等待)
4)使用输出流,发送响应数据给客户端
5)释放资源

/**
		 * 1、创建ServerSocket 并指定端口号
		 * 2、调用accept()方法,接收客户端请求
		 * 3、获取输入流,读取客户端发送的数据
		 * 4、获取输出流,发送数据到客户端
		 * 5、关闭释放资源
		 */
		
		//1、创建ServerSocket 并指定端口号
		ServerSocket s=new ServerSocket(8087);
		//2、调用accept()方法,接收客户端请求
		Socket so=s.accept();
		//3、获取输入流,读取客户端发送的数据
		InputStream is=so.getInputStream();
		BufferedReader bf=new BufferedReader(new InputStreamReader(is,"utf-8"));
		String data = bf.readLine();
		System.out.println("客户端发送的数据"+data);
		
		// 4、获取输出流,发送数据到客户端[可选可不选]
		
		//5、关闭释放资源
		bf.close();
		so.close();
		s.close();

2、客户端
1)创建Socket,指定服务器IP+端口号
2)使用输出流,发送请求数据给服务器
3)使用输入流,接收响应数据到客户端(等待)
4)释放资源

/**
		 * 基于TCP客户端开发
		 * 
		 * 1.创建Socket套接字,并指定服务器的地址和端口号
		 * 2.获取输出流,发送数据给服务器
		 * 3.获取输入流,读取服务器回复的数据
		 * 4.关闭资源
		 */

//		 1.创建Socket套接字,并指定服务器的地址和端口号
		Socket socket=new Socket("192.168.8.115", 8087);
//		 * 2.获取输出流,发送数据给服务器
		OutputStream os=socket.getOutputStream();
		BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os,"utf-8"));
		bw.write("好久不见");
//		 * 3.获取输入流,读取服务器回复的数据
//		 * 4.关闭资源
		bw.close();
		socket.close();

小案例:上传文件到服务器(服务器将其保存在某个位置)

//1.创建ServerSocket,并指定端口号
		ServerSocket serverSocket=new ServerSocket(7888);
		
		//2.调用accept方法
		Socket socket=serverSocket.accept();
		
		//3.获取输入流,读取客户端发来的数据
		InputStream is=socket.getInputStream();
		
		FileOutputStream fos=new FileOutputStream("g:\\001.jpg");
		byte[]b=new byte[1024];
		int count=0;
		while((count=is.read(b))!=-1) {
			fos.write(b, 0, count);
		}
		
		//4.获取输出流,响应客户端数据
		
		//5.关闭资源
		fos.close();
		socket.close();
		serverSocket.close();
		
		System.out.println("执行完毕");
//1创建Socket ,指定服务器的ip地址和端口号,与服务器建立连接
		Socket socket=new Socket("192.168.8.115", 7888);
		
		//2获取输出流
		OutputStream os=socket.getOutputStream();
		
		FileInputStream fis=new FileInputStream("g:\\科学家.jpg");
		
		int count=0;
		byte[] b=new byte[1024];
		while((count=fis.read(b))!=-1) {
			os.write(b, 0, count);
		}
		
		//3获取输入流,读取服务器的响应数据
		
		//4关闭资源
		os.close();
		fis.close();
		socket.close();

小案例:
基于TCP协议实现多个客户端向服务器发送数据
服务器端:


		//1.创建ServerSocket,并指定端口号
		ServerSocket serverSocket=new ServerSocket(9999);
		
		System.out.println("服务器已启动。。。。");
		//2.调用accept()方法,接收客户端发来的数据
		while(true) {
			
			Socket socket=serverSocket.accept();
			System.out.println(socket.getInetAddress()+"进来了。。。。");
			new SocketThread(socket).start();
		}

线程类:

private Socket socket;
	
	public SocketThread(Socket socket) {
		this.socket=socket;
	}
	@Override
	public void run() {
		BufferedReader br=null;
		try {
			//3.获取输入流,读取客户端发送过来的数据
			InputStream is=socket.getInputStream();
			 br=new BufferedReader(new InputStreamReader(is, "utf-8"));
			 
			 while(true) {
				String data= br.readLine();//所以。。。
				if(data.equals("886")||data.equals("拜拜")) {
					
					break;
				}
					System.out.println("客户端"+socket.getInetAddress()+"发送了数据为"+data);
				
				 
			 }
			
			
			
			//4.获取输出流,响应客户端,给客户端发送数据【可选】
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			System.out.println("客户端"+socket.getInetAddress()+"退出了");
			try {
				br.close();
				socket.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
		
		
	}

客户端:

	//1.创建Socket,并指定服务器的ip地址和端口号
		Socket socket=new Socket("192.168.8.115", 9999);
		
		//2.获取输出流,向服务器端发送数据
		OutputStream os=socket.getOutputStream();
		BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os,"utf-8"));
		
		Scanner sc=new Scanner(System.in);
		
		
		while(true) {
			System.out.println("请输入数据:");
			String str=sc.next();
			if(str!=null) {
				bw.write(str);
				bw.newLine();//一定要有,否则线程类中的br.readLine()不返回数据
				bw.flush();
			}
			if(str.equals("886")||(str.equals("拜拜"))) {
				break;
			}
		}
		
		//3.获取输入流,读取服务器响应的数据【可选】
		
		//4.关闭资源
		bw.close();
		socket.close();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值