java多线程网络编程

今天给大家上传一个 基于TCP/IP的文件上传编程。

主要知识点:字节流、字符流、高效缓冲流、数据流,tcp/ip 通信,多线程。

思路:客服端读取文件,发送服务器,服务端,通过多线程来启动,循环接收客户端上传文件,将文件保存到服务器指定位置,将上传文件名前加上时间戳,进行区分,同时对客户端进行回传,文件上传成功的消息。具体看以下代码:

客户端

public class UploadClient3 {
    public static void main(String[] args) throws IOException, InterruptedException {
        String path = "file/Demo.jar";
      
        String ip = "192.168.42.46";
     
        int port = 12306;
        //第一步创建 socket
        Socket socket = new Socket(ip, port);
        //第二步 创建 输出流
        OutputStream outputStream = socket.getOutputStream();

        // 创建高效 字节输入流 (读取文件)
        // BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File(path)));
        //把文件名读取出来
        File file = new File(path);
        String name = file.getName();
        DataOutputStream dos = new DataOutputStream(outputStream);
        dos.writeUTF(name);
        // 把  输出流 包装为 高效的
        BufferedOutputStream bos = new BufferedOutputStream(outputStream);
        //Stream里面 文件和文件名都行
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));

        int len = 0;
        int count = 0;
        byte[] bytes = new byte[8192];
        long length = file.length();
        System.out.println("文件大小: = " + length);
        while ((len = bis.read(bytes)) != -1) {

            bos.write(bytes, 0, len);

            count += len;

            //Thread.sleep(200);
            double v = (double) count / length * 100;
            // String format = String.format("%f", v);
            NumberFormat format = NumberFormat.getInstance();
            format.setMaximumFractionDigits(2);
            String str = format.format(v);
            double two = Double.parseDouble(str);
            System.out.println("上传进度: " + two + "%");
        }
        bos.flush();
        System.out.println("上传完成文件大小:  " + count + "KB");
        socket.shutdownOutput();


        //接收服务端的回复:
        InputStream is = socket.getInputStream();
        byte[] bytes2 = new byte[8192];
        int length2 = is.read(bytes2);
        System.err.println("服务器的回复:" + (new String(bytes2, 0, length2)));
        //   bos.close();
        bis.close();
        outputStream.close();
        socket.close();
        System.out.println("程序结束,数据流已关闭。");
    }
}

多线程处理

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;

public class serverThread extends Thread{
    private Socket accept;
    private ServerSocket serverSocket;

    public serverThread(Socket accept,ServerSocket serverSocket) {
        this.accept = accept;
        this.serverSocket = serverSocket;
    }

    @Override
    public void run() {
        //获取
        try {
            InputStream is = accept.getInputStream();
            BufferedInputStream bis  = new BufferedInputStream(is);
            //先接收文件名
            DataInputStream dataInputStream = new DataInputStream(is);
            String fileName = dataInputStream.readUTF();
            String  outAdd="C:/updata/" +
                    System.currentTimeMillis()
                    +"_"+fileName;
            //接收流
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(outAdd));
            byte[] bytes = new byte[8192];
            int len=0;
            int count=0;
            while((len=bis.read(bytes)) != -1) {
                //  System.out.println("****************");
                bos.write(bytes,0,len);
                count+=len;
            }
            bos.flush();
            InetAddress ia = serverSocket.getInetAddress();
            String  ip = ia.getHostAddress();
            SocketAddress ipp = serverSocket.getLocalSocketAddress();
            System.out.println(ip+"--->上传完成!---"+fileName+"\t 大小:"+count+"KB");
            //停止接收
            accept.shutdownInput();
            OutputStream outputStream = accept.getOutputStream();
            outputStream.write((fileName+"上传成功!"+"\t 大小:"+count+"KB").getBytes());
            bos.close();
            bis.close();

        } catch (IOException e) {
           // e.printStackTrace();
            System.out.println("有异常………………");
        } finally {

        }
    }
}

服务器启动

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;


public class UploadServerThread {
    public static void main(String[] args) throws IOException {
        System.out.println("服务器启动成功……");
        int port = 12306;
        ServerSocket serverSocket = new ServerSocket(port);
        while(true){
            //jieshou
            Socket accept = serverSocket.accept();
            serverThread st = new serverThread(accept,serverSocket);
            st.start();
                serverSocket.close();
        }
    }
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值