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

    要求:

    实现多个客户端发送文件给一个服务器端
    
    提示:多个人创建客户端发送文件,服务端循环接收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.cnblogs.com/TCB-Java/p/6809616.html
Copyright © 2011-2022 走看看