第10章 网络编程补充案例Word文件下载.docx

上传人:b****6 文档编号:17278664 上传时间:2022-11-30 格式:DOCX 页数:17 大小:131.59KB
下载 相关 举报
第10章 网络编程补充案例Word文件下载.docx_第1页
第1页 / 共17页
第10章 网络编程补充案例Word文件下载.docx_第2页
第2页 / 共17页
第10章 网络编程补充案例Word文件下载.docx_第3页
第3页 / 共17页
第10章 网络编程补充案例Word文件下载.docx_第4页
第4页 / 共17页
第10章 网络编程补充案例Word文件下载.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

第10章 网络编程补充案例Word文件下载.docx

《第10章 网络编程补充案例Word文件下载.docx》由会员分享,可在线阅读,更多相关《第10章 网络编程补充案例Word文件下载.docx(17页珍藏版)》请在冰豆网上搜索。

第10章 网络编程补充案例Word文件下载.docx

//获取此IP地址的主机名

Stringname=address.getHostName();

System.out.println("

本机的ip地址是:

"

+ip);

本机的hostName是:

+name);

}

}

运行结果如图10-1所示。

图10-1运行结果

三、案例总结

1、InetAddress类用于封装一个IP地址,并提供了一系列与IP地址相关的方法,其中,getByName(Stringhost)方法表示获取指定主机的IP地址,常用于获取远程计算机的IP信息,isReachable(inttimeout)方法表示判断指定的时间内IP地址是否可以到达,常用于测试网络是否通畅。

2、InetAddress类的getHostName()方法是用来获取IP地址的主机名,而为什么有的时候获取到的不是主机名而是域名?

案例10-2UDP网络程序

00110006

DatagramPacket类和DatagramSocket类

掌握DatagramPacket类和DatagramSocket类的作用

掌握如何使用DatagramPacket类和DatagramSocket类通过编写简单的UDP程序。

DatagramPacket用于封装UDP通信中发送或者接收的数据,DatagramSocket类用于发送和接收DatagramPacket数据包。

为了让初学者掌握这两个类的作用,本案例将通过DatagramPacket类和DatagramSocket类实现简单的数据通信,并通过观察两个命令行窗口中数据输出的先后顺序,从而掌握UDP网络程序中接收端和发送端的执行原理。

1)编写数据接收类ReceiveDemo,在ReceiveDemo类中创建接收端的Socket服务对象,并依次编写创建数据包、调用接收方法、解析数据包并向命令行输出内容,释放资源等操作。

2)编写数据发送类SendDemo,在SendDemo类中创建发送端的Socket服务对象,并依次编写创建数据包,打包数据、发送数据、释放资源等操作。

3)依次执行ReceiveDemo和SendDemo类,观察命令行输出变化。

UDP网络程序中接受数据端,代码如下:

importjava.io.IOException;

import.DatagramPacket;

import.DatagramSocket;

publicclassReceiveDemo{

publicstaticvoidmain(String[]args)throwsIOException{

//创建接收端Socket服务对象

DatagramSocketds=newDatagramSocket(12306);

//创建数据包(接收容器)

byte[]bys=newbyte[1024];

DatagramPacketdp=newDatagramPacket(bys,bys.length);

接受数据服务已打开,等待接受数据"

);

//调用接收方法

ds.receive(dp);

//解析数据包,把数据显示在控制台

InetAddressaddress=dp.getAddress();

byte[]bys2=dp.getData();

intlength=dp.getLength();

Strings=newString(bys2,0,length);

System.out.println(ip+"

***"

+s);

接受数据完毕,接受数据服务关闭"

//释放资源

ds.close();

UDP网络程序中发送数据端,代码如下:

publicclassSendDemo{

//创建发送端Socket服务对象

DatagramSocketds=newDatagramSocket();

//创建数据,并把数据打包

Stringstr="

hello,udp,我来了"

;

byte[]bys=str.getBytes();

intlength=bys.length;

InetAddressaddress=InetAddress.getByName("

127.0.0.1"

intport=12306;

DatagramPacketdp=newDatagramPacket(bys,length,address,port);

发送数据服务已打开"

发送数据是:

+str);

//发送数据

ds.send(dp);

发送完毕,关闭服务"

运行接受端程序,运行结果如图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所示的异常。

图10-5运行结果

出现图中所示的情况,是因为在一台计算机中,一个端口号上只能运行一个程序,而我们编写的UDP程序所使用的端口号已经被其它的程序占用。

遇到这种情况,可以在命令行窗口输入"

netstat-anb"

命令来查看当前计算机端口占用情况,具体如图10-6所示。

图10-6端口占用情况

案例10-3多线程的UDP网络程序

00110007

UDP案例

通过编写多线程的UDP网络程序,掌握如何在单个窗口中实现接收与发送数据。

在上一个案例中,通过两个命令行窗口输出数据让我们初步了解了单线程的UDP网络程序,为了让初学者更加直观和深入的掌握网络编程,本案例将整合多线程技术,在同一个命令行窗口中同时实现接收和发送数据的功能。

1)编写数据接收类ReceiveThread,该类实现了Runnable接口,重写run()方法实现不断接受客户端发送数据的功能。

2)编写数据发送类SendThread,该类同样实现了SendThread接口,重写run()方法实现通过键盘录入数据,将数据向接收端发送的功能。

