程序功能:

客户端向服务器发送一个本地磁盘中的文件, 服务器程序接受后保存在其他位置.

客户端实现步骤:

  1. 创建一个客户端对象Socket,构造方法中绑定服务器的IP地址 和 端口号
  2. 使用Socket对象中的方法 getOutputSteam()获取网络字节输出流OutputStream对象
  3. 使用字节输出流OutputStream对象中的write()方法,给服务器发送数据
  4. 使用Socket对象中的getInputStream()获取网络字节输入流InputStream()对象  
  5. 使用网络字节输入流InputStream对象中的read()方法,读取服务器回写的数据.
  6. 释放Socket资源.
  1. import java.io.*;
  2. import java.net.Socket;
  3.  
  4. public class TCPClient {
  5. public static void main(String[] args) throws IOException {
  6. //1.创建一个客户端对线Socket,构造方法中绑定服务器的IP地址和端口号
  7. Socket socket = new Socket("127.0.0.1",8888);
  8. // Socket socket = new Socket("192.168.15.132",8888);
  9. //2.使用Socket对象中的方法getOutputStream(0获取网络字节输出流OutputSteam对象
  10. //这个流是个网络流,指向了服务器
  11. OutputStream os = socket.getOutputStream();
  12. File f = new File("E:\\图片\\桌面图片\\宋民国\\222.jpg");
  13. FileInputStream fis = new FileInputStream(f);
  14. byte[] bs = new byte[1024];
  15. int len;
  16. while((len=fis.read(bs))!=-1)
  17. {
  18. //3.使用字节输出流OutputSteam对象中的方法write,给服务器发送数据
  19. os.write(bs,0,len);
  20. }
  21. //告诉服务器关闭输出
  22. socket.shutdownOutput();
  23. fis.close();
  24.  
  25. //4.使用Socket对象中的方法getInputSteam()获取网络字节输入流InputSteam()对象
  26. InputStream is = socket.getInputStream();
  27. //5.使用网络字节输入流InputSteam对象中的方法read,读取服务器回写的数据
  28. byte[] list = new byte[1024];
  29. int len1 = is.read(list);
  30. String str1 = new String(list,0,len1);
  31. //6.释放资源(Socket)
  32. System.out.println(str1);
  33. socket.close();//只用关socket就行了
  34.  
  35. }
  36. }

