网络编程、TCP通信流程、文件上传案例

网络编程、TCP通信流程、文件上传案例

一、网络编程

1、两种软件架构
A、BS架构
    a.含义
        B:Browser浏览器 
        S:Server服务器
     b.举例 
        淘宝网站、京东商城、博学谷、百度搜索、优快云论坛、网页小游戏 
     c.特点
        直接使用浏览器,访问网站,就可以进去
B、CS架构
     a.含义
         C:Client客户端 
         S:Server服务器 
     b.举例
         QQ软件、迅雷软件、酷狗音乐、LOL游戏
     c.特点 
         需要下载客户端,安装客户端,才能使用
2、网络编程三要素
A、IP地址 (ipv4和ipv6) 
        a.查看IP地址的指令 ipconfig
        b.本地默认IP地址 127.0.0.1 
B、端口号  
        a. 端口号 范围是 0~65535 
        b. 其中 0~1024 属于系统端口,不要使用 
C、通信协议 
        a.TCP协议 
              传输数据大
              安全性高 
              速度慢
        b.UDP协议 
              传输数据小 64KB
              安全性低 
              速度快

二、TCP通信流程

1、客户端(发送数据)操作步骤
A. Socket clickSocket = new Socket("IP地址",端口号); //创建Socket的对象
B. OutputStream os = clickSocket.getOutputStream(); //获取IO流对象(输出)
C. os.write("需要写入的数据"); //写数据,可以进行流的增强
D. os.close(); //释放资源
2、服务端(接收数据)操作步骤
A. ServerSocket serverSocket = new ServerSocket(端口号); //创建ServerScoket对象
B. Socket clientSocket = serverSocket.accept();         //连接客户端Socket对象
C. InputStream is = clickSocket.getInputStream();       //获取IO流对象(输入) 
D. int ch = is.read();      //读数据,可以进行流的增强
E. is.close();             //释放资源
3、服务端(回复数据)操作步骤
A. OutputStream os = clientSocket.getOutputStream(); //获取IO流对象(输出)
B. os.write("需要写回的数据");     //写数据,可以进行增强流 
C. os.close();                  //释放资源
D. clickSocket.close();         //关闭客户端socket 
4、客户端(接收数据)操作步骤
A. InputStream is = clickSocket.getInputStream(); //获取IO流对象(输入)
B. int ch = is.read();   //读数据  可以进行流的增强
C. is.close();          //释放资源
D. clickSocket.close();  //关闭客户端socket
5、注意事项
A.采用 BufferedReader 和 BufferedWriter 进行读写操作.
    BufferedWriter 每次写完一个数据,需要换行和刷新.才能被 BufferedReader
 读取得到
    原因是: BufferedReader 采用 readLine()读取数据的结束条件是 "遇到换行符结束"
B.客户端的 Socket 和 服务端获取客户端Socket要匹配上
    客户端的 Socket ----- 匹配到 ---> 服务端的 serverSocket.accept();

三、文件上传案例

1、图片文件上传服务器、基础版本的代码流程
客户端硬盘文件 -> 文件读取 -> 客户端写出 -> 服务端读取 -> 服务端写出 -> 服务端硬盘文件
2、相关代码的优化处理
A、服务端文件以毫秒值命名的处理问题
      long time = System.currentTimeMillis();
B、客户端通知服务器数据书写完毕 
      clickSocket.shutdownOutput();
3.1、客户端代码
  public static void main(String[] args) throws IOException {
        //-----[1]读取来自于文件当中的流,写入到网络-------
        FileInputStream fis = new FileInputStream("day10-code\\mdir\\03.jpg");
        Socket clientSocket = new Socket("192.168.34.36",6666);
        OutputStream os = clientSocket.getOutputStream();
        //写数据
        byte[] bytes = new byte[1024];
        int len;
        while ((len = fis.read(bytes))!=-1){
            os.write(bytes,0,len);
        }
        //----[2]需要加上核心代码,书写一个结束标记  Output--------
        clientSocket.shutdownOutput();
        //---[3]接收来自于服务器端的数据(自恢复一句话)------
        BufferedReader br = new BufferedReader(
                            new InputStreamReader(clientSocket.getInputStream()));
        String s = br.readLine();
        System.out.println(s);
        //---[4]释放资源------
        fis.close();
        clientSocket.close();
    }
3.2、服务端代码
 public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(1233);
        //---[1]准备两个流(服务器的输入,文件的输出)------
        //死循环优化
        while (true) {
            Socket clientSocket = serverSocket.accept();
            //没上传一次开启一个此线程,
            new Thread(()->{
                try {
                    upLuadFile(clientSocket);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }).start();

        }
    }

    private static void upLuadFile(Socket clientSocket) throws IOException {
        InputStream is = clientSocket.getInputStream();
        //增加一个毫秒值和随机数,确保不会有同名存在
        String x =System.currentTimeMillis()+new Random().nextInt(9999)+ ".jpg";
        FileOutputStream fos = new FileOutputStream("day11-code\\mdir\\"+x);
        //读写数据
        byte[] bytes = new byte[1024];
        int len;
        while ((len = is.read(bytes)) != -1) {
            fos.write(bytes, 0, len);
        }
        //---[2]返回数据给客户端--------
        OutputStream os = clientSocket.getOutputStream();
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
        bw.write("图片上传成功");
        bw.newLine();//换行
        bw.flush();//刷新
        //---[3]释放资源(本地流需要释放,客户端需要释放)------
        fos.close();
        clientSocket.close();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值