{网络编程}和{多线程}应用:基于TCP协议【实现多个客户端发送文件给一个服务器端】--练习

xiaoxiao2021-02-27  291

要求:

实现多个客户端发送文件给一个服务器端 提示:多个人创建客户端发送文件,服务端循环接收socket,从socket中获取文件

说明:这里我们只要建立一个服务端就可以了,然后让多台电脑使用客户端给这个服务端发送文件。

特别注意:服务端和客户端端口号的对接,以及正确的IP地址


代码:

客户端:

package Homework4; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; public class Client { public static void main(String[] args) { System.out.println("客户端已启动"); File file=new File("Example"); file.mkdirs(); File file2=new File("Example\\a.txt"); Socket socket=null; InputStream is=null; OutputStream os=null; FileInputStream fis=null; try { socket=new Socket("10.16.152.24",7777); is=socket.getInputStream(); fis=new FileInputStream(file2); os=socket.getOutputStream(); byte[] bs=new byte[1024]; int count=0; //发送文件 while((count=fis.read(bs))!=-1){ os.write(bs, 0, count); os.flush(); } } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { if(is!=null){ try { is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(os!=null){ try { os.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(fis!=null){ try { fis.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(socket!=null){ try { socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }

服务器端:

这里可以不使用多线程:

但使用单线程有一个弊端:服务器每次只能在接收完其中一个客户端发过来的文件后,才能接收下一个客户端发送来的文件。即如果服务器在接收文件,那么客户端必须等服务器接收完毕后,才能发送过去。

因此,这里要使用多线程。

package com.qf.demo3; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) { try { ServerSocket serverSocket = new ServerSocket(8888); while(true){ Socket socket = serverSocket.accept(); MyThread thread = new MyThread(socket); thread.start(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } class MyThread extends Thread{ Socket socket ; public MyThread(Socket socket) { this.socket = socket; } @Override public void run() { InputStream is = null; FileOutputStream fos = null; try { is = socket.getInputStream(); byte[] bs = new byte[1024]; int count = 0; long l = System.currentTimeMillis(); fos = new FileOutputStream(new File(l+".txt")); while((count = is.read(bs))!=-1){ fos.write(bs, 0, count); fos.flush(); } System.out.println("接收文件完毕"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ if(fos!=null){ try { fos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(is!=null){ try { is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(socket!=null){ try { socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }
转载请注明原文地址: https://www.6miu.com/read-3007.html

最新回复(0)