服务器端实现步骤:

  1. 创建一个服务器对ServerSocket对象和指定的端口号一致.
  2. 使用ServerSocket对象中的accept方法,获取请求的客户端对象Socket
  3. 使用Socket对象中的getInputSream()方法
  4. 使用网络字节输入流InputStream对象中的read()方法
  5. 使用Socket对象中的getoutputStream()方法
  6. 使用网络字节输出流OutputSteam对象中的write()方法
  7. 释放资源.
  1. import java.io.*;
  2. import java.net.ServerSocket;
  3. import java.net.Socket;
  4. import java.util.Random;
  5.  
  6. public class TCPServer {
  7. public static void main(String[] args) throws IOException {
  8.  
  9. //method01();
  10. method02();
  11.  
  12. }
  13. public static void method02() throws IOException{
  14. // 1.创建一个服务器对ServerSocket对象和指定的端口号要一致.
  15. ServerSocket serverSocket = new ServerSocket(8888);
  16. while(true) {
  17. //2.使用ServerSocket对象中的的方法accept,获取到请求的客户端对象Scoket
  18. // 创建多线程,提高可以同时与多个客户端进行数据的传输,提高效率
  19. Socket socket = serverSocket.accept();//阻塞(如果没有客户端连接,程序会停止在这个地方)
  20. new Thread(() -> {
  21. try {
  22. //获得客户端Socket对象
  23. //给保存的文件设置随机名,避免覆盖
  24. long time = System.currentTimeMillis();
  25. //3.使用Socket对象中的方法getInputSteam() 获得输入流
  26. InputStream is = socket.getInputStream();
  27. FileOutputStream fos = new FileOutputStream(new File("C:\\123\\123", time + ".jpg"));
  28. byte[] list = new byte[1024];
  29. int len;
  30. //4.使用网络字节输入流InputStream对象中的read()方法
  31. while ((len = is.read(list)) != -1) {
  32. fos.write(list, 0, len);
  33. }
  34. fos.close();
  35. //5. 使用Socket对象中的getoutputStream()方法获得输出流
  36. OutputStream os = socket.getOutputStream();
  37. //6.使用网络字节输出流OutputSteam对象中的write()方法
  38. os.write("你好,图片传输完毕".getBytes());
  39.  
  40. //7. 释放资源
  41. socket.close();
  42. } catch (IOException e) {
  43. e.printStackTrace();
  44. }
  45. }).start();
  46.  
  47. }
  48. }
  49. public static void method01() throws IOException {
  50.  
  51. //1.创建一个服务器对ServerSocket对象和系统指定的端口号要一致.
  52. ServerSocket server = new ServerSocket(8888);
  53. /*让服务器一直处于监听状态(死循环accept方法)
  54. * 有一个客户端上传文件,就保存一个文件.
  55. * */
  56. while (true){
  57. /* 在步骤1 与 步骤2 之间会卡主, 等待客户端连接,连接了才会进行下一步*/
  58.  
  59. //2.使用ServerSocket对象中的的方法accept,获取到请求的客户端对象Scoket
  60. Socket socket = server.accept();
  61.  
  62. //3.使用Socket对象中的方法getInputSteam()
  63. // 得到一个输入流,该输入流就可以调用read()方法
  64. InputStream is = socket.getInputStream();
  65. // 4.使用网络字节输入流InptuSteam对象中的read
  66.  
  67. //文件夹 在是定文件夹下创建文件
  68. File dir = new File("C:\\123\\123");
  69. /* //自动生成一个时间戳,自动生成文件名,利用毫秒值当做文件名
  70. * 用System.currentTimeMilis()方法获取当前系统的毫秒值,
  71. * 再加上一个随机数. 保证文件名是不重复的.
  72. * */
  73. long time = System.currentTimeMillis();
  74. String filename =time+new Random().nextInt(1000)+"";
  75. /*如果该文件夹不存在,则生成这个文件夹*/
  76. if(!dir.exists()){
  77. dir.mkdirs();
  78. }
  79. /**/
  80. FileOutputStream fos = new FileOutputStream(new File(dir,filename+".jpg"));
  81.  
  82. // FileOutputStream fos = new FileOutputStream(destination);
  83. byte[] bs = new byte[1024];
  84. int len;
  85. while((len=is.read(bs))!=-1)
  86. {
  87. fos.write(bs,0,len);
  88. }
  89. //告诉
  90. fos.close();
  91.  
  92. //5.使用Socket对象中的方法 getoutputSteam 回写 收到了就谢谢.
  93. //利用网络指向客户端.往客户端回写数据.
  94. OutputStream os = socket.getOutputStream();
  95. //都是字节流,转换为字节再写回去.
  96. os.write("收到谢谢".getBytes());
  97. /*socket.close();
  98.  
  99. server.close();*/
  100.  
  101. }
  102.  
  103. }
  104. }

运行结果:

