zoukankan      html  css  js  c++  java
  • 基于TCP用JAVA实现客户端和服务端通信

    案例模型分析:

    基于TCP实现,一个Clinet(发送端)向,一个Server(接收端)上传图片文件的功能。要求,客户端上上传的图片路径,需要从配置文件.properties文件中读取

    为了简化并可视结果:客户端和服务端,用本机ip上两个端口模拟即可;

    定义Socket的时候,本机端口是OS随机分配的;

    发送的文件类型是图片,用字节流(图片可能很大,这里用缓冲流包装)

    由于服务器端套接字输入流是一个阻塞方法,客户端发送完数据后,需要用shutdown方法关闭客户端套接字输出流,这样服务端就不会一直阻塞等待新的输入;

    客户端:

    package netTCP;
    
    import java.io.*;
    import java.net.Socket;
    
    public class Clinet {
    
        public static void main(String args[]) throws IOException {
            //获取文本内容,得到目标文件的路径
            String filepathtoUpload = getPath();
            System.out.println("获得要上传的文件所在路径是: "+filepathtoUpload);
    
            //定义客户端端口(目的ip,目的端口)
            Socket socket = new Socket("127.0.0.1",9991);
    
            //定义缓冲输入流,准备读入图片的字节缓冲数组
            BufferedInputStream bi = new BufferedInputStream(new FileInputStream(filepathtoUpload));
            byte[] buffpic= new byte[1024];
            int len;
    
            //获取客户端发送流,做包装;一边读图片字节数据,一边发送
            OutputStream out = socket.getOutputStream();
            BufferedOutputStream bos = new BufferedOutputStream(out);
            while((len = bi.read(buffpic))!=-1){
                bos.write(buffpic,0,len);
            }
            bos.flush();//刷新缓存
            socket.shutdownOutput();//禁用此套接字的输出流,可以使服务器端的InputStream不在阻塞
    
            //获取客户端输入流,接受文件上传后反馈信息
            InputStream in = socket.getInputStream();
            byte [] feedBack = new byte[1024];
            int lenfeedBack = in.read(feedBack);
            System.out.println(new String(feedBack,0,lenfeedBack));
    
            //收到反馈信息后,关闭套接字socket
            socket.close();
            bi.close();
        }
    
    
        public static String getPath() throws IOException {
            FileInputStream fileInputStream = new FileInputStream("G:\JavaTestDir\路径有中文\config.properties");
            byte[] buffer = new byte[1024];
            int len = fileInputStream.read(buffer);
            String s = new String(buffer,0,len);
            return s;
    
        }
    
    }

    服务端:

    package netTCP;
    
    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Server {
       public static void main(String args[]) throws IOException {
           //定义服务端SeverSocker,并获取服务端连接的socket
           ServerSocket serverSocket = new ServerSocket(9991);
           Socket socket = serverSocket.accept();
    
           //获取socket输入流,并用缓存字节流包装;
           InputStream in = socket.getInputStream();
           BufferedInputStream bis = new BufferedInputStream(in);
    
           //指定一个路径(这里用默认路径),定义缓冲输出流,用于将图片保存到默认路径
           FileOutputStream fo = new FileOutputStream("copy.jpg");
           BufferedOutputStream bos = new BufferedOutputStream(fo);
    
           //接收客户端的数据,并写到指定位置
           byte[] buff = new byte[1024];
           int len = 0;
           while((len = bis.read(buff))!=-1){
                bos.write(buff,0,len);
           }
            bos.flush();
    
           //获取socket输出流
           OutputStream out = socket.getOutputStream();
           //返回文件上传结束信息给客户端(中文)
           String feedbackMessage ="文件上传结束";
           out.write(feedbackMessage.getBytes());
    
           //out.close();//可不用,由客户端关闭socket即可
           fo.close();
          // in.close();//可不用,有客户端关闭socket即可
           socket.close();
           serverSocket.close();;
       }
    
    }

    可以看到运行完,图片被上传到默认路径



  • 相关阅读:
    ArrayList removeRange方法分析
    LinkedHashMap源码分析(基于JDK1.6)
    LinkedList原码分析(基于JDK1.6)
    TreeMap源码分析——深入分析(基于JDK1.6)
    51NOD 2072 装箱问题 背包问题 01 背包 DP 动态规划
    51 NOD 1049 最大子段和 动态规划 模板 板子 DP
    51NOD 1006 最长公共子序列 Lcs 动态规划 DP 模板题 板子
    8月20日 训练日记
    CodeForces
    CodeForces
  • 原文地址:https://www.cnblogs.com/debug-the-heart/p/13253886.html
Copyright © 2011-2022 走看看