第10章 网络编程 - 补充案例
更新时间:2023-12-24 15:41:01 阅读量: 教育文库 文档下载
- 第10章推荐度:
- 相关推荐
博学谷——让IT教学更简单,让IT学习更有效
第十章 补充案例
案例10-1 使用InetAddress类获取与IP信息
一、案例描述
1、 考核知识点
编号:00110004
名称:InetAddress类
2、 练习目标
? 掌握InetAddress类的相关API
? 掌握如何使用InetAddress类中的方法获取计算机的主机名和IP地址等信息。
3、 需求分析
InetAddress类中提供了一系列与IP地址相关的方法,利用这些方法可以获取到指定计算机的主机名、IP地址以及连接状态等信息。为了让初学者掌握InetAddress类中常用方法的使用,本案例将针对如何通过InetAddress类中的方法获取计算机的IP地址、主机名等功能进行演示。
4、 设计思路(实现原理)
1) 编写Example01类。
2) 在main()方法中,通过InetAddress类的静态方法getLocalHost()创建实例对象,并通过该对
象完成获取计算机主机名和计算机IP地址的操作。 3) 分别将获取到的主机名和IP地址输出。
二、案例实现
import java.net.InetAddress;
import java.net.UnknownHostException; public class Example01 { }
public static void main(String[] args) throws UnknownHostException { }
//获取本机的IP地址
InetAddress address = InetAddress.getLocalHost(); //以字符串形式返回IP地址
String ip = address.getHostAddress(); //获取此IP地址的主机名
String name = address.getHostName(); System.out.println(\本机的ip地址是:\System.out.println(\本机的hostName是:\
运行结果如图10-1所示。
1
博学谷——让IT教学更简单,让IT学习更有效
图10-1 运行结果
三、案例总结
1、InetAddress类用于封装一个IP地址,并提供了一系列与IP地址相关的方法,其中,getByName(String host)方法表示获取指定主机的IP地址,常用于获取远程计算机的IP信息,isReachable(int timeout)方法表示判断指定的时间内IP地址是否可以到达,常用于测试网络是否通畅。
2、InetAddress类的getHostName()方法是用来获取IP地址的主机名,而为什么有的时候获取到的不是主机名而是域名?
案例10-2 UDP网络程序
一、案例描述
1、 考核知识点
编号:00110006
名称:DatagramPacket类和DatagramSocket类
2、 练习目标
? 掌握DatagramPacket类和DatagramSocket类的作用
? 掌握如何使用DatagramPacket类和DatagramSocket类通过编写简单的UDP程序。
3、 需求分析
DatagramPacket用于封装UDP通信中发送或者接收的数据,DatagramSocket类用于发送和接收DatagramPacket数据包。为了让初学者掌握这两个类的作用,本案例将通过DatagramPacket类和DatagramSocket类实现简单的数据通信,并通过观察两个命令行窗口中数据输出的先后顺序,从而掌握UDP网络程序中接收端和发送端的执行原理。
4、 设计思路(实现原理)
1) 编写数据接收类ReceiveDemo,在ReceiveDemo类中创建接收端的Socket服务对象,并依次
编写创建数据包、调用接收方法、解析数据包并向命令行输出内容,释放资源等操作。 2) 编写数据发送类SendDemo,在SendDemo类中创建发送端的Socket服务对象,并依次编写
创建数据包,打包数据、发送数据、释放资源等操作。
3) 依次执行ReceiveDemo和SendDemo类,观察命令行输出变化。
二、案例实现
UDP网络程序中接受数据端,代码如下:
import java.io.IOException;
2
博学谷——让IT教学更简单,让IT学习更有效
import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class ReceiveDemo { }
public static void main(String[] args) throws IOException { }
// 创建接收端Socket服务对象
DatagramSocket ds = new DatagramSocket(12306); // 创建数据包(接收容器)
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length); System.out.println(\接受数据服务已打开,等待接受数据\// 调用接收方法 ds.receive(dp);
// 解析数据包,把数据显示在控制台
InetAddress address = dp.getAddress(); String ip = address.getHostAddress(); byte[] bys2 = dp.getData(); int length = dp.getLength();
String s = new String(bys2, 0, length); System.out.println(ip + \
System.out.println(\接受数据完毕,接受数据服务关闭\// 释放资源 ds.close();
UDP网络程序中发送数据端,代码如下:
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class SendDemo {
public static void main(String[] args) throws IOException {
// 创建发送端Socket服务对象
DatagramSocket ds = new DatagramSocket(); // 创建数据,并把数据打包
String str = \我来了\byte[] bys = str.getBytes(); int length = bys.length;
InetAddress address = InetAddress.getByName(\int port = 12306;
DatagramPacket dp = new DatagramPacket(bys, length, address, port); System.out.println(\发送数据服务已打开\System.out.println(\发送数据是:\// 发送数据
3
博学谷——让IT教学更简单,让IT学习更有效
}
}
ds.send(dp);
System.out.println(\发送完毕,关闭服务\// 释放资源 ds.close();
运行接受端程序,运行结果如图10-2所示。
图10-2 运行结果
运行发送端程序,运行结果如图10-3所示。
图10-3 运行结果
观察接受端控制台的输出,运行结果如图10-4所示。
图10-4 运行结果
从图10-2中可以看出,当运行ReceiveDemo类时,程序会在receive()方法处停顿,并一直处于停滞状态。当运行SendDemo类时,ReceiveDemo类中的receive()方法接受到了数据,并向下执行直到程序结束。
三、案例总结
1、 在创建发送端的DatagramSocket对象时,可以不指定端口号,而案例中指定端口号目的就是,为
了每次运行时接收端的getPort()方法返回值都是一致的,否则发送端的端口号由系统自动分配,接收端的getPort()方法的返回值每次都不同。
2、 运行例程ReceiveDemo,有时会出现如图10-5所示的异常。
4
博学谷——让IT教学更简单,让IT学习更有效
图10-5 运行结果
出现图中所示的情况,是因为在一台计算机中,一个端口号上只能运行一个程序,而我们编写的UDP程序所使用的端口号已经被其它的程序占用。遇到这种情况,可以在命令行窗口输入\-anb\命令来查看当前计算机端口占用情况,具体如图10-6所示。
图10-6 端口占用情况
案例10-3 多线程的UDP网络程序
一、案例描述
1、 考核知识点
编号:00110007 名称:UDP案例
2、 练习目标
? 通过编写多线程的UDP网络程序,掌握如何在单个窗口中实现接收与发送数据。
3、 需求分析
在上一个案例中,通过两个命令行窗口输出数据让我们初步了解了单线程的UDP网络程序,
5
博学谷——让IT教学更简单,让IT学习更有效
图10-11
2、通过学习UDP网络程序和TCP网络程序,会发现了他们都能实现数据的交互,那么他们有什么区别呢?
UDP和TCP协议的主要区别是两者在如何实现信息的可靠传递方面不同。TCP协议中包含了专门的传递保证机制,当数据接收方收到发送方传来的信息时,会自动向发送方发出确认消息;发送方只有在接收到该确认消息之后才继续传送其它信息,否则将一直等待直到收到确认信息为止。
与TCP不同,UDP协议并不提供数据传送的保证机制。如果在从发送方到接收方的传递过程中出现数据报的丢失,协议本身并不能做出任何检测或提示。因此,通常人们把UDP协议称为不可靠的传输协议。 3、除了数据的安全性和完整性以外,TCP和UDP还有以下几点不同之处。
? 有序数据传输 ? 重发丢失的数据包 ? 舍弃重复的数据包 ? 无错误数据传输 ? 阻塞/流量控制
? 面向连接(确认有创建三方交握,连接已创建才作传输。)
案例10-5 使用TCP网络程序上传图片
一、案例描述
1、 考核知识点
编号:00110011
名称:TCP案例—文件上传
2、 练习目标
? 掌握如何使用TCP协议完成文件的网络传输功能。
3、 需求分析
由于TCP网络程序能够保证传输数据的完整性和安全性,所以大部分的服务器都会采用TCP协议来实现文件上传的功能。为了让初学者掌握如何使用TCP协议完成文件上传功能,本案例将通过使用TCP网络协议,实现图片上传的功能。
4、 设计思路(实现原理)
1) 编写服务器类PicUploadServer,该类包含一个Socket类型的私有属性,并提供了该属性的有
参构造方法。PicUploadServer类实现Runnable接口,重写run()方法,在run()方法内读取客户端上传的图片,并将图片存入服务器指定文件夹中。 2) 编写客户端类PicUpLoadClient,该类实现了读取指定图片,向指定端口发送图片数据的功能。
11
博学谷——让IT教学更简单,让IT学习更有效
3) 编写测试类Example03,在main()方法中,通过指定的端口号创建ServerSocket对象,并编写
死循环,在死循环中,通过ServerSocket对象获取Socket对象,并开启线程服务。
二、案例实现
TCP网络程序中服务端,代码如下:
import java.util.*; import java.io.*; import java.net.*;
class PicUploadServer implements Runnable{ }
//包含Socket类型的私有属性 private Socket s ;
//包含Socket对象的有参构造函数
PicUploadServer (Socket s){this.s = s;} public void run(){ }
try{
File dir = new File(\if(!dir.exists()){ }
\dir.mkdirs();
String filename = dir+File.separator+System.currentTimeMillis()+
//读取客户端的字节数据\\
InputStream in = s.getInputStream(); byte[] bytes = new byte[1024]; int len = 0 ; //数据的目的
FileOutputStream fos = new FileOutputStream(filename); while((len = in.read(bytes))!=-1){ }
//回写上传成功
OutputStream out = s.getOutputStream(); out.write(\上传成功\System.out.println(\服务器已接收到文件\fos.close(); s.close();
}catch(Exception e){ }
e.printStackTrace();
throw new RuntimeException(\上传失败\fos.write(bytes, 0, len);
TCP网络程序中客户端,代码如下:
12
博学谷——让IT教学更简单,让IT学习更有效
import java.io.*; import java.net.*;
public class PicUpLoadClient { }
public static void main(String[] args)throws Exception { }
Socket s = new Socket(\//读取图片
FileInputStream fis = new FileInputStream(\byte[] bytes = new byte[1024]; int len = 0 ;
//获取字节输出流,输出到服务器
OutputStream out = s.getOutputStream(); while((len = fis.read(bytes))!=-1){ }
s.shutdownOutput(); //获取上传成功
BufferedReader bfrIn =
new BufferedReader(new InputStreamReader(s.getInputStream())); String message = bfrIn.readLine(); System.out.println(message); fis.close(); s.close();
out.write(bytes, 0, len);
编写测试类Example03,代码如下:
import java.util.*; import java.io.*; import java.net.*; public class Example03 { }
public static void main(String[] args) throws Exception{ }
ServerSocket ss = new ServerSocket(10000); System.out.println(\开启服务器...\while(true){ }
Socket s = ss.accept(); Thread.sleep(50);
new Thread(new PicUploadServer(s)).start();
首先运行Example03类,开启服务端程序,运行结果如图10-12所示。
13
博学谷——让IT教学更简单,让IT学习更有效
图10-12 运行结果
然后开启客户端程序,运行结果如图10-13所示。
图10-13 运行结果
此时,再观察服务端控制台的输出,运行结果如图10-14所示。
图10-14 运行结果
三、案例总结
1、使用TCP协议上传文件是非常可靠的、安全的。
2、服务器端在每次接收到客户端访问时,会根据此客户端的信息创建一个服务器进程,从而实现了多线程TCP程序中单个服务器被多个客户端访问的功能。
3、在网络程序中,为了保证程序的稳定性,服务器一般不会轻易关闭,所以在编写服务端程序时,通常不会编写关闭服务端的代码。
14
正在阅读:
第10章 网络编程 - 补充案例12-24
延安暑期实践日志四篇(3000字)10-29
后端精华01-18
第十届中国蛋品科技大会征集论文(附件2)07-04
江苏省泰州市姜堰区2015-2016学年高二数学上学期期中试卷 理(含04-08
生命与金钱的段子02-21
教科版五年级下写字导学案设计 - 图文12-15
2017.11浙江地理学考、选考重绘卷矢量图精校版01-15
周口关帝庙建筑装饰艺术剖析10-21
心理咨询室活动记录05-08
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 网络编程
- 补充
- 案例
- 低年级课堂常规训练
- 我是小小交通规则宣讲员
- 2017年塑料制品行业现状及发展趋势分析(目录)
- 云南农业大学学生科技创新创业行动基金项目申请书
- 宁波产业结构-姜浩 - 文本资料
- 2016届中考英语复习考点跟踪突破36 完成句子
- 如何提高请示性公文和工作汇报的实效与如何撰写中期研究报告汇编
- 浙江大学求是学院丹阳青溪学园第五次学生代表大会-丹青学园
- 金融学案例,很实用哦
- 鄂教版小学三年级上册科学第一单元测试题
- “免、抵、退”税培训教材
- 阅读理解方法 - 图文
- 2011年响塘乡农作物病虫害防治工作总结
- 广东省优良样板工程验评表 - 图文
- 2017年浙江省宁波市慈溪中学自主招生数学试卷及参考答案
- 公共关系学13秋期末复习资料
- 主持词-讲文明主题演讲比赛主持词模板 精品
- 试论中国、新加坡高等教育投资体制的发展演变
- 第二届“创青春”通知
- 地理信息技术在中学地理教学中的应用论文