最近接觸到多行程編程的東西,內容是兩個子行程能夠互相通信,然后在主行程的控制臺上能讀出子行程互相通信的資訊。但是兩個子行程獨立運行是能交換資料的,用主行程打開兩個子行程之后就不行了。
這是子行程1(包含兩個執行緒),一個執行緒內容是計算某個檔案的哈希值然后發送到另一個子行程,另一個執行緒是接收另一個子行程發來的哈希值。
package ms; //子行程1 resourse.jar(從)
import org.json.simple.JSONObject;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.math.BigInteger;
import java.security.MessageDigest;
public class Client1 {
private static Socket socket;
public static boolean connection_state = false;
public static String md5Hash;
public static void main(String[] args){
while (!connection_state) {
connect();
try {
Thread.sleep(3000);
}catch (Exception e){
e.printStackTrace();
}
}
}
private static void connect(){
try {
socket = new Socket("127.0.0.1", 5008);
connection_state = true;
ObjectOutputStream ohs = new ObjectOutputStream(socket.getOutputStream());//心跳
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
new Thread(new Client1_listen(socket,ois)).start();
new Thread(new Client1_heart(socket,ohs)).start();
}catch (Exception e){
e.printStackTrace();
connection_state = false;
}
}
public static String md5HashCode32(InputStream fis) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] buffer = new byte[1024];
int length = -1;
while ((length = fis.read(buffer, 0, 1024)) != -1) {
md.update(buffer, 0, length);
}
fis.close();
byte[] md5Bytes = md.digest();
StringBuffer hexValue = new StringBuffer();
for (int i = 0; i < md5Bytes.length; i++) {
int val = ((int) md5Bytes[i]) & 0xff;
if (val < 16) {
hexValue.append("0");
}
hexValue.append(Integer.toHexString(val));
}
return hexValue.toString();
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
public static String md5HashCode32(String filePath) throws FileNotFoundException{
FileInputStream fis = new FileInputStream(filePath);
return md5HashCode32(fis);
}
public static String hash(String file){
try {
// String filePath = file;
String md5Hash = md5HashCode32(file);
return md5Hash;
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return md5Hash;
}
}
class Client1_listen implements Runnable{
private Socket socket;
private ObjectInputStream ois;
public String a;
public static boolean connection_state = true;
String localhash=new String("83247a4c321c70e257ef6b295bfde436");
Client1_listen(Socket socket,ObjectInputStream ois){
this.socket = socket;
this.ois = ois;
}
@Override
public void run() {
try {
while (connection_state){
System.out.println(ois.readObject());
a=String.valueOf(ois.readObject());
String hash=a.substring(9, 41);
if(hash.equals(localhash)){
System.out.println("內部驗證通過");
}
else {System.out.println("內部未驗證通過,系統斷開");
// socket.shutdownOutput();
// socket.shutdownInput();
// Client.shutdownclient();
// heart_listen.shutdownserve();
connection_state=false; }
}
}catch (Exception e){
e.printStackTrace();
}
}
}
class Client1_heart implements Runnable{
private Socket socket1;
private ObjectOutputStream ohs;
public String hashvol;
Client1_heart(Socket socket, ObjectOutputStream oos){
this.socket1 = socket;
this.ohs = oos;
}
@Override
public void run() {
try {
System.out.println("心跳包執行緒已啟動...");
while (true){
Thread.sleep(5000);
// System.out.println("111");
String hashvol = Client1.hash("E:\\java\\ruanjian\\binary\\com.sun.java.jdk8.win32.x86_64_1.8.0.v112\\jre\\lib\\resources.jar");
JSONObject object = new JSONObject();
object.put("Hash",hashvol);
ohs.writeObject(object);
ohs.flush();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
這是子行程2,內容和子行程1一樣
package ms; //子行程2 rt.jar(主)
import org.json.simple.JSONObject;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Client2 {
public static void main(String[] args){
try {
System.out.println("Socket服務器開始運行...");
ServerSocket serverSocket = new ServerSocket(5008);
while (true){
Socket socket = serverSocket.accept();
new Thread(new Server2_listen(socket)).start();
new Thread(new Server2_send(socket)).start();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
class Server2_listen implements Runnable{
private Socket socket;
public String a;
public static boolean connection_state = true;
String localhash=new String("5b03ecd932c90d9b6152926fee80b9d2");
Server2_listen(Socket socket){
this.socket = socket;
}
@Override
public void run() {
try {
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
// System.out.println("111");
while (true) {
System.out.println(ois.readObject());
a=String.valueOf(ois.readObject());
String hash=a.substring(9, 41);
if(hash.equals(localhash)){
System.out.println("內部驗證通過"); //Hash未變
}
else {System.out.println("內部未驗證通過,系統斷開");
// socket.shutdownOutput(); //子行程斷開
// socket.shutdownInput(); //子行程斷開
// heart_listen.shutdownserve(); //主行程斷開
connection_state=false; }
}
}catch (Exception e){
e.printStackTrace();
}finally {
try{
socket.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
}
class Server2_send implements Runnable{
private Socket socket;
Server2_send(Socket socket){
this.socket = socket;
}
@Override
public void run() {
try {
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
// System.out.println("111");
while (true){
Thread.sleep(5000);
String hashvol = Client1.hash("E:\\java\\ruanjian\\binary\\com.sun.java.jdk8.win32.x86_64_1.8.0.v112\\jre\\lib\\rt.jar");
JSONObject object = new JSONObject();
object.put("Hash",hashvol);
oos.writeObject(object);
oos.flush();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
最后是主行程
package ms;
import java.io.*;
import org.json.simple.JSONObject;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Clinet2 {
public static void main(String[] args) {
config(); //配置子行程
}
private static void config(){
try {
ProcessBuilder pb2 = new ProcessBuilder("java","ms.Client2");
pb2.directory(new File("E:\\java\\workplace\\ms\\bin"));
Process p2 = pb2.start();
ProcessBuilder pb1 = new ProcessBuilder("java","ms.Client1");
pb1.directory(new File("E:\\java\\workplace\\ms\\bin"));
Process p1 = pb1.start();
while (true){
BufferedInputStream in1 = new BufferedInputStream(p1.getInputStream());
BufferedInputStream in2 = new BufferedInputStream(p2.getInputStream());
BufferedReader br1 = new BufferedReader(new InputStreamReader(in1));
BufferedReader br2 = new BufferedReader(new InputStreamReader(in2));
String s1 = br1.readLine();
String s2 = br2.readLine();
if(s1!=null)
System.out.println(s1);
if(s2!=null)
System.out.println(s2);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
我這里主行程只是相當于開關的作用,還有就是讀取資料,不知道為什么不行。
想了好幾天不知道怎么辦,有沒有大佬解答一下
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/37914.html
標籤:Java相關
上一篇:java中把多個且不同格式的檔案以流的形式保存到一個檔案中,然后再還原回來怎么搞?求各路大神指點。
下一篇:js讀取下面的文本怎么寫?
