Java 学习笔记 网络编程 使用Socket传输文件 CS模式
Socket的简单认识
Socket是一种面向连接的通信协议,Socket应用程序是一种C/S(Client端/Server端)结构的应用程序
Socket是两台机器间通信的端点。
Socket是连接运行在网络上的两个程序间的双向通讯端点。
Socket通信原理

- Server服务端的输入流相当于Client客户端的输出流
- Server服务端的输出流相当于Client客户端的输入流
注意
- 文件传输使用字节流(Steam)
- 使用
DataOutputStream,DataOutputStream可以传java的基本类型和流
代码
Server.java
package csmode2;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author StarsOne
* @date Create in 2019-4-14 0014 10:53:58
* @description
*/
class Server {
public static void main(String[] args) {
try (ServerSocket serverSocket = new ServerSocket(9090)){
System.out.println("服务器已启动...");
while (true) {
System.out.println("等待接收文件");
//调用了accept方法之后,会一直处于等待接受文件的状态
Socket socket = serverSocket.accept();//接收客户端传来的数据
//交给后台线程处理
new AcceptThread(socket.getInputStream()).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
AcceptThread.java
package csmode2;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* @author StarsOne
* @date Create in 2019/4/15 0015 14:17
* @description
*/
class AcceptThread extends Thread {
private InputStream inputStream;
public AcceptThread(InputStream inputStream) {
this.inputStream = inputStream;
}
@Override
public void run() {
try {
//使用DataInputStream包装输入流
DataInputStream dataInputStream = new DataInputStream(inputStream);
String fileName = dataInputStream.readUTF();
System.out.println(fileName);//在控制台显示文件名
//往某个位置写入文件
FileOutputStream fileOutputStream = new FileOutputStream("Q:\\MY" + File.separator + fileName);
int c = -1;
while ((c = dataInputStream.read()) != -1) {
fileOutputStream.write(c);
fileOutputStream.flush();
}
System.out.println("文件上传成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
Client.java
package csmode2;
import java.io.*;
import java.net.Socket;
/**
* @author StarsOne
* @date Create in 2019-4-14 0014 10:53:49
* @description
*/
class Client {
public static void main(String[] args) {
// File[] files = new File("E:\\wan\\testfile").listFiles();
//如果是多个文件,只需要把文件放入一个list或者数组中,使用for循环把数组的文件全部上传到服务器
//上传的文件
File file = new File("R:\\动漫图片\\test.jpg");
try(Socket socket = new Socket("localhost", 9090)) {
OutputStream outputStream = socket.getOutputStream();
//使用DataOutputStream
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
//向服务器端传文件名
dataOutputStream.writeUTF(file.getName());
dataOutputStream.flush();//刷新流,传输到服务端
//向服务器端传文件,通过字节流
//字节流先读取硬盘文件
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file));
int c = -1;
while ((c=bufferedInputStream.read())!=-1) {
//将读取的文件以字节方式写入DataOutputStream,之后传输到服务端
//这里也可以使用byte[]数据进行读取和写入
dataOutputStream.write(c);
dataOutputStream.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Java 学习笔记 网络编程 使用Socket传输文件 CS模式的更多相关文章
- Java学习笔记-网络编程
Java提供了网络编程,并且在实际中有着大量运用 网络编程 网络编程概述 网络模型 OSI参考模型 TCP/IP参考模型 网络通讯要素 IP地址 端口号 传输协议 网络参考模型 网络通讯要素 IP地址 ...
- java学习笔记 --- 网络编程(套接字)
1.Socket通信原理 Socket套接字概述: 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字. 通信的两端都有Socket. 网络通信其实就是Socket间的通信 ...
- java学习笔记 --- 网络编程(网络的基础知识)
1.网络模型: |--OSI(open stystem Interconnection开放式系统互连) |--特点: 是一种异构系统互连的分层结构:提供了控制互连系统交互规则的标准骨架:定义一种抽象结 ...
- Android网络编程只局域网传输文件
Android网络编程之局域网传输文件: 首先创建一个socket管理类,该类是传输文件的核心类,主要用来发送文件和接收文件 具体代码如下: package com.jiao.filesend; im ...
- Java学习之网络编程实例
转自:http://www.cnblogs.com/springcsc/archive/2009/12/03/1616413.html 多谢分享 网络编程 网络编程对于很多的初学者来说,都是很向往的一 ...
- Java学习:网络编程总结
Java网络编程总结 一.概述 计算机网络是通过传输介质.通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来,实现资源共享和数据传输的系统.网络编程就就是编写程序使联网的两个(或多个)设备( ...
- Java学习之网络编程
转自:http://blog.csdn.net/driverking/article/details/6573992 一.网络编程基本概念 1.OSI与TCP/IP体系模型 2.IP和端口 解决了文章 ...
- Java 学习之网络编程案例
网络编程案例 一,概念 1,网络编程不等于网站编程 2,编程只和传输层打交道,即TCP和UDP两个协议 二,案例 1,TCP实现点对点的聊天 Server端:两个输入流:读客户端和控制台,一个输出端: ...
- java 学习笔记——网络(Socket)
阅读方法:将网页放大到200%. 如果你用过用过word应该知道按住ctrl键使用鼠标滚轮缩放.
随机推荐
- Linux 系统中的内部与外部命令
linux中的命令大致可分为两类,内部命令和外部命令: 内部命令(builtin command):也称shell内嵌命令 外部命令(external command):存放在一个文件中,使用时需要去 ...
- 使用abcpdf分页设置的问题
如果需要在分页时不对模块进行截断,请为相应模块添加打印样式“page-break-inside: avoid” 如果需要在指定位置进行强制分页,请添加:“<div style="pag ...
- 让MEF插上AOP的翅膀
什么是MEF Git:https://github.com/MicrosoftArchive/mef MEF也是一款ioc框架,貌似历史比较悠久了. 这里有一篇.net阵容里面主流ioc比较. htt ...
- 一个月薪两万的Web安全工程师要掌握哪些技能?
作为一个薪水两万起步的工作,我想知道这些牛人们都会哪些技能呢? Web安全相关概念.熟悉渗透相关工具.渗透实战操作.关注安全圈动态.熟悉Windows/Kali Linux.服务器安全配置.脚本编程学 ...
- MYSQL手册
原文出处:http://www.cnblogs.com/gaofei-1/p/7152875.html MySQL配置文件 MySQL软件使用的配置文件名为my.ini,在安装目录下. MySQL常用 ...
- [Swift]LeetCode688. “马”在棋盘上的概率 | Knight Probability in Chessboard
On an NxN chessboard, a knight starts at the r-th row and c-th column and attempts to make exactly K ...
- 代码覆盖率 (Code Coverage)从简到繁 (一)
代码覆盖率(Code Coverage)是反映测试用例对被测软件覆盖程度的重要指标,也是衡量测试工作进展情况的重要指标.它也是对测试工作进行量化的重要指标之一,测试工作往往不如开发那样激动人心,一个重 ...
- 【Impala篇】---Hue从初始到安装应用
一.前述 Cloudera公司推出,提供对HDFS.Hbase数据的高性能.低延迟的交互式SQL查询功能.基于Hive使用内存计算,兼顾数据仓库.具有实时.批处理.多并发等优点 是CDH平台首选的PB ...
- BBS论坛(十三)
13.1点击更换图形验证码 (1)front/signup.html <div class="form-group"> <div class="inpu ...
- java多线程(7)---Condition
Condition 一.Condition概述 在线程的同步时可以使一个线程阻塞而等待一个信号,同时放弃锁使其他线程可以能竞争到锁. 在synchronized中我们可以使用Object的wait() ...