当前位置:首页 > 第10章 网络编程_补充案例
案例10-4 TCP网络程序
一、案例描述
1、 考核知识点
编号:00110008/00110009
名称:ServerSocket类/Socket类
2、 练习目标
? 通过编写简单的TCP程序,掌握ServerSocket、Socket类的具体用法。
3、 需求分析
ServerSocket用于负责监听某台计算机的某个端口号接收来自客户端的请求,是网络程序中的服务器端,Socket用于根据指定的IP地址和端口号向ServerSocket端交互,是网络程序中的客户端。为了让初学者掌握这两个类的作用,本案例将通过ServerSocket类和Socket类实现简单的数据通信,并通过观察两个命令行窗口中数据输出的先后顺序,从而增加对TCP网络程序中客户端和服务端的执行原理。
4、 设计思路(实现原理)
1) 编写服务器端类ServerDemo,在ServerDemo类中创建服务器端ServerSocket对象,并依次
编写监听连接、获取输入流,打印读取数据,释放资源等操作。
2) 编写客户端类ClientDemo,在ClientDemo类中创建客户端Socket对象,并分别编写建立连
接、获取输出流,释放资源等步骤。
3) 依次执行ServerDemo和ClientDemo类,观察命令行输出变化。
二、案例实现
TCP网络程序中服务端,代码如下:
import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket;
public class ServerDemo {
public static void main(String[] args) throws IOException {
// 获取输入流,读取数据,并显示
InputStream is = s.getInputStream(); byte[] bys = new byte[1024]; int len = is.read(bys);//阻塞 // 创建服务器端Socket对象
ServerSocket ss = new ServerSocket(10010);
System.out.println(\服务端已开启,等待客户端发送数据。\// 监听连接
Socket s = ss.accept();//阻塞
}
String client = new String(bys, 0, len); System.out.println(client);
}
// 释放资源
System.out.println(\已接收客户端发送的数据,服务端关闭。\s.close();
TCP网络程序中客户端,代码如下:
import java.io.IOException; import java.io.OutputStream; import java.net.Socket;
public class ClientDemo { }
}
// 释放资源
System.out.println(\发送完毕,关闭客户端服务。\s.close();
// 获取输出流,写数据即可
OutputStream os = s.getOutputStream(); os.write(\我来了\
public static void main(String[] args) throws IOException {
// 创建客户端的Socket对象,建立连接
Socket s = new Socket(\System.out.println(\客户端已打开,等待发送数据。\
首先开启服务端程序,运行结果如图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网络程序上传图片
一、案例描述
1、 考核知识点
编号:00110011
名称:TCP案例—文件上传
2、 练习目标
? 掌握如何使用TCP协议完成文件的网络传输功能。
3、 需求分析
由于TCP网络程序能够保证传输数据的完整性和安全性,所以大部分的服务器都会采用TCP协议来实现文件上传的功能。为了让初学者掌握如何使用TCP协议完成文件上传功能,本案例将通过使用TCP网络协议,实现图片上传的功能。
4、 设计思路(实现原理)
1) 编写服务器类PicUploadServer,该类包含一个Socket类型的私有属性,并提供了该属性的有
参构造方法。PicUploadServer类实现Runnable接口,重写run()方法,在run()方法内读取客户端上传的图片,并将图片存入服务器指定文件夹中。 2) 编写客户端类PicUpLoadClient,该类实现了读取指定图片,向指定端口发送图片数据的功能。 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){ }
fos.write(bytes, 0, len);
共分享92篇相关文档