客户端:

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()方法

  1. import java.io.File;
  2. import java.io.FileInputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.OutputStream;
  7. import java.net.ServerSocket;
  8. import java.net.Socket;
  9. import java.net.UnknownHostException;
  10.  
  11. class UploadPicClient {
  12.  
  13. /**
  14. * @param args
  15. * @throws IOException
  16. * @throws UnknownHostException
  17. */
  18. public static void main(String[] args) throws Exception {
  19. //判断参数
  20. if(args.length!=1){
  21. System.out.println("请选择一个文件");
  22. return;
  23. }
  24. File file=new File(args[0]);
  25. if(!file.exists()||!file.isFile()){
  26. System.out.println("请选择一个存在的文件");
  27. return;
  28. }
  29. if(!file.getName().endsWith(".png")||file.length()>(1024*1024)){
  30. System.out.println("请选择小于1M的png文件");
  31. return;
  32. }
  33. Socket socket = new Socket("127.0.0.1", 10001);
  34. OutputStream out = socket.getOutputStream();
  35. // 输出
  36. FileInputStream fileInputStream = new FileInputStream("E:/11.png");
  37. byte[] b = new byte[1024];
  38. int len = 0;
  39. while ((len = fileInputStream.read(b)) != -1) {
  40. out.write(b, 0, len);
  41. }
  42. // 通知服务端
  43. socket.shutdownOutput();
  44.  
  45. // 接收反馈
  46. InputStream inputStream = socket.getInputStream();
  47. byte[] res = new byte[1024];
  48. len = inputStream.read(res);
  49. System.out.println(new String(res, 0, len));
  50.  
  51. out.close();
  52. socket.close();
  53. }
  54.  
  55. }
  56. /**
  57. * 多线程上传
  58. * @author taoshihan
  59. *
  60. */
  61. class UploadPicServerThread implements Runnable {
  62. private Socket socket;
  63.  
  64. public UploadPicServerThread(Socket s) {
  65. this.socket = s;
  66. }
  67.  
  68. @Override
  69. public void run() {
  70. // 读取
  71. InputStream is;
  72. try {
  73. is = socket.getInputStream();
  74.  
  75. byte[] res = new byte[1024];
  76. int len = 0;
  77. // 解决文件覆盖
  78. String ip = socket.getInetAddress().getHostAddress();
  79. int fileNum = 1;
  80. File file = new File(ip + ".png");
  81. while (file.exists()) {
  82. file = new File(ip + "(" + (fileNum++) + ").png");
  83. }
  84. FileOutputStream fos = new FileOutputStream(file);
  85. while ((len = is.read(res)) != -1) {
  86. fos.write(res, 0, len);
  87. }
  88.  
  89. // 反馈
  90. OutputStream os = socket.getOutputStream();
  91. os.write("上传成功!".getBytes());
  92. is.close();
  93. os.close();
  94. fos.close();
  95. } catch (Exception e) {
  96. e.printStackTrace();
  97. }
  98. }
  99.  
  100. }
  101.  
  102. // 服务端
  103. public class UploadPicServer {
  104.  
  105. /**
  106. * @param args
  107. * @throws Exception
  108. */
  109. public static void main(String[] args) throws Exception {
  110. ServerSocket serverSocket = new ServerSocket(10001);
  111.  
  112. while (true) {
  113. Socket socket = serverSocket.accept();
  114. new Thread(new UploadPicServerThread(socket)).start();
  115. }
  116. }
  117.  
  118. }

[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. java学习笔记—第三方数据库连接池包1(29)

    第一步:导入dbcp包 第二步:通过核心类连接数据 BasicDataSource它是javax.sql.DataSrouce的子类. 一个工具类:BasicDataSourceFactory. 手工 ...

  2. php socket 简单理解

    以下内容转自:https://www.cnblogs.com/loveyoume/p/6076101.html 和 https://www.cnblogs.com/WuNaiHuaLuo/p/6107 ...

  3. 洛谷P4250 [SCOI2015]小凸想跑步(半平面交)

    题面 传送门 题解 设\(p\)点坐标为\(x_p,y_p\),那么根据叉积可以算出它与\((i,i+1)\)构成的三角形的面积 为了保证\(p\)与\((0,1)\)构成的面积最小,就相当于它比其它 ...

  4. [网络] DHCP 之 Mac 绑定

    [网络] DHCP 之 Mac 绑定 一.瞎扯 今天我们来简单聊聊Mac绑定,这在设备管理时常常被使用. 当然你可能会说我可以设置静态IP啊.先不提静态IP容易冲突.现在我在设置树莓派时就遇到一个问题 ...

  5. socketserver模块解析

    socketserver模块是基于socket而来的模块,它是在socket的基础上进行了一层封装,并且实现并发等功能. 看看具体用法:       ​x         import sockets ...

  6. Eclipse 的SVN 的分支

    分支 概念 在版本控制过程中,使用多个分支同时推进多个不同功能开发.   不使用分支开发:人与人之间协作   使用分支开发:小组和小组之间协作 作用  多个功能开发齐头并进同时进行 任何一个分支上功能 ...

  7. Google Spanner vs Amazon Aurora: Who’ll Get the Enterprise?

    https://www.clustrix.com/bettersql/spanner-vs-aurora/ Google Spanner versus Amazon Aurora In July 20 ...

  8. F6&F7adjust the volume

    Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard La ...

  9. 如何查看yum安装路径

    #yum install hdf5 #rpm -qa|grep hdf5 hdf5-1.8.7-1.el6.rf.x86_64 #rpm -ql hdf5-1.8.7-1.el6.rf.x86_64

  10. ECharts概念学习系列之ECharts的下载和安装(图文详解)

    不多说,直接上干货! http://echarts.baidu.com/download.html 前言 如果你想要用较少的代码实现比较酷炫的数据统计表,echarts是值得你考虑的一种实现方式.官网 ...