zoukankan      html  css  js  c++  java
  • TCP并发复制上传文件

    /*
    需求:上传图片
    
    */
    
    /*
    客户端:
    1、建立服务
    2、读取客户端已有数据
    3、通过socket输出流,将数据发送到服务端
    4、通过socket读取流,读取服务端返回信息
    */
    import java.io.*;
    import java.net.*;
    import java.lang.Exception;
    class  PicClient
    {
    	public static void main(String[] args) throws Exception
    	{
    		if(args.length != 1)
    			System.out.println("请选择一个文件");
    
    		File file = new File(args[0]);
    		if(!file.exists() && file.isFile())
    		{
    			System.out.println("文件不存在或者不是文件。");
    			return;
    		}
    		System.out.println(file.getName());
    		if(!file.getName().endsWith(".jpg"))
    		{
    			System.out.println("请选择一个jpg文件");
    			return;
    		}
    		Socket s = new Socket("222.49.250.147",10001);
    
    		FileInputStream fis = new FileInputStream(file);
    		OutputStream os = s.getOutputStream();
    		byte[] buf =new byte[1024];
    		int len = 0;
    		while((len = fis.read(buf)) != -1)
    		{
    			os.write(buf,0,len);
    		}
    
    		//告诉服务端读入完毕
    		s.shutdownOutput();
    
    		//读取服务器端返回
    		InputStream is = s.getInputStream();
    		byte [] bufin = new byte[1024];
    		int num = is.read(bufin);
    		System.out.println(new String(bufin,0,num));
    		fis.close();
    		s.close();
    	}
    }
    
    /*
    实现多个客户端同时并发访问服务端,服务端最好就是将每个客户端封装到一个单独的线程中,
    这样就可以同时处理多个客户端情况。
    如何定义线程呢?
    只要明确每个客户端要在服务端要执行的代码,将该代码存到run方法中即可。
    */
    class PicServerThraed extends Thread
    {
    	Socket s = null;
    	PicServerThraed(Socket s)
    	{
    		this.s = s;
    	}
    
    	public void run()
    	{
    		int count =1;
    		try
    		{
    			String ip = s.getInetAddress().getHostAddress();
    			System.out.println(ip + "connected");
    			
    			File file = new File(ip + "(" + count +")" + ".jpg");
    			while(file.exists())
    				file = new File((ip + "(" + count++ +")" + ".jpg"));
    			InputStream is = s.getInputStream();
    			FileOutputStream fos = new FileOutputStream(file);
    			byte[] buf =new byte[1024];
    			int len = 0;
    			while((len = is.read(buf)) != -1)
    			{
    				fos.write(buf,0,len);
    			}
    
    			//将信息返回给客户端
    			OutputStream os = s.getOutputStream();
    			os.write("上传成功".getBytes());
    			is.close();
    			fos.close();
    			os.close();
    		}
    		catch (Exception ex)
    		{
    		}
    	}
    }
    
    
    /*
    服务器端
    */
    class PicServer
    {
    	public static void main(String [] args) throws Exception
    	{
    		ServerSocket ss = new ServerSocket(10001);
    		while(true)
    		{
    			//由于accept方法时阻塞式的,所以当a进来的时候,b进来就无法执行,因为a被阻塞,没执行完。
    			Socket s =ss.accept();
    			new Thread(new PicServerThraed(s)).start();
    		}
    	}
    }
    

  • 相关阅读:
    SQL 开发任务超 50% !滴滴实时计算的演进与优化
    Windows中如何使用命令行执行Kettle作业Job
    Kettle增量更新设计技巧
    oracle数据库查询全系整理
    Kettle基本概念 之 Kettle设计模块
    ETL-Kettle学习笔记(入门,简介,简单操作)
    SQL Server 索引——的创建、删除、何时使用、索引查询语句
    I/O端口与I/O内存
    设置用户id和设置组id
    进程控制
  • 原文地址:https://www.cnblogs.com/dengshiwei/p/4258419.html
Copyright © 2011-2022 走看看