案例10 集群传输的原型

    线程池处理数据


1:写一个本地的wordCount程序,通过程序把程序的jar文件通过网络传输同其他机器上,使这个程序在其他机器上运行,把结果还发送到本机上。
流程如下:





client.java

package cn.edu360.day10;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * 1:建立网络连接
 * 2:身份验证
 * 3:发送jar包存放位置
 * 4:发送jar文件
 * 5:发送指令
 * 6:接收返回结果
 * @author Administrator
 * 注意:流用到的时候再获得
 *
 */
public class Client {
	private static final String KEY = "天王盖地虎";
	public static void main(String[] args) throws Exception{
		//1:建立网络连接
		Socket sc = new Socket("localhost", 9999);
		//建立输入输出流
		ObjectOutputStream oos = new ObjectOutputStream(sc.getOutputStream());
		//2:发送验证信息
		oos.writeObject(KEY);
		oos.flush();
		ObjectInputStream ois = new ObjectInputStream(sc.getInputStream());
		String value = (String)ois.readObject();
		if(value.equals("宝塔镇河妖")){//验证成功
			//3:发送jar包存放位置     (服务端接收的jar位置)
			oos.writeObject("E:/data/wc.jar");
			oos.flush();
			//4:发送jar文件  (本机的存放位置)
			FileInputStream input = new FileInputStream("E:/wc.jar");
			byte[] b = new byte[1024];
			int length = 0;
			while((length=input.read(b))!=-1){
				oos.write(b, 0, length);
			}
			oos.flush();
			input.close();
			
			//5:发送指令
			oos.writeObject("java -jar E:/data/wc.jar");
			oos.flush();
			
			//6:接收返回结果
			String result = (String)ois.readObject();
			System.out.println(result);
			
		}else{
			System.out.println("验证失败");
		}
		
	}

}
server.java
package cn.edu360.day10;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 1:建立网络通信
 * 2:校验身份
 * 3:接收jar文件的存放路径
 * 4:接收jar文件
 * 5:接收执行命令
 * 6:执行jar文件
 * 7:返回结果
 * @author Administrator
 *
 */
public class Server {
	private static final String KEY = "天王盖地虎";
	public static void main(String[] args) throws Exception {
		ServerSocket ssc = new ServerSocket(9999);
		while(true){
			Socket accept = ssc.accept();
			//获取输入输出流,包装成对象流
			System.out.println("获取连接");
			ObjectInputStream ois = new ObjectInputStream(accept.getInputStream());
			//2:校验身份
			System.out.println("-----");
			String key = (String)ois.readObject();
			ObjectOutputStream oos = new ObjectOutputStream(accept.getOutputStream());
			if(key.equals(KEY)){//校验成功的时候
				oos.writeObject("宝塔镇河妖");
				oos.flush();
				//3:接收jar文件的存放路径
				String filePath = (String)ois.readObject();
				//4:接收jar文件
				FileOutputStream outPut = new FileOutputStream(filePath);
				byte[] b = new byte[1024];
				int length = 0;
				while((length = ois.read(b))!=-1){
					outPut.write(b, 0, length);
				}
				outPut.flush();
				outPut.close();
				//5:接收执行命令
				String command = (String)ois.readObject();
				//6执行jar文件
				String resutlt = Utile.runJar(command);
				//7:返回结果
				oos.writeObject(resutlt);
				oos.flush();
				oos.close();
				ois.close();
				
			}else{//校验失败的时候
				oos.writeObject("小鸡炖蘑菇");
				oos.flush();
			}
			
		}
		
	}

}

ThreadMian.java

package cn.edu360.day10;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.FutureTask;

/**
 * 创建多线程任务并执行,得到返回结果并合并结果
 * @author Administrator
 *
 */
public class ThreadMain {
	public static void main(String[] args) throws Exception{
		Map<String, Integer> map = new HashMap<>();
		String jarPath = "E:/data/wc.jar";
		String localJarPath = "E:/wc.jar";
		String cmd = "java -jar E:/data/wc.jar";
		
		String jarPath2 = "E:/data/wc2.jar";
		String localJarPath2 = "E:/wc2.jar";
		String cmd2 = "java -jar E:/data/wc2.jar";
		
		CalableClient cc1 = new CalableClient(jarPath, localJarPath, cmd);
		FutureTask<String> f1 = new FutureTask<>(cc1);
		new Thread(f1).start();
		String string = f1.get();
		//System.err.println(string);
		
		CalableClient cc2 = new CalableClient(jarPath2, localJarPath2, cmd2);
		FutureTask<String> f2 = new FutureTask<>(cc2);
		new Thread(f2).start();
		String string2 = f2.get();
		//把返回值合并到一块
		StringBuilder sb = new StringBuilder();
		sb.append(string+" ");
		sb.append(string2+" ");
		String ret = sb.toString();
		String[] split = ret.split("\\s");
		//按照空格切分数据
		for (String string3 : split) {
			if(string3!=null&&!string3.equals("")){
				//对每一个数据进行切分    word=3
				String[] split2 = string3.split("=");
				String word = split2[0];
				Integer count = Integer.parseInt(split2[1]);
				Integer orDefault = map.getOrDefault(word, 0);
				orDefault+=count;
				map.put(word, orDefault);
			}
		}
		//遍历输出
		Set<Entry<String,Integer>> entrySet = map.entrySet();
		for (Entry<String, Integer> entry : entrySet) {
			System.out.println(entry);
		}
		
		
	}

}
Utile,java
package cn.edu360.day10;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Utile {
	/**
	 * 根据指定的命令,执行,获取返回结果
	 * @param command
	 * @return
	 * @throws IOException
	 */
	public static String runJar(String command) throws IOException {
		Runtime runtime = Runtime.getRuntime();
		Process exec = runtime.exec(command);
		BufferedReader br = new BufferedReader(new InputStreamReader(exec.getInputStream()));
		StringBuilder sb = new StringBuilder();
		String line = null;
		while((line = br.readLine())!=null){
			sb.append(line+" ");
		}
		return sb.toString();
	}
	

}
wordCount.java
package cn.edu360.day10;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

