程序功能:

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

客户端实现步骤:

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

服务器端实现步骤:

  1. 创建一个服务器对ServerSocket对象和指定的端口号一致.
  2. 使用ServerSocket对象中的accept方法,获取请求的客户端对象Socket
  3. 使用Socket对象中的getInputSream()方法
  4. 使用网络字节输入流InputStream对象中的read()方法
  5. 使用Socket对象中的getoutputStream()方法
  6. 使用网络字节输出流OutputSteam对象中的write()方法
  7. 释放资源.
 import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random; public class TCPServer {
public static void main(String[] args) throws IOException { //method01();
method02(); }
public static void method02() throws IOException{
// 1.创建一个服务器对ServerSocket对象和指定的端口号要一致.
ServerSocket serverSocket = new ServerSocket(8888);
while(true) {
//2.使用ServerSocket对象中的的方法accept,获取到请求的客户端对象Scoket
// 创建多线程,提高可以同时与多个客户端进行数据的传输,提高效率
Socket socket = serverSocket.accept();//阻塞(如果没有客户端连接,程序会停止在这个地方)
new Thread(() -> {
try {
//获得客户端Socket对象
//给保存的文件设置随机名,避免覆盖
long time = System.currentTimeMillis();
//3.使用Socket对象中的方法getInputSteam() 获得输入流
InputStream is = socket.getInputStream();
FileOutputStream fos = new FileOutputStream(new File("C:\\123\\123", time + ".jpg"));
byte[] list = new byte[1024];
int len;
//4.使用网络字节输入流InputStream对象中的read()方法
while ((len = is.read(list)) != -1) {
fos.write(list, 0, len);
}
fos.close();
//5. 使用Socket对象中的getoutputStream()方法获得输出流
OutputStream os = socket.getOutputStream();
//6.使用网络字节输出流OutputSteam对象中的write()方法
os.write("你好,图片传输完毕".getBytes()); //7. 释放资源
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}).start(); }
}
public static void method01() throws IOException { //1.创建一个服务器对ServerSocket对象和系统指定的端口号要一致.
ServerSocket server = new ServerSocket(8888);
/*让服务器一直处于监听状态(死循环accept方法)
* 有一个客户端上传文件,就保存一个文件.
* */
while (true){
/* 在步骤1 与 步骤2 之间会卡主, 等待客户端连接,连接了才会进行下一步*/ //2.使用ServerSocket对象中的的方法accept,获取到请求的客户端对象Scoket
Socket socket = server.accept(); //3.使用Socket对象中的方法getInputSteam()
// 得到一个输入流,该输入流就可以调用read()方法
InputStream is = socket.getInputStream();
// 4.使用网络字节输入流InptuSteam对象中的read //文件夹 在是定文件夹下创建文件
File dir = new File("C:\\123\\123");
/* //自动生成一个时间戳,自动生成文件名,利用毫秒值当做文件名
* 用System.currentTimeMilis()方法获取当前系统的毫秒值,
* 再加上一个随机数. 保证文件名是不重复的.
* */
long time = System.currentTimeMillis();
String filename =time+new Random().nextInt(1000)+"";
/*如果该文件夹不存在,则生成这个文件夹*/
if(!dir.exists()){
dir.mkdirs();
}
/**/
FileOutputStream fos = new FileOutputStream(new File(dir,filename+".jpg")); // FileOutputStream fos = new FileOutputStream(destination);
byte[] bs = new byte[1024];
int len;
while((len=is.read(bs))!=-1)
{
fos.write(bs,0,len);
}
//告诉
fos.close(); //5.使用Socket对象中的方法 getoutputSteam 回写 收到了就谢谢.
//利用网络指向客户端.往客户端回写数据.
OutputStream os = socket.getOutputStream();
//都是字节流,转换为字节再写回去.
os.write("收到谢谢".getBytes());
/*socket.close(); server.close();*/ } }
}

运行结果:

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. LeetCode算法题-Binary Search(Java实现)

    这是悦乐书的第297次更新,第316篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第165题(顺位题号是704).给定n个元素的排序(按升序)整数数组nums和目标值,编 ...

  2. topjui中combobox使用

    1.创建combobox的方法 常用的一种是通过Js定义,一种是通过在input输入框中定义,还有一种通过在selete标签中定义,可以去看easyui的官方文档 http://www.jeasyui ...

  3. SSRS----关于图表参考线(平均线)的添加

    在开发报表的时候,遇到了一个问题,客户需要在气泡图上添加水平和竖直两条平均线(结果参考如下图). 个人知识背景 一般添加参考线本身是有一个相关的设置的,但一般都是相对于Y值,即平行于X轴的.用类似的方 ...

  4. Managing Large State in Apache Flink®: An Intro to Incremental Checkpointing

    January 23, 2018- Apache Flink, Flink Features Stefan Richter and Chris Ward Apache Flink was purpos ...

  5. tqdm介绍及常用方法

    Tqdm 是一个快速,可扩展的Python进度条,可以在 Python 长循环中添加一个进度提示信息,用户只需要封装任意的迭代器 tqdm(iterator). 使用pip就可以安装. Tqdm 是一 ...

  6. dotnetcore ueditor

    dotnetcore ueditor  https://github.com/durow/ueditornetcore http://www.cnblogs.com/durow/p/6116393.h ...

  7. InheritedWidget

    下面这个示例是InheritedWidgt的一个简单用法: class CounterProvider extends InheritedWidget{//数据之前必须加上final,下面这三个数据都 ...

  8. L1-8 矩阵A乘以B (15 分)

    给定两个矩阵A和B,要求你计算它们的乘积矩阵AB.需要注意的是,只有规模匹配的矩阵才可以相乘.即若A有R​a​​行.C​a​​列,B有R​b​​行.C​b​​列,则只有C​a​​与R​b​​相等时,两 ...

  9. ZJOI2019做题笔记

    麻将(期望.DP套DP) 先考虑如何计算一个子集是否能胡. 设\(f_{i,0/1,j,k}\)表示考虑了子集中\(1 \sim i\)的牌,是否找到对子,\(i-1,i,i+1\)预计拿\(j\)个 ...

  10. Python变量的本质与intern机制

    变量的存储 a = 'abc' 理解:①先在内存中生成一个字符串‘abc’ ②可以把比变量名a看做一个便利贴,然后将a贴到‘abc’中     ③注意顺序,是生成‘abc’,然后再创建a指向‘abc’ ...