2021-10-11
2021/10/12 6:16:18
本文主要是介绍2021-10-11,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
网络编程 – TCP通信程序练习 --多线程实现文件上传服务器
TCP通信基础概念:
TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象,从而在通信的两端形成虚拟链路,一旦建立了虚拟的网络连接,两端的程序就可以通过虚拟的链路进行通信!java对基于TCP协议的网络提供了良好的封装,使用Socket对象来代表两端的接口,并通过Socket产生Io流来进行网络通信,Java为客户端提供了Scoket类,为服务器端提供了ServerSocket类!
客户端的代码如下:
public class ClientDemo { public static void main(String[] args) throws IOException { Socket s = new Socket("192.168.121.5",10086); BufferedReader br = new BufferedReader(new FileReader("test")); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); String Line; while ((Line=br.readLine())!=null){ bw.write(Line); bw.newLine(); bw.flush(); } s.shutdownOutput(); BufferedReader brClient = new BufferedReader(new InputStreamReader(s.getInputStream())); String line; while ((line=brClient.readLine())!=null){ System.out.println("服务器反馈数据:"+line); } s.close(); br.close(); } }
客户端代码解读
第一步:创建Socket对象,指定服务器的IP地址,以及服务应用程序的端口号;
第二步:创建缓冲字符输入流,指定要上传的文件;
第三步:用Socket对象去获取输出流,将客户端要上传的文件发送到服务器;
最后再用Socket对象去获取输入流,获取服务器反馈的信息,输出在控制台;
服务器端代码如下:
public class ServerDemo { public static void main(String[] args) throws IOException { ServerSocket ss =new ServerSocket(10086); while (true){ Socket s = ss.accept(); new Thread(new ServerThread(s)).start(); } } }
服务器端代码解读
第一步:创建ServerSocket对象,指定发送请求的服务应用程序端口;
因为服务器不知道客户端什么时候发来请求,所以要永远处于开启状态,等待请求服务,
所以用while(true){}死循环代码来实现!
每个客服端发送请求,服务器都要为他们开启一个线程,并且把他们上传的文件保存在不同的位置!
代码实现如下:
public class ServerThread implements Runnable { private Socket s; public ServerThread(Socket s) { this.s=s; } @Override public void run() { try { BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); //BufferedWriter bw = new BufferedWriter(new FileWriter("copy")); int count = 0; File file = new File("copy["+count+"].java"); while (file.exists()){ count++; file = new File("copy["+count+"].java"); } BufferedWriter bw =new BufferedWriter(new FileWriter(file)); String Line; while ((Line=br.readLine())!=null){ bw.write(Line); bw.newLine(); bw.flush(); } BufferedWriter bwServer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); bwServer.write("文件上传成功!"); bwServer.newLine(); bwServer.flush(); bwServer.close(); } catch (IOException e) { e.printStackTrace(); }
run()方法中的代码解读
第一步:用ServerSocket对象获取输入流,将客户端传送过来的文件复制到指定的文件,
因为有很多的客服端会发来请求,要保证每次客户端传送过来的文件可以保存在不同的文件,
所以用
int count = 0; File file = new File("copy["+count+"].java"); while (file.exists()){ count++; file = new File("copy["+count+"].java"); } BufferedWriter bw =new BufferedWriter(new FileWriter(file));
这段代码实现这个需求,这里需要明白的是 我们创建字符流对象时,可以传递File类做参数,指定路径!
第二步:当服务器接受到客户端传送过来的文件并上传到指定的位置时,就会反馈信息给客户端:
BufferedWriter bwServer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); bwServer.write("文件上传成功!"); bwServer.newLine(); bwServer.flush(); bwServer.close();
最后释放资源就行!
这篇关于2021-10-11的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南