/**
 * hello=2
 * hi=1
 * 
 * @author Administrator
 *
 */
public class WordCount {
	public static void main(String[] args) throws Exception {
		Map<String, Integer> map = new HashMap<>();
		BufferedReader br= new BufferedReader(new FileReader("E:/data/wordCount2.txt"));
		StringBuilder sb = new StringBuilder();
		String line = null;
		while((line = br.readLine())!=null){
			//System.out.println(line);
			sb.append(line+" ");
		}
		String ret = sb.toString();
		String[] split = ret.split("\\s");
		for (String string : split) {
			Integer orDefault = map.getOrDefault(string, 0);
			orDefault++;
			map.put(string, orDefault);
		}
		Set<Entry<String,Integer>> entrySet = map.entrySet();
		for (Entry<String, Integer> entry : entrySet) {
			System.out.println(entry);
		}
		br.close();
	}

}

calable.java

package cn.edu360.day10;

import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.concurrent.Callable;

/**
 * 带返回值的client
 * @author Administrator
 *
 */
public class CalableClient implements Callable<String>{
	private static final String KEY = "天王盖地虎";
	private String jarPath;
	private String localJarPath;
	private String cmd;
	
	
	public CalableClient() {
		super();
	}


	public CalableClient(String jarPath, String localJarPath, String cmd) {
		super();
		this.jarPath = jarPath;
		this.localJarPath = localJarPath;
		this.cmd = cmd;
	}




	@Override
	public String call() throws Exception {
		//1:建立网络连接
				Socket sc = new Socket("localhost", 9999);
				//建立输入输出流
				ObjectOutputStream oos = new ObjectOutputStream(sc.getOutputStream());
				//2:发送验证信息
				oos.writeObject(KEY);
				oos.flush();
				ObjectInputStream ois = new ObjectInputStream(sc.getInputStream());
				String value = (String)ois.readObject();
				if(value.equals("宝塔镇河妖")){//验证成功
					//3:发送jar包存放位置     (服务端接收的jar位置)
					oos.writeObject(jarPath);
					oos.flush();
					//4:发送jar文件  (本机的存放位置)
					FileInputStream input = new FileInputStream(localJarPath);
					byte[] b = new byte[1024];
					int length = 0;
					while((length=input.read(b))!=-1){
						oos.write(b, 0, length);
					}
					oos.flush();
					input.close();
					
					//5:发送指令
					oos.writeObject(cmd);
					oos.flush();
					
					//6:接收返回结果
					String result = (String)ois.readObject();
					return result;
					
				}else{
					System.out.println("验证失败");
				}
		return null;
	}

}

TestCalable.java

package cn.edu360.day10.test;

import java.util.Random;
import java.util.concurrent.Callable;

/**
 * 1:继承Thread类
 * 2:实现Runnable接口
 * @author Administrator
 * Callable接口是创建带有返回值的线程的
 * 泛型代表的是返回值
package cn.edu360.day10.test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 测试执行jar文件
 * @author Administrator
 *
 */
public class TestRunJarFile {
	public static void main(String[] args) throws Exception {
		//得到java运行环境
		Runtime runtime = Runtime.getRuntime();
		String command = "java -jar e:/wc.jar";
		//执行程序,并获取进程信息
		Process exec = runtime.exec(command);
		//获取控制台上面的输出信息
		BufferedReader br = new BufferedReader(new InputStreamReader(exec.getInputStream()));
		
		//遍历输出
		String line = null;
		while((line=br.readLine())!=null){
			System.out.println(line);
		}
		
		
	}

}

* 需要重写(实现)call方法,call方法的返回值也就是线程的返回值 * */public class TestCalable implements Callable<Integer>{@Overridepublic Integer call() throws Exception {int sum = 0;//获取随机数Random rand = new Random();for(int i = 0;i<100;i++){int nextInt = rand.nextInt(10);sum=sum+nextInt+1;}return sum;}}

TestRunJarFile

package cn.edu360.day10.test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 测试执行jar文件
 * @author Administrator
 *
 */
public class TestRunJarFile {
	public static void main(String[] args) throws Exception {
		//得到java运行环境
		Runtime runtime = Runtime.getRuntime();
		String command = "java -jar e:/wc.jar";
		//执行程序,并获取进程信息
		Process exec = runtime.exec(command);
		//获取控制台上面的输出信息
		BufferedReader br = new BufferedReader(new InputStreamReader(exec.getInputStream()));
		
		//遍历输出
		String line = null;
		while((line=br.readLine())!=null){
			System.out.println(line);
		}
		
		
	}

}

TestThread.java

package cn.edu360.day10.test;


import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;


public class TestThread {
public static void main(String[] args) throws Exception{
//创建实现了Calable接口的类
TestCalable c1 = new TestCalable();
//使用Future进行包装
FutureTask<Integer> futureTask = new FutureTask<>(c1);
//把Future传进Thread类里面
Thread t1 = new Thread(futureTask);
//执行线程
t1.start();
//等待返回结果
//futureTask.get(10,TimeUnit.MINUTES);
Integer integer = futureTask.get();
System.out.println(integer);
}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值