当前位置:首页 > 第10章 网络编程 - 补充案例
三、案例总结
1、 在创建发送端的DatagramSocket对象时,可以不指定端口号,而案例中指定端口号目的就是,为
了每次运行时接收端的getPort()方法返回值都是一致的,否则发送端的端口号由系统自动分配,接收端的getPort()方法的返回值每次都不同。
2、 运行例程ReceiveDemo,有时会出现如图10-5所示的异常。
图10-5 运行结果
出现图中所示的情况,是因为在一台计算机中,一个端口号上只能运行一个程序,而我们编写的UDP程序所使用的端口号已经被其它的程序占用。遇到这种情况,可以在命令行窗口输入\-anb\命令来查看当前计算机端口占用情况,具体如图10-6所示。
图10-6 端口占用情况
案例10-3 多线程的UDP网络程序
一、案例描述
1、 考核知识点
编号:00110007 名称:UDP案例
2、 练习目标
? 通过编写多线程的UDP网络程序,掌握如何在单个窗口中实现接收与发送数据。
3、 需求分析
在上一个案例中,通过两个命令行窗口输出数据让我们初步了解了单线程的UDP网络程序,为了让初学者更加直观和深入的掌握网络编程,本案例将整合多线程技术,在同一个命令行窗口中同时实现接收和发送数据的功能。
4、 设计思路(实现原理)
1) 编写数据接收类ReceiveThread,该类实现了Runnable接口,重写run()方法实现不断接受客
户端发送数据的功能。
2) 编写数据发送类SendThread,该类同样实现了SendThread接口,重写run()方法实现通过键
盘录入数据,将数据向接收端发送的功能。
3) 编写测试类Example02,在main()方法中,同时启动接收端和发送端程序。
二、案例实现
UDP网络程序中接受数据端,代码如下:
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket;
public class ReceiveThread implements Runnable {
public void run() { try {
// 创建接收端Socket对象
DatagramSocket ds = new DatagramSocket(10086); // 创建数据包 while (true) {
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length); //接收数据 ds.receive(dp); // 解析数据
String ip = dp.getAddress().getHostAddress();
String s = new String(dp.getData(), 0, dp.getLength());
System.out.println(\接收端:从\主机接收到的数据是: \
}
}
}
}
if (\ }
System.out.println(\聊天室关闭******\ds.close(); break;
} catch (IOException e) {
e.printStackTrace();
UDP网络程序中发送数据端,代码如下:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress;
public class SendThread implements Runnable {
// 封装键盘录入
BufferedReader br = new BufferedReader(new InputStreamReader(
System.in));
public void run() {
try {
// 创建发送端Socket对象
DatagramSocket ds = new DatagramSocket();
// 创建数据,并打包 String line = null;
while ((line = br.readLine()) != null) { }
// 释放资源 br.close();
byte[] bys = line.getBytes();
DatagramPacket dp = new DatagramPacket(bys, bys.length,
InetAddress.getByName(\
ds.send(dp);
if (\ }
// 释放资源 br.close(); ds.close(); break;
}
}
}
ds.close();
e.printStackTrace();
} catch (IOException e) {
编写测试类Example02,代码如下:
public class Example02 { }
}
t1.start(); t2.start();
Thread t1 = new Thread(st); Thread t2 = new Thread(rt);
public static void main(String[] args) {
SendThread st = new SendThread(); ReceiveThread rt = new ReceiveThread();
运行Example02,依次键入“hello itcast”和“bye”后,结果如图10-7所示。
图10-7 运行结果
从图10-7中可以看出,Example02类实现了在一个命令行窗口中同时发送和接收数据的功能。并且当发送端发送“bye”时,程序结束。
三、案例总结
1、 在网络程序中,为了保证程序的稳定性,服务器一般不会轻易关闭,所以在编写服务端时,通常不会编写关闭服务端的代码。
2、UDP之所以是一种不可靠的网络协议,是因为UDP排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使速度得到了保证。
思考:既然UDP一直被业内称为不可靠的网络协议。但是,自1980年发布以来,UDP协议仍然继续在主流应用中发挥着作用。那么,请想一想身边有哪些应用程序使用的是UDP协议。
共分享92篇相关文档