JAVA实现C/S结构小程序的更多相关文章

  1. Java生鲜电商平台-小程序或者APP优惠券的设计与源码实战

    Java生鲜电商平台-小程序或者APP优惠券的设计与源码实战 说明:Java生鲜电商平台-小程序或者APP优惠券的设计与源码实战,优惠券是一种常见的促销方式,在规定的周期内购买对应商品类型和额度的商品 ...

  2. Java生鲜电商平台-小程序或者APP拼团功能设计与架构实战

    Java生鲜电商平台-小程序或者APP拼团功能设计与架构实战 说明:Java生鲜电商平台拼团是拉新引流的利器,将拼团运用到极致的就是拼多多,前期通过选取性价比高.实用性强的商品进行拼团,在社交圈(主要 ...

  3. java多线程实现卖票小程序

    package shb.java.demo; /** * 多线程测试卖票小程序. * @Package:shb.java.demo * @Description: * @author shaobn * ...

  4. 基于JAVA网络编程的聊天小程序

    package com.neusoft.edu.socket; import java.io.BufferedReader; import java.io.IOException; import ja ...

  5. appium+java(五)微信小程序自动化测试实践

    前言: 上一篇<appium+java(四)微信公众号自动化测试实践>中,尝试使用appium实现微信公众号自动化测试,接着尝试小程序自动化,以学院小程序为例 准备工作 1.java-cl ...

  6. java实现课堂随机点名小程序

    通过jdbc连接数据库实现读取学生花名册进行随机点名! ~jdbc连接mysql数据库  ||  注释部分代码可通过读取.txt文档实现显示学生信息 ~通过点击开始按钮实现界面中间标签不断更新学生信息 ...

  7. java服务端实现微信小程序内容安全

    请参考微信官方文档:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/sec-check/security.i ...

  8. 统计文件夹下java代码行数的小程序--主要是学习任务队列的思想

    首先感谢czbk的老师,录制的视频,让我们有这么好的学习资料.……—— 统计文件夹java文件的行数,首先想到的肯定是用递归的方法,因为文件夹下面可能包含文件夹,用递归的方法,代码容易写.(这和写简单 ...

  9. 微信小程序学习笔记(2)--------框架之目录结构

    框架提供了自己的视图层描述语言 wxml 和 WXSS,以及基于 JavaScript 的逻辑层框架,并在视图层与逻辑层间提供了数据传输和事件系统. 一.响应的数据绑定 框架的核心是一个响应的数据绑定 ...

随机推荐

  1. Boosting Static Representation Robustness for Binary Clone Search against Code Obfuscation and Compiler Optimization(二)

    接着上篇Asm2Vec神经网络模型流程继续,接下来探讨具体过程和细节. 一.为汇编函数建模  二.训练,评估   先来看第一部分为汇编函数建模,这个过程是将存储库中的每一个汇编函数建模为多个序列.由于 ...

  2. LeetCode算法题-Sum of Square Numbers(Java实现)

    这是悦乐书的第276次更新,第292篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第144题(顺位题号是633).给定一个非负整数c,判断是否存在两个整数a和b,使得a的 ...

  3. maven 出现错误 -source 1.5 中不支持 diamond 运算符

    mvn clean package -DskipTests 出现如下错误: -source 1.5 中不支持 diamond 运算符 [ERROR] (请使用 -source 7 或更高版本以启用 d ...

  4. [LeetCode] 9. 回文数

    题目链接:https://leetcode-cn.com/problems/palindrome-number/ 题目描述: 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都 ...

  5. springMVC第二天——高级参数绑定与其它特性

    大纲摘要: 1.高级参数绑定 a) 数组类型的参数绑定 b) List类型的绑定 2.@RequestMapping注解的使用 3.Controller方法返回值 4.Springmvc中异常处理 5 ...

  6. Windows安装Git

    一.安装Git for Windows(又名msysgit)  下载地址: https://git-for-windows.github.io/  在官方下载完后,安装到Windows Explore ...

  7. .NET Core 实现 Redis 批量查询指定格式的Key

    一. 问题场景 Redis 作为当前最流行的内存型 NoSQL 数据库,被许多公司所使用,作为分布式缓存.我们在实际使用中一般都会为 key 带上指定的前缀或者其他定义的格式.当由于我们程序出现bug ...

  8. sass的使用

    1.声明变量-全局声明-局部声明 中划线或下划线两种用法相互兼容  $nav-color: #F90; $highlight-border: 1px solid $nav-color;  nav{ $ ...

  9. iOS 钥匙串存储用户数据

    参考: http://www.jianshu.com/p/f6d40065bb6c #import <Foundation/Foundation.h> #import <Securi ...

  10. 安装VM-tools

    win10系统 VMware12 Ubuntu64位安装VM-tools时所遇到的提示信息: open-vm-tools are available from the OS vendor and VM ...