server
```
?System.out.println("服務器?啟動.....??"); ???????
?//?1.?創建服務端ServerSocket ??????
ServerSocket?serverSocket?=?new?ServerSocket(6666); ?? ??
//?2.?建立連接? ?????? ????????
Socket?accept?=?serverSocket.accept(); ??????
//?3.?創建流對象 ?? ??????
//?3.1?獲取輸入流,讀取文件數據 ?? ????????
BufferedInputStream?bis?=?new?BufferedInputStream(accept.getInputStream()); ???????
//?3.2?創建輸出流,保存到本地?.
?BufferedOutputStream?bos?=?new?BufferedOutputStream(new?FileOutputStream("copy.jpg"));
//?4.?讀寫數據? ??????? ????????
byte[]?b?=?new?byte[1024?*?8]; ???????
int?len; ????????
while?((len?=?bis.read(b))?!=?‐1)?{ ????????????
bos.write(b,?0,?len); ???????
?} ???????
//5.?關閉?資源 ????????
bos.close(); ???????
bis.close(); ????????
accept.close(); ????????
System.out.println("文件上傳已保存");
```
```
//?1.創建流對象 ????????
//?1.1?創建輸入流,讀取本地文件?? ?
BufferedInputStream?bis??=?new?BufferedInputStream(new?FileInputStream("test.jpg")); ???????
?//?1.2?創建輸出流,寫到服務端? ???????
?Socket?socket?=?new?Socket("localhost",?6666); BufferedOutputStream???bos???=?new?BufferedOutputStream(socket.getOutputStream()); ? ???????
?//2.寫出數據.? ?byte[]?b??=?new?byte[1024?*?8?]; ????????
int?len?;? ???????
?while?((?len??=?bis.read(b))!=‐1)?{ ????????????
bos.write(b,?0,?len); ????????????
bos.flush(); ???????
} ????????
System.out.println("文件發送完畢"); ??????
??//?3.釋放資源 ? ????????
bos.close();? ????????
socket.close();
bis.close();?
```
文件上傳優化
```
1. 文件名稱寫死的問題 服務端,保存文件的名稱如果寫死,那么最終導致服務器硬盤,只會保留一個文件,建議使用系統時間優 化,保證文件名稱唯一
FileOutputStream?fis?=?new?FileOutputStream(System.currentTimeMillis()+".jpg")?//?文件名稱
BufferedOutputStream?bos?=?new?BufferedOutputStream(fis);
```
```
2. 循環接收的問題 服務端,指保存一個文件就關閉了,之后的用戶無法再上傳,這是不符合實際的,使用循環改進,可以不斷 的接收不同用戶的文件,代碼如下:
//?每次接收新的連接,創建一個Socket
while(true){ ????Socket?accept?=?serverSocket.accept(); ????...... }
```
```
3. 效率問題 服務端,在接收大文件時,可能耗費幾秒鐘的時間,此時不能接收其他用戶上傳,所以,使用多線程技術優 化,代碼如下:
while(true){ ????
Socket?accept?=?serverSocket.accept(); ????
//?accept?交給子線程處理. ????
new?Thread(()?‐>?{ ?????? ...... ?? ????????InputStream?bis?=?accept.getInputStream(); ?????? ...... ?? ????}).start();
}
```
- 環境搭建
- JRE和JDK
- tomcat
- 問題
- maven
- 簡介
- IDEA
- 修改快捷鍵
- 快捷鍵
- java基礎
- 編譯運行
- 常量和變量
- JShell
- 數據類型
- 基本數據類型
- 整數
- 浮點數
- 字符
- 布爾
- 引用數據類型
- 類
- 數組
- 接口
- 常用類
- Object
- 簡介
- 方法
- getClass
- equals
- toString
- 日期時間
- Date
- DateFormat
- Calendar
- System
- currentTimeMillis
- arraycopy
- 字符串
- StringBuilder
- 包裝類
- 簡介
- 裝箱與拆箱
- 基本類型與字符串之間的轉換
- Arrays
- 集合
- 簡介
- 迭代器
- Collection
- List
- ArrayList
- Vector
- LinkedList
- Set
- HashSet
- LinkedSet
- Collections
- Map
- HashMap
- LinkedHashMap
- 泛型
- 泛型類
- 泛型方法
- 泛型接口
- 泛型通配符
- 異常
- Throwable
- Error
- 異常的處理
- 多線程
- 簡介
- Thread
- 簡介
- 創建線程
- 線程分類
- join
- 線程狀態
- 6種狀態
- 線程安全
- 買票問題
- 同步鎖
- 同步代碼塊
- 同步方法
- Lock鎖
- 死鎖
- Threadlocal
- 三大特性
- Java內存模型
- 簡介
- Volatile
- 線程通信
- 等待喚醒機制
- 例子
- 線程池
- 簡介
- Executor
- 例子
- File
- 構造方法
- IO
- 簡介
- 字節流
- 輸出流
- OutputStream
- FileOutputStream
- 輸入流
- InputStream
- FileInputStream
- 復制圖片
- 字符流
- 輸入流
- Reader
- FileReader
- 輸出流
- Writer
- FileWriter
- 緩沖流
- 簡介
- 字節緩沖流
- 字符緩沖流
- 轉換流
- 字符編碼和字符集
- InputStreamReader
- OutputStreamWriter
- 序列化
- 簡介
- ObjectOutputStream
- ObjectInputStream
- 打印流
- PrintStream
- 異常處理
- 屬性集
- 簡介
- 網絡編程
- Socket
- TCP
- 簡介
- 三次握手
- Socket
- ServerSocket
- 例子
- 上傳文件
- IO
- BIO
- NIO
- AIO
- 面向對象
- 類
- 簡介
- 定義
- static
- 抽象類
- 內部類
- 封裝
- 簡介
- final
- 權限修飾符
- 繼承
- super
- 多態
- 接口
- 單元測試
- 注解
- java提高
- 反射
- 簡介
- 獲取類
- 創建對象
- 例子
- 為私有屬性賦值
- Jdbc加載驅動
- JVM
- Java8新特性
- Lamdda
- 簡介
- 示例
- @FunctionalInterface
- Stream
- 設計模式
- 設計原則
- 設計模式
- 單例模式
- 簡介
- 餓漢式
- 懶漢式
- 靜態內部方式
- 枚舉方式
- 工廠模式
- 簡介
- 簡單工廠模式
- 工廠方法模式
- 代理模式
- 簡介
- 靜態代理
- 動態代理
- Jdk
- Cglib
- 區別
- 建造者模式
- 數據格式
- Protobuf
- 示例
- Student.proto
- 測試
- web基礎
- JDBC
- 簡介
- 核心類
- JDBCUtils
- 連接池
- Druid
- 簡介
- druid.properties
- JDBCUtils
- JDBCTemplate
- Servlet
- 簡介
- Servlet
- Servlet
- GenericServlet
- HttpServlet
- 常用框架
- Spring全家桶
- Spring
- 簡介
- 注解
- Autowired
- Value
- Scope
- PostConstruct
- PreDestroy
- Component
- Configuration
- Bean
- ComponentScan
- PropertySource
- Import
- IoC
- 簡介
- bean
- bean工廠
- bean創建
- 作用范圍
- 生命周期
- DI
- 簡介
- 方式
- 構造函數
- set方法
- 注解
- 注入集合
- 注解
- applicationContext.xml
- bean
- test
- 原理
- 如何創建Web環境中的IoC容器
- 源碼分析
- Aop
- 簡介
- 基礎
- 相關術語
- 切入點表達式
- 常用通知
- 實現原理
- 靜態代理
- JDK動態代理
- CGLIB動態代理
- 比較
- 事務
- 編程式事務
- 聲明式事務
- 例子
- xml
- pom
- bean.xml
- bean
- Logger
- test
- 注解
- bean.xml
- bean
- Logger
- 整合
- Spring之JDBC
- JdbcTemplate
- 三方DataSource
- DBCP
- C3P0
- Spring之事務
- 事務簡介
- 特性
- 事務并發問題
- 隔離級別
- 事務管理分類
- 編程式事務管理
- 聲明式事務管理
- xml
- 注解
- SpringMVC
- 簡介
- 常用注解
- @Controller
- @RequestMapping
- @RequstParam
- @PathVariable
- @RequestHeader
- @CookieValue
- @ModelAttribute
- @SessionAttribute
- @ResponseBody
- @RequestBody
- 獲取參數
- 攔截器
- 定義攔截器
- 配置攔截器
- SpringData
- 簡介
- SpringDataJpa
- 簡介
- 核心類
- Persistence
- EntityManagerFactory
- Entity
- 基本注解
- 關聯關系注解
- @JoinColumn
- @OneToOne
- EntityManager
- EntityTransaction
- Query
- 基礎查詢方法
- Repository
- CrudRepository
- PagingAndSortingRepository
- JpaRepository
- SimpleJpaRepository
- Jpql
- 簡介
- 操作
- maven
- 簡介
- 入門案例1
- 環境搭建
- 實體類
- 測試
- 入門案例2
- pom
- applicationContext.xml
- pojo
- dao
- test
- Springboot
- 入門案例
- pom
- application.yml
- 實體類
- dao
- test
- SpringDataRedis
- 簡介
- application.yml
- 使用
- SpringDataMongoDB
- 簡介
- mongodb-driver
- SpringDataMongoDB
- SpringScurity
- BCrypt
- 常見認證機制
- HTTP Base Auth
- Cookie Auth
- OAuth
- Token Auth
- JWT
- 簡介
- JJWT
- 簡介
- 入門案例
- pom
- 生成token
- 校驗token
- 自定義claims
- SpringCache
- 簡介
- ElasticSearch
- 簡介
- mybatis
- 簡介
- 基礎
- 核心類
- SqlSessionFactory
- SqlSession
- Executor
- MappedStatement
- 配置文件
- db.properties
- sqlMapConfig.xml
- Mapper.xml
- 關聯查詢
- 一對一
- resultType
- resultMap
- 一對多
- resultMap
- 動態sql
- if
- where
- sql片段
- foreach
- 緩存
- 簡介
- 一級緩存
- 二級緩存
- 增刪改查
- select
- insert
- update
- delete
- params
- provider
- 入門案例
- xml
- sqlMapConfig
- User
- xml方式
- UserMapper.xml
- test
- 代理方式(JDK)
- 規范
- UserMapper.xml
- UserMapper.class
- test
- springboot
- pom
- application.yml
- Person
- mapper
- App
- test
- Http
- HttpClient
- pom
- request
- 連接池
- RestTemplate
- 隊列
- ActiveMQ
- pom
- application.yml
- QueueConfig
- 生產者
- 消費者
- RabbitMQ
- 網絡編程
- netty
- 簡介
- 核心組件
- Channel
- EventLoop
- ChannelHandler
- 常用子類
- ChannelPipeline
- ChannelConfig
- Future
- ChannelFuture
- ByteBuf
- 簡介
- 案例
- Echo服務器
- EchoServer
- EchoServerHandler
- EchoClient
- EchoClientHandler
- Websocket
- pom
- Server
- WebsocketChannelInitalizer
- TextWebsocketFrameHandler
- Protobuf
- Server
- ProtobufChannelInitalizer
- ProtobufServerHandler
- lombok
- Springboot集成lombok
- 日志
- 定時任務
- cron表達式
- Spring自帶
- 任務
- 開啟
- Quartz
- 簡介
- pom
- Application
- config
- job
- controller
- Junit
- Spring整合Junit
- 爬蟲
- Jsoup
- 簡介
- 解析
- 解析URL
- 解析字符串
- 解析文件
- Document
- Element
- Selector
- WebMagic
- Protobuf
- 環境搭建
- Json
- Springboot
- 簡介
- 配置
- pom
- 常用注解
- RestController
- 整合
- JdbcTemplate
- pom
- application.properties
- UserService
- Mybatis
- pom
- application.properties
- UserMapper
- App
- Springjpa
- pom
- Person
- PersonDao
- App
- test
- 多數據源
- application.properties
- Lombok
- 安裝
- 依賴
- 實體類
- 常用注解
- EhCache
- 依賴
- chcache.xml
- UserMapper
- 清除緩存
- 開啟緩存
- 熱部署
- 簡介
- 依賴
- 監控管理
- Actuator
- 日志
- log4j
- pom
- log4j.properties
- test
- Aop方式
- pom
- WebLogAspect
- lombok
- application.yml
- logbok-spring.xml
- pom
- 使用
- 事務
- 簡介
- 分布式事務
- DBConfig
- 性能調優
- 組件自動掃描
- Servlet容器更換為Undernow
- Springboot jvm參數調優
- 全局處理
- 全局異常處理
- 攔截器
- 數據庫連接池
- 打包發布
- jar
- war
- 案例
- 入門案例
- SpringCloud
- 簡介
- Eureka
- 服務端
- pom
- application.yml
- EurekaApplication
- 高可用
- 用戶認證
- 客戶端
- pom
- application.yml
- EurekaClientApplication
- Ribbon
- pom
- application.yml
- Application
- RibbonConfig
- RibbonService
- RibbonController
- Feign
- pom
- application.yml
- Application
- config
- dao
- service
- controller
- Hystrix
- Sidecar
- pom
- application.yml
- Application
- Zuul
- pom
- application.yml
- Application
- 過濾器
- 類型
- 禁用過濾器
- 容錯與回退
- 高可用