客户端:

1.服务端点

2.读取客户端已有的图片数据

3.通过socket输出流将数据发给服务端

4.读取服务端反馈信息

5.关闭

获取Socket对象,new出来,构造参数:String的服务端ip,int的端口号

调用Socket对象的getOutputStream()方法,得到OutputStream输出流对象

获取FileInputStream对象,new出来,构造参数:String的文件路径

while循环调用,条件FileInputStream对象的read()方法,读取到字节数组中

循环中,调用OutputStream输出流对象的write()方法,写入数据,参数:byte[],0,len

调用Socket对象的shutDownOutput()方法,通知服务端写入完成

调用Socket对象的getInputStream()方法,得到InputStream输入流对象

调用InputStream输入流对象的read()方法,读取,并打印

调用FileInputStream对象的close()方法

调用Socket对象的close()方法

服务端:

正常读取

解决并发

上面的例子,一次只能有一个客户端服务,解决并发上传的问题,使用多线程处理每个来访的客户

定义一个类PicThread,实现Runnable接口

定义构造函数,传递进来Socket对象

实现run()方法,在try-catch中捕获异常,正常读取Socket对象的流

解决文件覆盖

文件的名称采用ip+(数字),例如:192.168.1.100(2).jpg

获取ip 方法,socket.getInetAddress().getHostAddress()

第一次进入,文件名192.168.1.100.jpg

第二次进入,判读文件已存在,文件名变成192.168.1.100(1).jpg

主函数传值形式并判断

判断有一个参数 arg.length==1

判断是文件,并且存在  File对象的exists()方法和isFile()方法

判断文件后缀,File对象的getName().endsWith(“.jpg”)方法

