• 基于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();;
       }
    
    }

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



  • 相关阅读:
    利用SuperMap Deskpro进行Peking 54到WGS84的转换
    远程序列化xml文件(可用于自动更新程序中版本号的比较,更新文件的读取等)
    [转]C#导出到EXCEL
    [转]常用数学公式
    CLR Via C#系列学习笔记之委托
    黑马程序员C#语言中的三种循环:while 循环、dowhile 循环、for 循环。
    .net2005中GridView或者Datalist等超級流行的分頁
    Array.splice()删除数组中重复的数据
    .net中常需对文件夹以及常用的操作方法
    文件的上传下载示例
  • 原文地址:https://www.cnblogs.com/debug-the-heart/p/13253886.html
Copyright © 2020-2023  润新知