案例——TCP上传图片
TCP上传图片
继续做一个TCP的相关案例,在客户端上传一张图片到服务端,服务端收到图片后,给客户端回馈上传成功信息。
实现细节:
- 对于一些文件的读取,若文件偏大,可以始用缓冲区去读取和写入,可以提高效率
- 服务端面向的是很多用户,所以必须要开线程来接收
- 如果同一个用户上传多张图片则有可能文件名重复,所以要对文件名做处理,具体在代码处有注释
- 客户端图片上传完成后需要给服务端发送结束信息,s.shutdownOutput();
就像是写入了一个终止符一样
客户端
需要在上传结束的时候写入终止符告诉服务端上传结束,可以双方约定一个终止的符号,也可以用shutdownOutput()方法来传递结束信息
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
public class UploadPicClient {
public static void main(String[] args) throws IOException {
System.out.println("上传图片客户端启动...");
//1、创建socket
Socket s = new Socket("127.233.24.3", 10018);
//2、读取源图片
File picFile = new File("D:\\forio\\download.jpg");
BufferedInputStream fis = new BufferedInputStream(new FileInputStream(picFile));
//3、目的:socket输出流,发送到服务端
OutputStream out = s.getOutputStream();
byte[] buf = new byte[1024];
int len = 0;
while((len = fis.read(buf)) != -1)
{
out.write(buf, 0, len);
}
//告诉服务端 图片发送完成,不要在等着读了
s.shutdownOutput();
//读取上传成功字样
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
String info = in.readLine();
System.out.println(info);
//关闭
fis.close();
s.close();
}
}
服务端
服务端需要多线程接收多个客户的上传信息,对于有可能存在的文件名重复,添加(1)(2)(3)...加以区分
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class UploadPicServer {
public static void main(String[] args) throws IOException {
System.out.println("上传图片服务端启动...");
// 创建ServerSocket
ServerSocket ss = new ServerSocket(10018);
while (true) {
// 获取客户端
Socket s = ss.accept();
// 实现多个客户端并发上传,服务器端必须启动做个线程来完成
new Thread(new UploadPic(s)).start();
}
}
}
class UploadPic implements Runnable {
private Socket s;
public UploadPic(Socket s) {
super();
this.s = s;
}
@Override
public void run() {
try {
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip + "connected...");
// 写图片数据到文件的输出流
File dir = new File("D:\\forio\\photo");
// 为了避免重名覆盖,通过给重名文件进行编号
int count = 1;
File picFile = new File(dir, ip + "(" + count + ")" + ".jpg");
while (picFile.exists()) {
count++;
picFile = new File(dir, ip + "(" + count + ")" + ".jpg");
}
FileOutputStream fos = new FileOutputStream(picFile);
// 读取客户端发来的数据
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = 0;
while ((len = in.read(buf)) != -1) {
fos.write(buf, 0, len);
}
// 给客户端一个回馈信息
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
out.write("上传成功!"); // 写完需要刷新一下,或者关闭流
// 关闭资源
out.close();
fos.close();
s.close();
} catch (Exception e) {
}
}
}
结果演示
案例——TCP上传图片的更多相关文章
- java网络之tcp
简单tcp传输 package pack; /* 演示tcp传输. 1,tcp分客户端和服务端. 2,客户端对应的对象是Socket. 服务端对应的对象是ServerSocket. 客户端, 通过查阅 ...
- 如何利用wireshark对TCP消息进行分析
原文:https://www.cnblogs.com/studyofadeerlet/p/7485298.html 如何利用wireshark对TCP消息进行分析 (1) 几个概念介绍 1 seq ...
- 19、网络编程 (Socket套接字编程)
网络模型 *A:网络模型 TCP/IP协议中的四层分别是应用层.传输层.网络层和链路层,每层分别负责不同的通信功能,接下来针对这四层进行详细地讲解. 链路层:链路层是用于定义物理传输通道,通常是对某些 ...
- struts—文件的上传和下载
设计了一个小的案例:上传图片到服务器,上传成功后显示图片列表,然后点击下载上传到服务器的图片. 注意表单的配置属性: <form enctype="multipart/Form-dat ...
- 网络编程3--毕向东java基础教程视频学习笔记
Day24 01 TCP上传图片02 客户端并发上传图片03 客户端并发登录04 浏览器客户端-自定义服务端05 浏览器客户端-Tomcat服务端 01 TCP上传图片 import java.net ...
- 黑马程序员——JAVA基础之网络编程
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 网络编程 网络模型:OSI参考模型和TCP/IP参考模型 网络通讯三要素: IP地址:InetA ...
- python中网络编程基础
一:什么是c\s架构 1.c\s即client\server 客户端\服务端架构. 客户端因特定的请求而联系服务器并发送必要的数据等待服务器的回应最后完成请求 服务端:存在的意义就是等待客户端的请求, ...
- centos 端口测试之nc使用
服务器端口测试是否正常,运维一般使用telnet来检查,但它有局限性,服务器的端口必须存在服务运行. 这时使用nc可以在服务端模拟开启一个端口,再通过nc测试此端口,好用! nc是netcat工具的简 ...
- netty通信
学习netty之前,要先了解操作系统中的IO.零拷贝(已经附上链接了) 一.netty的简单介绍 Netty 是由 JBOSS 提供的一个 Java 开源框架,现为 Github 上的独立项目. Ne ...
随机推荐
- Failed to execute goal on project e3-manager: Could not resolve dependencies for project cn.e3mall:e3-manager:pom:0.0.1-SNAPSHOT: Could not find artifact cn.e3mall:e3-parent:jar:0.0.1-SNAPSHOT
新建好工程后一定要记得从底层开始clean和install 在启动新建的工程时到最后一步出现了这个问题: Failed to execute goal on project e3-manager-we ...
- UGUI_游戏菜单场景切换
事件委托 GameManger(空物体)+GameManger脚本——重要的方式 public class GameManger : MonoBehaviour { public void OnSta ...
- STL容器(Stack, Queue, List, Vector, Deque, Priority_Queue, Map, Pair, Set, Multiset, Multimap)
一.Stack(栈) 这个没啥好说的,就是后进先出的一个容器. 基本操作有: stack<int>q; q.push(); //入栈 q.pop(); //出栈 q.top(); //返回 ...
- MAC sublime常用快捷键(慢慢补)
1、 FN + 左方向键:向左选择一行 2、FN + 右方向键:向右选择一行 3、FN + 上方向键:跳到页头 4、FN + 下方向键:跳到页尾 5、FN + SHIFT + 左方向键|上方向键:从当 ...
- 利用kubeadm快速部署 kubernetes 集群
结合一下两个教程 https://www.cnblogs.com/along21/p/10303495.html 链接:https://pan.baidu.com/s/1O_pcywfso4VFOsF ...
- Postman工具使用-接口测试(实战一)
写在前面,本文首发[简书]https://www.jianshu.com/p/c188624c3580 作为一名测试人员,要去思考一下,如何能按需完成任务,又能轻松解决问题,这就很重要了!!! 凡事皆 ...
- SpringBoot起飞系列-入门(一)
一.SpringBoot简介 1.1 什么是SpringBoot 说到spring系列,可能大家都很熟悉,spring.springmvc,美之名曰:spring全家桶,那么springboot其实也 ...
- ZooKeeper的ACL实现源码阅读
什么是ACL(Access Control List) zookeeper在分布式系统中承担中间件的作用,它管理的每一个节点上可能都存储这重要的信息,因为应用可以读取到任意节点,这就可能造成安全问题, ...
- 2019年9月末周java面试总结
不知不觉离职已经2个月了,这周开始投简历找工作,本来也做好了被打击的心理准备了,毕竟这么久没敲代码,也没怎么准备,基本上是属于裸面. 总结一下简历投递情况: 不知道是简历写得太敷衍,还是要求太高,总之 ...
- Mycat 配置文件rule.xml
rule.xml配置文件定义了我们对表进行拆分所涉及到的规则定义.我们可以灵活的对表使用不同的分片算法,或者对表使用相同的算法但具体的参数不同. 该文件里面主要有tableRule和function这 ...