我正在使用rmi java在java中編寫客戶機 - 服務器對。我希望服務器監聽連接,並且在連接一個客戶端時,服務器應拒絕嘗試連接的任何其他客戶端。如何創建一次只能接受一個連接的rmi服務器?
2
A
回答
-1
一個簡單的自制方法是通過一個跟蹤請求線程數量的單一方法來傳遞所有內容。如果已經有正在請求的線程正在進行,則可能會拋出異常。否則,請求線程被允許繼續。
一些代碼來說明這個概念,但不一定是實現...
public class RequestHandler {
private boolean activeRequest = false;
public void handeRequest() throws Exception {
synchronized(this) {
if (activeRequest) {
throw new Exception("Request in progress");
}
else {
activeRequest = true;
}
}
// delegate to something else to perform the request logic
synchronized(this) {
activeRequest = false;
}
}
}
2
您需要使用http://download.oracle.com/javase/6/docs/api/java/rmi/registry/LocateRegistry.html#createRegistry%28int,%20java.rmi.server.RMIClientSocketFactory,%20java.rmi.server.RMIServerSocketFactory%29啓動代碼的RMI註冊表,並編寫自定義RMIServerSocketFactory返回一個只接受單個連接的ServerSocket。
編輯:用LocateRegistry.createRegistry混搭和http://download.oracle.com/javase/1.5.0/docs/guide/rmi/hello/Server.java在拋出一點點額外的代碼(注意,我沒有編譯這個,所以你需要理清自己的任何編譯錯誤,它的目的是向您展示一般使用):
編輯2:修正它以合併@ EJP的建議(更多詳細信息請參閱this)。
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class Server implements Hello {
public Server() {}
public String sayHello() {
return "Hello, world!";
}
public static void main(String args[]) {
try {
Server obj = new Server();
RMIClientSocketFactory csf = new RMIClientSocketFactory() {
@Override
public Socket createSocket(String host, int port) throws IOException {
InetAddress addr = InetAddress.getByName(host);
if (addr.equals(InetAddress.getLocalHost())) {
return new Socket(addr, port);
} else {
throw new IOException("remote socket bind forbidden.");
}
}
};
RMIServerSocketFactory ssf = new RMIServerSocketFactory() {
@Override
public ServerSocket createServerSocket(int port) throws IOException {
System.out.println("RMIServerSocketFactory().createServerSocket()");
return new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1"));
}
};
Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0, csf, ssf);
// Bind the remote object's stub in the registry
Registry registry = LocateRegistry.createRegistry(uri.getPort(), csf, ssf);
registry.bind("Hello", stub);
System.err.println("Server ready");
} catch (Exception e) {
System.err.println("Server exception: " + e.toString());
e.printStackTrace();
}
}
}
0
所有你需要做的就是聲明你的遠程方法是同步的。然後,只有一個客戶可以一次輸入它/他們。
相關問題
- 1. 套接字服務器在同一個進程中一次只接受一個連接
- 2. 創建數據庫連接一次只
- 3. 創建一個echo服務器 - 服務器只能響應一次
- 4. 在Golang服務器中接受一個持久的tcp連接
- 5. 創建一個接受HTTPS的Java代理服務器
- 6. telnetd只接受一個連接
- 7. 一次只能連接一個連接phpwebsocket
- 8. textbox一次只接受一個字符
- 9. 一次連接MySQL服務器
- 10. 服務器套接字只能連接幾次(Winsock C++)
- 11. Linux的TCP服務器:接受連接
- 12. 如何限制WebSocket服務器連接只有一個?
- 13. HttpClient:如何只有一個連接到服務器?
- 14. 連接客戶端服務器RMI
- 15. 連接到Websphere rmi服務器
- 16. 連接到Java RMI服務器
- 17. java RMI連接到服務器
- 18. 在Java中創建一個到http服務器的TLS1.2連接
- 19. Selenium服務器 - 只接受1個IP
- 20. 這個多線程多連接TCP服務器爲什麼只接受一個連接?
- 21. 如何建立一個連接到Android的網絡服務器?
- 22. 創建RMI連接器客戶端
- 23. WCF服務器接受TLS 1.0連接
- 24. 創建一個只接受一個密碼的字段
- 25. Mongo在第一次連接時無法連接到服務器
- 26. SQL服務器創建一個視圖和連接表
- 27. 創建一個ASP.net GridView板(沒有服務器連接)
- 28. 如何讓wcf服務每次只接受1個客戶端
- 29. Tcp服務器在一定時間後不接受連接
- 30. java服務器在一段時間後停止接受連接
爲什麼要限制服務器性能? – user774411
因爲如果我使用更多的客戶端客戶端和服務器之間的流量可能會增加,因爲無論客戶端發送到服務器它必須重新傳輸到其他客戶端,我試過了,但我的服務器無法響應。 – sanu