3)编写测试类Example02,在main()方法中,同时启动接收端和发送端程序。

publicclassReceiveThreadimplementsRunnable{

publicvoidrun(){

try{

//创建接收端Socket对象

DatagramSocketds=newDatagramSocket(10086);

//创建数据包

while(true){

byte[]bys=newbyte[1024];

DatagramPacketdp=newDatagramPacket(bys,bys.length);

//接收数据

ds.receive(dp);

//解析数据

Stringip=dp.getAddress().getHostAddress();

Strings=newString(dp.getData(),0,dp.getLength());

System.out.println("

接收端:

从"

+ip+"

主机接收到的数据是:

"

if("

bye"

.equals(s)){

System.out.println("

******聊天室关闭******"

ds.close();

break;

}

}

}catch(IOExceptione){

e.printStackTrace();

}

importjava.io.BufferedReader;

importjava.io.InputStreamReader;

publicclassSendThreadimplementsRunnable{

publicvoidrun(){

try{

//创建发送端Socket对象

DatagramSocketds=newDatagramSocket();

//封装键盘录入

BufferedReaderbr=newBufferedReader(newInputStreamReader(

System.in));

//创建数据,并打包

Stringline=null;

while((line=br.readLine())!

=null){

byte[]bys=line.getBytes();

DatagramPacketdp=newDatagramPacket(bys,bys.length,

InetAddress.getByName("

172.16.26.21"

),10086);

ds.send(dp);

if("

.equals(line)){

//释放资源

br.close();

//释放资源

br.close();

ds.close();

编写测试类Example02,代码如下:

publicclassExample02{

publicstaticvoidmain(String[]args){

SendThreadst=newSendThread();

ReceiveThreadrt=newReceiveThread();

Threadt1=newThread(st);

Threadt2=newThread(rt);

t1.start();

t2.start();

运行Example02,依次键入“helloitcast”和“bye”后,结果如图10-7所示。

图10-7运行结果

从图10-7中可以看出,Example02类实现了在一个命令行窗口中同时发送和接收数据的功能。

并且当发送端发送“bye”时,程序结束。

1、在网络程序中,为了保证程序的稳定性,服务器一般不会轻易关闭,所以在编写服务端时,通常不会编写关闭服务端的代码。

2、UDP之所以是一种不可靠的网络协议,是因为UDP排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使速度得到了保证。

思考:

既然UDP一直被业内称为不可靠的网络协议。

但是,自1980年发布以来,UDP协议仍然继续在主流应用中发挥着作用。

那么,请想一想身边有哪些应用程序使用的是UDP协议。

案例10-4TCP网络程序

00110008/00110009

ServerSocket类/Socket类

通过编写简单的TCP程序,掌握ServerSocket、Socket类的具体用法。

ServerSocket用于负责监听某台计算机的某个端口号接收来自客户端的请求,是网络程序中的服务器端,Socket用于根据指定的IP地址和端口号向ServerSocket端交互,是网络程序中的客户端。

为了让初学者掌握这两个类的作用,本案例将通过ServerSocket类和Socket类实现简单的数据通信,并通过观察两个命令行窗口中数据输出的先后顺序,从而增加对TCP网络程序中客户端和服务端的执行原理。

1)编写服务器端类ServerDemo,在ServerDemo类中创建服务器端ServerSocket对象,并依次编写监听连接、获取输入流,打印读取数据,释放资源等操作。

2)编写客户端类ClientDemo,在ClientDemo类中创建客户端Socket对象,并分别编写建立连接、获取输出流,释放资源等步骤。

3)依次执行ServerDemo和ClientDemo类,观察命令行输出变化。

TCP网络程序中服务端,代码如下:

importjava.io.InputStream;

import.ServerSocket;

import.Socket;

publicclassServerDemo{

//创建服务器端Socket对象

ServerSocketss=newServerSocket(10010);

服务端已开启,等待客户端发送数据。

//监听连接

Sockets=ss.accept();

//阻塞

//获取输入流,读取数据,并显示

InputStreamis=s.getInputStream();

intlen=is.read(bys);

Stringclient=newString(bys,0,len);

System.out.println(client);

已接收客户端发送的数据,服务端关闭。

s.close();

TCP网络程序中客户端,代码如下:

importjava.io.OutputStream;

publicclassClientDemo{

//创建客户端的Socket对象,建立连接

Sockets=newSocket("

10010);

客户端已打开,等待发送数据。

//获取输出流,写数据即可

OutputStreamos=s.getOutputStream();

os.write("

hello,tcp,我来了"

.getBytes());

发送完毕,关闭客户端服务。

首先开启服务端程序,运行结果如图10-8所示。

图10-8运行结果

然后开启客户端程序,运行结果如图10-9所示。

图10-9运行结果

此时,再观察服务端控制台的输出,运行结果如图10-10所示。

图10-10运行结果

1、在使用TCP协议编写网络程序时,服务端和客户端的端口号必须保持一致,否则会出现下列错误。

图10-11

2、通过学习UDP网络程序和TCP网络程序,会发现了他们都能实现数据的交互,那么他们有什么区别呢?

UDP和TCP协议的主要区别是两者在如何实现信息的可靠传递方面不同。

TCP协议中包含了专门的传递保证机制,当数据接收方收到发送方传来的信息时,会自动向发送方发出确认消息;

发送方只有在接收到该确认消息之后才继续传送其它信息,否则将一直等待直到收到确认信息为止。

与TCP不同,UDP协议并不提供数据传送的保证机制。

如果在从发送方到接收方的传递过程中出现数据报的丢失,协议本身并不能做出任何检测或提示。

因此,通常人们把UDP协议称为不可靠的传输协议。

3、除了数据的安全性和完整性以外,TCP和UDP还有以下几点不同之处。

●有序数据传输

●重发丢失的数据包

●舍弃重复的数据包

●无错误数据传输

●阻塞/流量控制

●面向连接(确认有创建三方交握,连接已创建才作传输。

案例10-5使用TCP网络程序上传图片

00110011

TCP案例—文件上传

掌握如何使用TCP协议完成文件的网络传输功能。

由于TCP网络程序能够保证传输数据的完整性和安全性,所以大部分的服务器都会采用TCP协议来实现文件上传的功能。

为了让初学者掌握如何使用TCP协议完成文件上传功能,本案例将通过使用TCP网络协议,实现图片上传的功能。

1)编写服务器类PicUploadServer,该类包含一个Socket类型的私有属性,并提供了该属性的有参构造方法。

PicUploadServer类实现Runnable接口,重写run()方法,在run()方法内读取客户端上传的图片,并将图片存入服务器指定文件夹中。

2)编写客户端类PicUpLoadClient,该类实现了读取指定图片,向指定端口发送图片数据的功能。

3)编写测试类Example03,在main()方法中,通过指定的端口号创建ServerSocket对象,并编写死循环,在死循环中,通过ServerSocket对象获取Socket对象,并开启线程服务。

importjava.util.*;

importjava.io.*;

import.*;

classPicUploadServerimplementsRunnable{

//包含Socket类型的私有属性

privateSockets;

//包含Socket对象的有参构造函数

PicUploadServer(Sockets){this.s=s;

publicvoidrun(){

try{

Filedir=newFile("

d:

\\upload"

if(!

dir.exists()){

dir.mkdirs();

Stringfilename=dir+File.separator+System.currentTimeMillis()+

"

itcast

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1