榪滅▼璋冪敤鏄吀鍨嬬殑CS妯″瀷錛孲erver绔彁渚涙湇鍔★紝瀹㈡埛绔皟鐢ㄥ緱鍒扮粨鏋?br />
鍏堢湅鏈嶅姟绔彁渚涙湇鍔$殑鏂規硶
1 /**
2 * 鎻愪緵鏈嶅姟
3 *
4 * @param service 鏈嶅姟瀹炵幇
5 * @param port 绔彛錛堝彲浠ュ弻鍙戠害瀹氾級
6 * @throws Exception
7 */
8 public static void provide(final Object service, final int port) throws Exception {
9 //鍙傛暟媯鏌?/span>
10 if (service == null) {
11 throw new IllegalArgumentException("The service can't be null!");
12 }
13 if (port > 65535) {
14 throw new IllegalArgumentException("The host can't greater than 65535!");
15 }
16 //寮鍚竴涓猄erverSocket鎺ユ敹璇鋒眰
17 ServerSocket serverSocket = new ServerSocket(port);
18 //姝誨驚鐜瓑寰呰姹?/span>
19 while (true) {
20 //鎺ュ彈鍒拌姹傦紝鑾峰彇socket
21 final Socket socket = serverSocket.accept();
22 try {
23 //寮鍚竴涓嚎紼嬪鐞?/span>
24 new Thread(new Runnable() {
25 @Override
26 public void run() {
27 try {
28 try {
29 //閲峴ocket涓幏鍙栬緭鍏ユ祦
30 ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
31 try {
32 //鑾峰彇鏂規硶鍚?/span>
33 String methodName = ois.readUTF();
34 //鑾峰彇鏂規硶鍙傛暟鏁扮粍
35 Class[] methodParameterTypes = (Class[]) ois.readObject();
36 //鑾峰彇鍙傛暟鍊兼暟緇?/span>
37 Object[] arguments = (Object[]) ois.readObject();
38 //鏍規嵁鏂規硶鍚嶅拰鏂規硶鍙傛暟鑾峰彇鏂規硶(鏍規嵁鏂規硶鍚嶅拰鏂規硶鍙傛暟鍙互鍞竴瀹氫綅鍒頒竴涓柟娉?
39 Method method = service.getClass().getMethod(methodName, methodParameterTypes);
40 if (method == null) {
41 throw new NoSuchMethodException();
42 }
43 //鎵ц鏂規硶
44 Object result = method.invoke(service, arguments);
45 System.out.println("Method:" + methodName + ";Arguments:" + arguments + " invoke!");
46 //鑾峰彇socket杈撳嚭嫻?/span>
47 ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
48 try {
49 //杈撳嚭緇撴灉
50 oos.writeObject(result);
51 } finally {
52 oos.close();
53 }
54 } finally {
55 ois.close();
56 }
57 } finally {
58 socket.close();
59 }
60 } catch (Exception e) {
61 //璁頒釜鏃ュ織鍟ョ殑
62 e.printStackTrace();
63 }
64 }
65 }).start();
66 } catch (Exception e) {
67 //璁頒釜鏃ュ織鍟ョ殑
68 e.printStackTrace();
69 }
70 }
71 }
鐒跺悗鏄秷璐圭殑鏂規硶
**
* 娑堣垂鏈嶅姟
*
* @param clazz 鎺ュ彛綾?br /> * @param host 鍙戝竷鏈嶅姟鏈哄櫒鐨刪ost
* @param port 鍙戝竷鏈嶅姟鏈哄櫒鐨刾ort
* @return
*/
public static Object consume(final Class clazz, final String host, final int port) {
//鍙傛暟媯鏌?/span>
if (clazz == null) {
throw new IllegalArgumentException("The clazz can't be null!");
}
if (host == null || host.isEmpty()) {
throw new IllegalArgumentException("The host can't be null or empty!");
}
if (port > 65535) {
throw new IllegalArgumentException("The host can't greater than 65535!");
}
//鐢熸垚浠g悊錛屾瘡嬈¤皟鐢ㄦ柟娉曞叾瀹炴槸璋冪敤榪滅▼鐨勬湇鍔?/span>
Object proxy = Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] arguments) throws Throwable {
//寤虹珛socket閾炬帴
Socket socket = new Socket(host, port);
try {
//鑾峰彇杈撳嚭嫻?/span>
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
try {
String methodName = method.getName();
Class[] methodParameterTypes = method.getParameterTypes();
//杈撳嚭瑕佽皟鐢ㄧ殑鏂規硶鍚?/span>
oos.writeUTF(methodName);
//杈撳嚭瑕佽皟鐢ㄧ殑鏂規硶鍙傛暟鍒楄〃
oos.writeObject(methodParameterTypes);
//杈撳嚭瑕佽皟鐢ㄧ殑鏂規硶鍙傛暟
oos.writeObject(arguments);
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
try {
//鑾峰彇緇撴灉
Object result = ois.readObject();
//鍙兘榪斿洖鐨勫璞℃槸寮傚父
if (result instanceof Throwable) {
throw (Throwable) result;
}
return result;
} finally {
ois.close();
}
} finally {
oos.close();
}
} finally {
socket.close();
}
}
});
return proxy;
}
涓鑸鍙e彲浠ュ弻鏂圭害瀹氾紝鑰宧ost鍙互閲囩敤configServer鐨勬柟娉曡В鍐籌紝涔熷氨鏄紑鍚竴涓湇鍔★紝褰撳惎鍔ㄤ竴涓湇鍔$殑鏃跺欏埌configServer娉ㄥ唽涓涓嬶紙鏈嶅姟鍚?host錛夛紝濡傛灉鏄鍙版湇鍔″櫒鎻愪緵鏈嶅姟錛宧ost灝辨槸涓涓猯ist錛岃皟鐢ㄦ柟鍙戣搗璋冪敤鐨勬椂鍊欓鍏堝埌configServer鏍規嵁鏈嶅姟鍚嶈幏鍙杊ost鍒楄〃錛岀劧鍚庨変竴涓猦ost鍙戣搗璋冪敤錛乧onfigServer鐨勪紭鐐規槸鍙互鍋氬埌寰堝鎺у埗錛屾瘮濡傛祦閲忔帶鍒訛紝鏉冮噸鎺у埗錛岃皟鐢╤ost鍒楄〃緇存姢錛堟鎺夊氨鍓旈櫎錛岄噸璇曟満鍒訛級絳夌瓑,榪欐牱璋冪敤鏂逛笉鐢ㄥ叧蹇冩垜璋冪敤鐨勬槸鍝彴鏈哄櫒錛屽彧鐢ㄥ叧蹇冩垜璋冪敤鍝釜鏂規硶銆備絾涔熸湁鍧忓錛屼竴鏃onfigServer鎸傛帀浜?......錛堝叾瀹炰篃鍙互閫氳繃MS鎴栬皟鐢ㄦ柟鏈湴緙撳瓨璋冪敤鍒楄〃瑙e喅錛夈?br />
涓鑸敱璋冪敤鏂規彁渚涗竴涓帴鍙e寘錛堢畻鏄竴涓弻鏂圭殑綰﹀畾錛夛紝鎺ュ彛綾諱腑瀹氫箟浜嗘彁渚涘彂鎻愪緵鐨勬柟娉?br />濡傛垜浠彂甯冧竴涓畝鍗曠殑鏈嶅姟
1 public interface Girl {
2 //鎻愪緵鏈嶅姟
3 String server(String name);
4 }
瀹炵幇
1 public class GirlImpl implements Girl{
2 @Override
3 public String server(String name) {
4 return name+"浜氱編鐖?;
5 }
6 }
鍙戝竷鏈嶅姟
榪欓噷浣犲彲浠ュ啓鍦ㄤ竴涓猰ain鏂規硶涓紝涔熷彲浠ラ厤緗竴涓猄pring鐨刡ean錛屽茍閰嶇疆init鏂規硶錛岀劧鍚庡湪init鏂規硶涓紑鍚?br />1 Girl beautifulGirl=new GirlImpl();
2 try {
//鍦ㄦ湰鏈虹殑1111绔彛涓婂紑鍚疓irl鐨勬湇鍔?br />3 Utils.provide(beautifulGirl, 1111);
4 } catch (Exception e) {
5 e.printStackTrace();
6 }
娑堣垂
1 try {
2 //浠庢浣犲氨鑾峰緱浜嗕竴涓紓浜瀛愶紝濂瑰彲浠ョ粰浣犳彁渚涘悇縐嶆湇鍔?/span>
3 Girl beautifulGirl= (Girl)Utils.consume(Girl.class, "127.0.0.1", 3333);
4 //浣犲彲浠ユ潵涓涓驚鐜紝鎴栬呮潵涓涓寰幆錛屼竴鐩?img src="http://www.tkk7.com/Images/dot.gif" alt="" />
鍝堝搱
5 beautifulGirl.server("yourName");
6 } catch (Exception e) {
7 e.printStackTrace();
8 }
鎬葷粨錛?br />鍏跺疄榪滅▼璋冪敤涔熷氨鏄幏鍙栨湇鍔$殑涓涓唬鐞嗭紝姣忓綋浣犺皟鐢ㄦ湇鍔$殑鏂規硶浜嬶紝浠栭兘浼氭兂鏈嶅姟鏂逛紶鍘繪柟娉曪紝鏂規硶鍙傛暟鍒楄〃錛屽弬鏁幫紝鍓嶄袱涓敤浜庡敮涓紜畾涓涓柟娉曪紝鍚庝竴涓敤浜庢柟娉曡皟鐢ㄣ?br />榪欓噷瀹炵幇鐨勫緢綆絳旓紝褰撶劧榪樻湁寰堝鏉傜殑錛屾瘮濡係pring鐨勫疄鐜幫紝娣樺疂鐨凥SF絳夌瓑
浠ヤ笂涓轟釜浜虹悊瑙o紝濡傛灉鏈夐敊鐨勫湴鏂癸紝嬈㈣繋鎸囨銆?img src ="http://www.tkk7.com/evan8126/aggbug/393518.html" width = "1" height = "1" />
]]>