Java网络编程——TCP图片上传
1、编写一个服务器端程序,用来接收图片。创建一个监听指定端口号的ServerSocket服务端对象,在while(true)无限循环中持续调用ServerSocket的accept()方法来接收客户端的请求,每当和一个客户端建立连接后,就开启一个新的线程和这个客户端进行交互。在处理文件上传功能的ServerThread线程管理类中,先进行客户端文件上传保存处理,确定了文件保存目录和文件命名方式,然后进行保存处理,最后又通过客户端输出流,向客户端输出“上传成功”的信息进行响应。从运行结果可以看出,服务器端进入阻塞状态,等待客户端连接。

相关代码
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
class ServerThread implements Runnable {
private Socket socket;
public ServerThread(Socket socket) {
this.socket = socket;
}
public void run() {
String ip = socket.getInetAddress().getHostAddress();
int count = 1;
try {
File parentFile = new File("D:\\upload\\");
if (!parentFile.exists()) {
parentFile.mkdir();
}
File file = new File(parentFile, ip + "(" + count + ").jpg");
while (file.exists()) {
file = new File(parentFile, ip + "(" + (count++) + ").jpg");
}
InputStream in = socket.getInputStream();
FileOutputStream fos = new FileOutputStream(file);
byte[] buf = new byte[1024];
int len = 0;
while ((len = in.read(buf)) != -1) {
fos.write(buf, 0, len);
}
OutputStream out = socket.getOutputStream();
out.write("上传成功".getBytes());
in.close();
fos.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class UploadTCPServer {
public static void main(String[] args) throws Exception {
@SuppressWarnings("resource")
ServerSocket serverSocket = new ServerSocket(10001);
while (true) {
Socket client = serverSocket.accept();
new Thread(new ServerThread(client)).start();
}
}
}
2、创建了Socket对象,指定连接服务器的IP地址和端口号,然后分别通过Socket的输出流对象向服务端上传图片和输入流对象获取服务端响应信息。其中,向服务端上传的源图片地址为D:\1.jpg,即D盘根目录下的1.jpg图片,在上传之前一定要确保图片存在。另外,在向服务端上传完毕图片后要调用Socket的shutDownOutput()方法。关闭客户端的输出流。

相关代码
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
public class UploadTCPClient {
public static void main(String[] args) throws Exception {
Socket client = new Socket(InetAddress.getLocalHost(),10001);
OutputStream out = client.getOutputStream();
FileInputStream fis = new FileInputStream("D:\\1.jpg");
byte[] buf = new byte[1024];
int len= 0;
System.out.println("连接到服务器端,开始文件上传!");
while ((len = fis.read(buf)) != -1) {
out.write(buf, 0, len);
}
client.shutdownOutput();
InputStream is = client.getInputStream();
byte[] bufMsg= new byte[1024];
int len2 = is.read(bufMsg);
while (len2 != -1){
System.out.println(new String(bufMsg, 0, len2));
len2 = is.read(bufMsg);
}
out.close();
is.close();
fis.close();
client.close();
}
}
3、运行结果如下:


Java网络编程——TCP图片上传的更多相关文章
- java网络编程之图片上传
输入输出流核心代码 所有的文件传输都是靠流,其中文件复制最具代表性.输入流和输出流,从输入流中读取数据写入到输出流中. InputStream in = 输入源; OutputStream os = ...
- AFNetworking网络请求与图片上传工具(POST)
AFNetworking网络请求与图片上传工具(POST) .h文件 #import <Foundation/Foundation.h> /** 成功Block */ typedef vo ...
- java网络编程TCP传输—流操作—拿到源后的写入动作
在网络编程中的TCP传输里,拿到Socket的源后,应该怎么进行读写操作呢,下面我列举了两种方法,希望大家帮忙补充···· 1.利用byte数组作为一个缓冲区进行读写 客户端上传 //获取socket ...
- Java网络编程(TCP协议-练习-上传文本文件)
客户端: package WebProgramingDemo; import java.io.BufferedReader; public class UploadTextClient { /** * ...
- Android利用网络编程HttpClient批量上传(一个)
请尊重他人的劳动成果.转载请注明出处:Android网络编程之使用HttpClient批量上传文件 我曾在<Android网络编程之使用HTTP訪问网络资源>一文中介绍过HttpCient ...
- Android利用网络编程HttpClient批量上传(两)AsyncTask+HttpClient监测进展情况,并上传
请尊重别人的劳动.转载请注明出处: Android网络编程之使用HttpClient批量上传文件(二)AsyncTask+HttpClient并实现上传进度监听 执行效果图: 我曾在<Andro ...
- java 网络编程-tcp/udp
--转自:http://blog.csdn.net/nyzhl/article/details/1705039 直接把代码写在这里,解释看这里吧:http://blog.csdn.net/nyzhl/ ...
- java网络编程(TCP详解)
网络编程详解-TCP 一,TCP协议的特点 面向连接的协议(有发送端就一定要有接收端) 通过三次连接握手建立连接 通过四次握手断开连接 基于IO流传输数据 传输数据大小 ...
- Java网络编程のTCP/IP
TCP/IP参考模型和TCP/IP协议 与OSI参考模型相似,TCP/IP参考模型汲取了网络分层的思想,而且对网络的层次做了简化,并在网络各层都提供了完善的协议,这些协议构成了TCP/IP协议集,简称 ...
随机推荐
- Java JDBC学习实战(二): 管理结果集
在我的上一篇博客<Java JDBC学习实战(一): JDBC的基本操作>中,简要介绍了jdbc开发的基本流程,并详细介绍了Statement和PreparedStatement的使用:利 ...
- 洛谷P2486 [SDOI2011]染色 题解 树链剖分+线段树
题目链接:https://www.luogu.org/problem/P2486 首先这是一道树链剖分+线段树的题. 线段树部分和 codedecision P1112 区间连续段 一模一样,所以我们 ...
- Python--day26--反射
反射对象的属性:(非常重要) getattr(类名,‘属性名’):获得属性值 使用getattr的好处:需要查看某个属性值的时候,不用再在代码中用if else elif 去判断输入(input函数) ...
- redis_Cacha 爬虫链接redis配置文件
import redisimport json class RedisCache(object): """ 使用redis进行爬虫结果的缓存,并可以进行增量爬取 &quo ...
- 2018-2-13-wpf-使用-Dispatcher.Invoke-冻结窗口
title author date CreateTime categories wpf 使用 Dispatcher.Invoke 冻结窗口 lindexi 2018-2-13 17:23:3 +080 ...
- 【ts】 VSCode自动编译TypeScript终端报错
一.点击终端--运行任务--选择tsc:监视 - tsconfig.json后,终端报出了如下错误:error TS5058: The specified path does not exist 在网 ...
- tf.train.slice_input_producer()
tf.train.slice_input_producer处理的是来源tensor的数据 转载自:https://blog.csdn.net/dcrmg/article/details/7977687 ...
- 超容易理解的call()、apply()、bind()的区别
call().apply().bind()是用来改变this的指向的. 一 举个例子 一个叫喵喵的猫喜欢吃鱼,一个叫汪汪的小狗喜欢啃骨头,用代码实现如下: 有一天,小狗汪汪和喵喵共进午餐的时候,汪汪说 ...
- ASP.NET MVC4.0+EF+LINQ+bui+bootstrap+网站+角色权限管理系统(3)
接下来完成用户.角色的增删查改,以及用户角色.权限的设置 对用户表.角色表做了一些扩展如下[可以更加自己需要增减字段] 相应的M_UserProfile.cs.M_Roles.cs进行扩展 using ...
- linux PCI 寻址
每个 PCI 外设有一个总线号, 一个设备号, 一个功能号标识. PCI 规范允许单个系统占 用多达 256 个总线, 但是因为 256 个总线对许多大系统是不够的, Linux 现在支持 PCI 域 ...