判断文件大小,File对象的length()方法

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException; class UploadPicClient { /**
* @param args
* @throws IOException
* @throws UnknownHostException
*/
public static void main(String[] args) throws Exception {
//判断参数
if(args.length!=1){
System.out.println("请选择一个文件");
return;
}
File file=new File(args[0]);
if(!file.exists()||!file.isFile()){
System.out.println("请选择一个存在的文件");
return;
}
if(!file.getName().endsWith(".png")||file.length()>(1024*1024)){
System.out.println("请选择小于1M的png文件");
return;
}
Socket socket = new Socket("127.0.0.1", 10001);
OutputStream out = socket.getOutputStream();
// 输出
FileInputStream fileInputStream = new FileInputStream("E:/11.png");
byte[] b = new byte[1024];
int len = 0;
while ((len = fileInputStream.read(b)) != -1) {
out.write(b, 0, len);
}
// 通知服务端
socket.shutdownOutput(); // 接收反馈
InputStream inputStream = socket.getInputStream();
byte[] res = new byte[1024];
len = inputStream.read(res);
System.out.println(new String(res, 0, len)); out.close();
socket.close();
} }
/**
* 多线程上传
* @author taoshihan
*
*/
class UploadPicServerThread implements Runnable {
private Socket socket; public UploadPicServerThread(Socket s) {
this.socket = s;
} @Override
public void run() {
// 读取
InputStream is;
try {
is = socket.getInputStream(); byte[] res = new byte[1024];
int len = 0;
// 解决文件覆盖
String ip = socket.getInetAddress().getHostAddress();
int fileNum = 1;
File file = new File(ip + ".png");
while (file.exists()) {
file = new File(ip + "(" + (fileNum++) + ").png");
}
FileOutputStream fos = new FileOutputStream(file);
while ((len = is.read(res)) != -1) {
fos.write(res, 0, len);
} // 反馈
OutputStream os = socket.getOutputStream();
os.write("上传成功!".getBytes());
is.close();
os.close();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
} } // 服务端
public class UploadPicServer { /**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(10001); while (true) {
Socket socket = serverSocket.accept();
new Thread(new UploadPicServerThread(socket)).start();
}
} }

[javaSE] 网络编程(TCP-并发上传图片)的更多相关文章

  1. Linux网络编程——tcp并发服务器(poll实现)

    想详细彻底地了解poll或看懂下面的代码请参考<Linux网络编程——I/O复用之poll函数> 代码: #include <string.h> #include <st ...

  2. 网络编程——TCP协议、UDP协议、socket套接字、粘包问题以及解决方法

    网络编程--TCP协议.UDP协议.socket套接字.粘包问题以及解决方法 TCP协议(流式协议) ​ 当应用程序想通过TCP协议实现远程通信时,彼此之间必须先建立双向通信通道,基于该双向通道实现数 ...

  3. GO语言练习:网络编程 TCP 示例

    1.代码 2.编译及运行 1.网络编程 TCP 示例 simplehttp.go 代码 package main import ( "net" "os" &qu ...

  4. 网络编程TCP协议-聊天室

    网络编程TCP协议-聊天室(客户端与服务端的交互); <span style="font-size:18px;">1.客户端发数据到服务端.</span> ...

  5. C#网络编程TCP通信实例程序简单设计

    C#网络编程TCP通信实例程序简单设计 采用自带 TcpClient和TcpListener设计一个Tcp通信的例子 只实现了TCP通信 通信程序截图: 压力测试服务端截图: 俩个客户端链接服务端测试 ...

  6. Socket网络编程(TCP/IP/端口/类)和实例

    Socket网络编程(TCP/IP/端口/类)和实例 原文:C# Socket网络编程精华篇 转自:微冷的雨 我们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念: TCP/IP层次 ...

  7. Socket网络编程-TCP编程

    Socket网络编程-TCP编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.socket介绍 1>.TCP/IP协议 2>.跨网络的主机间通讯 在建立通信连接的 ...

  8. 32.网络编程TCP/UDP服务

    网络编程TCP: 服务器端口了解: port:0~65535 web服务:80 邮箱服务:556 0~1024:为服务默认的公认端口,一般我们不能用 套接字:socket socket作用 ip:po ...

  9. 网络编程TCP/IP详解

    网络编程TCP/IP详解 1. 网络通信 中继器:信号放大器 集线器(hub):是中继器的一种形式,区别在于集线器能够提供多端口服务,多口中继器,每个数据包的发送都是以广播的形式进行的,容易阻塞网络. ...

  10. 36 - 网络编程-TCP编程

    目录 1 概述 2 TCP/IP协议基础 3 TCP编程 3.1 通信流程 3.2 构建服务端 3.3 构建客户端 3.4 常用方法 3.4.1 makefile方法 3.5 socket交互 3.4 ...

随机推荐

  1. 微信小程序 —— button按钮去除border边框

    button默认有边框,边框用“border : none”去掉就不可以,边框依然存在, 使用 button::after{ border: none; } 来去除边框,边框就没了 wxml: < ...

  2. Linux中tail指令详解

    linux tail命令用途是依照要求将指定的文件的最后部分输出到标准设备,通常是终端,通俗讲来,就是把某个档案文件的最后几行显示到终端上,假设该档案有更新,tail会自己主动刷新,确保你看到最新的档 ...

  3. robot framework-tags(标签)实例

    robot framework的标签是一个简单而又强大的分类机制,功能如下: 标签在reports,logs以及测试数据中展示,显示关于测试用例的元数据信息 用例的执行统计(total,passed, ...

  4. python基础知识梳理-----1变量,常量,注释

    因为公司用的是delphi ,所以自学了一阵delphi,但是随着语言的发展,delphi的前景堪忧啊.辞职以后打算好好学学python,然后找找数据分析和爬虫方面的工作. 记录此贴,仅作学习使用,所 ...

  5. git 命令摘录

    回滚 n 个 commit (增加了revert commit) git revert -n commit_id 回滚到指定的commit_id(不增加commit,回滚的commit_id被删除) ...

  6. SpringQuartz定时任务cronExpression配置

    <!-- 每一个小时跑一次--> <property name="cronExpression"> <value>0 0 0/1 * * ?&l ...

  7. python里有意思的文件查找glob模块

    python标准库之glob介绍 glob 文件名模式匹配,不用遍历整个目录判断每个文件是不是符合. 1.通配符 星号(*)匹配零个或多个字符 import glob for name in glob ...

  8. 微信小程序之蓝牙 BLE 踩坑记录

    前言 前段时间接手了一个微信小程序的开发,主要使用了小程序在今年 3 月开放的蓝牙 API ,此过程踩坑无数,特此记录一下跳坑过程.顺便开了另一个相关的小项目,欢迎 start 和 fork: BLE ...

  9. Python unittest第二篇:测试夹具

    关于测试夹具,我们知道,以类为对象的话,在python里对应的方法分别是test_isupper.test_upper, 那么以测试case为单位呢? 这时候,就要提到我们的setup()和tearD ...

  10. SqlServer子查询、高级

    子查询:把一个结果集让别人继续分析查询的就叫子查询 子查询如果定义了别名,在查询引用时,必须使用别名 --子查询定义了别名,引用就必须用别名 select id,n from Person,(sele ...