TcpPic多上传

package com.tz.util.screen;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

import javax.management.RuntimeErrorException;

/**
 * 图片上传
 * 客服端
 * 1.服务端点
 * 2.读取客服端已有的图片数据
 * 3.通过socket输出流将数据发给服务端
 * 4.读取服务端反馈信息
 * 5.关闭
 * @author Administrator
 *
 */

public class TcpPic {

 public static void main(String[] args) throws Exception, Exception {
  if (args.length!=1) {
   System.out.println("请选择一个jpg格式图片");
   return;
  }
  File file=new File(args[0]);
  if (!file.exists()&&file.isFile()) {
   System.out.println("该文件有问题");
  }
  if (!file.getName().endsWith(".jpg")) {
   System.out.println("格式错误");
  }
  if (file.length()>1024*1024*5) {
   System.out.println("文件过大");
   return;
  }
  Socket s=new Socket("192.168.1.254",10007);
  
  FileInputStream fis=new FileInputStream("1.bmp");
  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();
  InputStream in=s.getInputStream();
  byte[] bufIn=new byte[1024];
  int num=in.read(bufIn);
  System.out.println(new String(bufIn,0,num));
  fis.close();
  s.close();
 }

}
/**
 * 服务端
 * 这个服务端游个局限性,当A客服端连接,被服务端获取,服务端执行具体流程,这时B客服端连接,只有等待,因为服务端还没有处理完A客服端的请求,还没有循环回来执行下次accept方法,所以暂时获取不到B对象
 * 为了让多个客服端同时并发访问服务端,那么服务端最好就是讲每个客服端封装到一个单独的线程中,这样,可以同时处理多个客服端请求
 * 定义线程:
 *  明确每一个客服端要在服务端执行的代码即可,将该代码存入Run方法中
 */
class PicThread implements Runnable{
 private Socket s;
 int count=1;
 PicThread(Socket s){
  this.s=s;
 }
 @Override
 public void run() {
  String ip=s.getInetAddress().getHostAddress();
  try {
   
   System.out.println(ip);
   InputStream in=s.getInputStream();
   //用IP命名,避免覆盖
   File file=new File(ip+"("+(count)+")"+".jpg");
   while(file.exists()){
   
    file=new File(ip+"("+(count++)+")"+".jpg");
   }

   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=s.getOutputStream();
   out.write("上传成功".getBytes());
   fos.close();
   s.close();
  } catch (Exception e) {
   throw new RuntimeException(ip+"上传失败");
  }
 }
 
}
class PicServer{
 public static void main(String[] args) throws Exception {
  ServerSocket ss=new ServerSocket(10007);
  while(true){
  Socket s=ss.accept();
  new Thread(new PicThread(s)).start();
  }
//  ss.close();
 }
}

转载于:https://my.oschina.net/u/2329247/blog/389359

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值