socket部分参考 http://blog.csdn.net/kongxx/article/details/7259465
取款部分参考 http://blog.csdn.net/dayday1987/article/details/9971647
先说说取款吧 如何保证数据同步? 操作时加锁即可 怎么加?使用synchronized关键字
然后自己设置两个线程 一个add 一个withdraw即可(原博中只用到了Runnable 感觉并没有创建新线程 这里有点小疑问)
socket部分 每次server.accpet()之后都会返回一个客户端 Server端需要创建一个新的线程 将客户端放入该新thread中处理就行
所以这里模拟的一个客户端专门存 一个专门取
Server端
package com.googlecode.garbagecan.test.socket.sample2; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import com.accout.Operation; /** * http://blog.csdn.net/kongxx/article/details/7259465 * @author Administrator * */ public class MyServer { static Operation oper; public static void main(String[] args) throws IOException { oper = new Operation(); MyServer ms=new MyServer(); ServerSocket server = new ServerSocket(12345); while (true) { Socket socket = server.accept(); System.out.println("a new conntection ---------------"); ms.invoke(socket); } } private static void invoke(final Socket client) throws IOException { new Thread(new Runnable() { public void run() { BufferedReader in = null; PrintWriter out = null; try { in = new BufferedReader(new InputStreamReader(client.getInputStream())); out = new PrintWriter(client.getOutputStream()); while (true) { String msg = in.readLine(); if (msg==null||msg.equals("bye")) { break; } System.out.println("client says "+msg); String val[]=getParam(msg); //msg1 add if(val[0].equals("1")){ msg=oper.addOperationCall(val[1],Integer.parseInt(val[2])); }else if(val[0].equals("2")){ msg=oper.withDrawOperationCall(val[1],Integer.parseInt(val[2])); } //send msg to client out.println(msg); out.flush(); } } catch(IOException ex) { ex.printStackTrace(); } catch (NumberFormatException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { in.close(); } catch (Exception e) {} try { out.close(); } catch (Exception e) {} try { client.close(); } catch (Exception e) {} } } }).start(); } static String[] getParam(String msg){ String val[]=msg.split(" "); return val; } }
取客户端
package com.googlecode.garbagecan.test.socket.sample2; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class MyClientLoopDraw { public static void main(String[] args) throws Exception { Socket socket = new Socket("localhost", 12345); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); BufferedReader readConsole = new BufferedReader(new InputStreamReader(System.in)); PrintWriter out = new PrintWriter(socket.getOutputStream()); int index=0; while (true) { //暂时规定1 就是add 2就是取钱 // String msg = readConsole.readLine(); //读取控制台的信息(并加上名字)并发给Server //some codes to handle msg String msg="2 jerry 150 -"; System.out.println(msg); out.println(msg); out.flush(); System.out.println("Server says "+in.readLine()); if (msg.equals("bye")||index++>=10) { break; } } socket.close(); } }
存客户端
package com.googlecode.garbagecan.test.socket.sample2; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class MyClientLoopAdd { public static void main(String[] args) throws Exception { Socket socket = new Socket("localhost", 12345); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); BufferedReader readConsole = new BufferedReader(new InputStreamReader(System.in)); PrintWriter out = new PrintWriter(socket.getOutputStream()); int index=0; while (true) { //暂时规定1 就是add 2就是取钱 //String msg = readConsole.readLine(); //读取控制台的信息(并加上名字)并发给Server //some codes to handle msg String msg="1 tom 100 +"; System.out.println(msg); out.println(msg); out.flush(); System.out.println("Server says "+in.readLine()); if (msg.equals("bye")||index++>10) { break; } } socket.close(); } }
创建操作类 方法中创建新的线程来处理存钱和取钱
package com.accout; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class Operation { Account account = new Account(); public void addOperation(final String name, final float varient) { // 加载线程 new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } // 存钱 getAccount().add(name, varient); } }).start(); // new Runnable() { // // @Override // public void run() { // try { // Thread.sleep(1000); // } catch (Exception e) { // e.printStackTrace(); // } // // 存钱 // getAccount().add(name, varient); // } // // }.run(); // 别忘了加run() } public void withdrawOperation(final String name, final float varient) { // 加载线程 new Runnable() { @Override public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } // 取钱 getAccount().withdraw(name, varient); } }.run(); } public String addOperationCall(final String name, final float varient) throws Exception { ExecutorService threadPool = Executors.newSingleThreadExecutor(); Future<String> future = threadPool.submit(new Callable<String>() { @Override public String call() throws Exception { // TODO Auto-generated method stub return getAccount().add(name, varient); } }); String rs = null; try { Thread.sleep(1000);// 可能做一些事情 rs = future.get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return rs; } public String withDrawOperationCall(final String name, final float varient) throws Exception { ExecutorService threadPool = Executors.newSingleThreadExecutor(); Future<String> future = threadPool.submit(new Callable<String>() { @Override public String call() throws Exception { // TODO Auto-generated method stub return getAccount().withdraw(name, varient); } }); String rs = null; try { Thread.sleep(1000);// 可能做一些事情 rs = future.get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return rs; } public Account getAccount() { return account; } public void setAccount(Account account) { this.account = account; } }