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();
}
}