- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我编写了三个 rmi 服务器,它们使用 UDP 单播相互发送数据。每次在服务器的特定实例上执行方法时,发起的服务器都会向其他服务器发送请求,其他服务器以在服务器的该特定实例上执行的方法的结果进行响应。我已经使用线程实现了它们。该方法第一次执行,但是当我再次执行它时,出现以下错误:
java.rmi.UnmarshalException: Error unmarshaling return header; nested exception is:
java.net.SocketException: Connection reset
at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)
at com.sun.proxy.$Proxy0.getNonReturners(Unknown Source)
at drms.org.client.DRMSClient.main(DRMSClient.java:379)
Caused by: java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.io.BufferedInputStream.fill(Unknown Source)
at java.io.BufferedInputStream.read(Unknown Source)
at java.io.DataInputStream.readByte(Unknown Source)
... 6 more
getNonReturners - 为 udp 通信创建线程的方法
requestData:向其他服务器发送请求消息
responseData:将响应消息发送到请求它的服务器
服务器端代码:
public class DRMSServer implements DRMSInterface, Serializable {
final static int _concordiaPortNumber = 1098;
final static int _mcgillPortNumber = 222;
final static int _dawsonPortNumber = 223;
/**
* Description: Sends UDP request from invoked Server to the other servers
*
* @param: Port Number
* @param: Data
*/
public String requestData(final int portNumber, final String data) {
StringBuilder sb = new StringBuilder();
try {
final DatagramSocket clientSocket = new DatagramSocket();
final byte[] receiveData = new byte[1024000];
final DatagramPacket receivePacket = new DatagramPacket(
receiveData, receiveData.length);
byte[] sendData = new byte[1024000];
sendData = data.getBytes();
System.out.print("Ready to send data ");
sb.append("Ready to send data ");
sb.append("\n");
final DatagramPacket sendPacket = new DatagramPacket(sendData,
sendData.length, IPAddress, portNumber);
clientSocket.send(sendPacket);
clientSocket.setSoTimeout(10000);
try {
clientSocket.receive(receivePacket);
final String _result = new String(receivePacket.getData());
final InetAddress returnIPAddress = receivePacket.getAddress();
final int port = receivePacket.getPort();
System.out.println("From server at: " + returnIPAddress + ":"
+ port);
sb.append("From server at: " + returnIPAddress + ":" + port);
sb.append("\n");
System.out.println("Message: " + _result);
sb.append("Message: " + _result);
}
catch (final SocketTimeoutException ste) {
System.out.println("Timeout Occurred: Packet assumed lost");
}
// clientSocket.close();
}
catch (final SocketException e) {
e.printStackTrace();
}
catch (final IOException e) {
e.printStackTrace();
}
return sb.toString();
}
/**
* Description: Returns the administrator with the list of defaulter who
* have a book past their loan date. Based on the UDP request from the
* invoked server it sends the UDP response.
*
* @param: Port Number
*/
public String responseData(final int portNumber) throws NotBoundException {
String _result = null;
try {
@SuppressWarnings("resource")
final DatagramSocket serverSocket = new DatagramSocket(portNumber,
IPAddress);
final DRMSInterface _concordiaServer = (DRMSInterface) Naming
.lookup("rmi://localhost:1098/concordia");
final DRMSInterface _mcgillServer = (DRMSInterface) Naming
.lookup("rmi://localhost:222/mcgill");
final DRMSInterface _dawsonServer = (DRMSInterface) Naming
.lookup("rmi://localhost:223/dawson");
byte[] receiveData = new byte[1024000];
byte[] sendData = new byte[1024000];
String regex = "(?<=[\\w&&\\D])(?=\\d)";
while (true) {
receiveData = new byte[1024000];
final DatagramPacket receivePacket = new DatagramPacket(
receiveData, receiveData.length);
System.out.println("Waiting for datagram packet");
serverSocket.receive(receivePacket);
final String _request = new String(receivePacket.getData());
System.out.println(_request);
String array[] = _request.split(regex);
String _educationalInstitution = array[0];
System.out.println(_educationalInstitution);
int numDays = Integer.parseInt(array[1].trim());
System.out.println(numDays);
final InetAddress IPAddress = receivePacket.getAddress();
final int port = receivePacket.getPort();
System.out.println("From: " + IPAddress + ":" + port);
System.out.println("Request Message from: "
+ _request.toUpperCase());
if (_educationalInstitution.toLowerCase().equals("concordia")) {
if (portNumber == _mcgillPortNumber) {
_result = _mcgillServer.getNonReturnersData(
_educationalInstitution, numDays);
}
else if (portNumber == _dawsonPortNumber) {
_result = _dawsonServer.getNonReturnersData(
_educationalInstitution, numDays);
}
}
else if (_educationalInstitution.toLowerCase().equals("mcgill")) {
if (portNumber == _concordiaPortNumber) {
_result = _concordiaServer.getNonReturnersData(
_educationalInstitution, numDays);
}
else if (portNumber == _dawsonPortNumber) {
_result = _dawsonServer.getNonReturnersData(
_educationalInstitution, numDays);
}
}
else if (_educationalInstitution.toLowerCase().equals("dawson")) {
if (portNumber == _mcgillPortNumber) {
_result = _mcgillServer.getNonReturnersData(
_educationalInstitution, numDays);
}
else if (portNumber == _dawsonPortNumber) {
_result = _dawsonServer.getNonReturnersData(
_educationalInstitution, numDays);
}
}
// final String capitalizedSentence =
if(_result !=null){
sendData = _result.getBytes();
}
else{
_result="NO DEFAULTERS";
sendData = _result.getBytes();
}
final DatagramPacket sendPacket = new DatagramPacket(sendData,
sendData.length, IPAddress, port);
serverSocket.send(sendPacket);
}
}
catch (final SocketException ex) {
System.out.println("UDP Port 9876 is occupied.");
System.exit(1);
}
catch (final IOException e) {
e.printStackTrace();
}
return _result;
}
/**
* Description: Returns the administrator with the list of defaulter who
* have a book past their loan date
*
* @param: Admin username
* @param: Admin password
* @param: Educational Institution
* @param: No of days
*/
public String getNonReturnersData(String educationalInstituion, int numDays) {
//returns data
}
/**
* Description: Using this method the admin invoked server communicates with
* other servers using UDP/IP messages to get their information.Once the
* information is received the admin invoked server sends the result string
* to the admin
*
* @param: Admin username
* @param: Admin password
* @param: Educational Institution
* @param: No of days
*/
@Override
public String getNonReturners(String adminUsername, String adminPassword,
String educationalInstitution, int numDays) throws RemoteException,
Exception {
String _result = null;
String _initiatedServerResult=null;
final ArrayList<String> result = new ArrayList<String>();
final DRMSInterface _concordiaServer = (DRMSInterface) Naming
.lookup("rmi://localhost:1098/concordia");
final DRMSInterface _mcgillServer = (DRMSInterface) Naming
.lookup("rmi://localhost:222/mcgill");
final DRMSInterface _dawsonServer = (DRMSInterface) Naming
.lookup("rmi://localhost:223/dawson");
if (educationalInstitution.toLowerCase().equals("concordia")) {
final Thread t1 = new Thread() {
@Override
public void run() {
try {
result.add(_mcgillServer
.responseData(_mcgillPortNumber));
}
catch (RemoteException | NotBoundException e) {
e.printStackTrace();
}
}
};
t1.setDaemon(true);
t1.start();
final Thread t2 = new Thread() {
@Override
public void run() {
try {
result.add(_dawsonServer
.responseData(_dawsonPortNumber));
}
catch (RemoteException | NotBoundException e) {
e.printStackTrace();
}
}
};
t2.setDaemon(true);
t2.start();
System.out.println("Attemping to connect to " + IPAddress
+ ") via UDP port" + _mcgillPortNumber);
result.add("Attemping to connect to " + IPAddress
+ ") via UDP port" + _mcgillPortNumber);
result.add("/n");
System.out.println("Attemping to connect to " + IPAddress
+ ") via UDP port" + _dawsonPortNumber);
result.add("Attemping to connect to " + IPAddress
+ ") via UDP port" + _dawsonPortNumber);
result.add("/n");
final String _concordiaRequestMessage = educationalInstitution
+ numDays;
System.out.println("Sending data "
+ _concordiaRequestMessage.length() + " bytes to server.");
result.add("Sending data " + _concordiaRequestMessage.length()
+ " bytes to server.");
result.add(_concordiaServer.requestData(_mcgillPortNumber,
_concordiaRequestMessage));
result.add(_concordiaServer.requestData(_dawsonPortNumber,
_concordiaRequestMessage));
_initiatedServerResult=_concordiaServer.getNonReturnersData(
educationalInstitution, numDays);
if(_initiatedServerResult !=null){
result.add(_initiatedServerResult);
}
else{
result.add("No Defaulters in Concordia");
}
}
else if (educationalInstitution.toLowerCase().equals("mcgill")) {
final Thread t1 = new Thread() {
@Override
public void run() {
try {
result.add(_concordiaServer
.responseData(_concordiaPortNumber));
}
catch (RemoteException | NotBoundException e) {
e.printStackTrace();
}
}
};
t1.setDaemon(true);
t1.start();
final Thread t2 = new Thread() {
@Override
public void run() {
try {
result.add(_dawsonServer
.responseData(_dawsonPortNumber));
}
catch (RemoteException | NotBoundException e) {
e.printStackTrace();
}
}
};
t2.setDaemon(true);
t2.start();
System.out.println("Attemping to connect to " + IPAddress
+ ") via UDP port" + _concordiaPortNumber);
result.add("Attemping to connect to " + IPAddress
+ ") via UDP port" + _concordiaPortNumber);
System.out.println("Attemping to connect to " + IPAddress
+ ") via UDP port" + _dawsonPortNumber);
result.add("Attemping to connect to " + IPAddress
+ ") via UDP port" + _dawsonPortNumber);
final String _mcgillRequestMessage = educationalInstitution
+ numDays;
System.out.println("Sending data "
+ _mcgillRequestMessage.length() + " bytes to server.");
result.add("Sending data " + _mcgillRequestMessage.length()
+ " bytes to server.");
result.add(_mcgillServer.requestData(_concordiaPortNumber,
_mcgillRequestMessage));
result.add(_mcgillServer.requestData(_dawsonPortNumber,
_mcgillRequestMessage));
_initiatedServerResult=_mcgillServer.getNonReturnersData(
educationalInstitution, numDays);
if(_initiatedServerResult !=null)
{
result.add(_initiatedServerResult);
}
else{
result.add("No Defaulters in Mcgill");
}
}
else if (educationalInstitution.toLowerCase().equals("dawson")) {
final Thread t1 = new Thread() {
@Override
public void run() {
try {
result.add(_concordiaServer
.responseData(_concordiaPortNumber));
}
catch (RemoteException | NotBoundException e) {
e.printStackTrace();
}
}
};
t1.setDaemon(true);
t1.start();
final Thread t2 = new Thread() {
@Override
public void run() {
try {
result.add(_mcgillServer
.responseData(_mcgillPortNumber));
}
catch (RemoteException | NotBoundException e) {
e.printStackTrace();
}
}
};
t2.setDaemon(true);
t2.start();
System.out.println("Attemping to connect to " + IPAddress
+ ") via UDP port" + _concordiaPortNumber);
result.add("Attemping to connect to " + IPAddress
+ ") via UDP port" + _concordiaPortNumber);
System.out.println("Attemping to connect to " + IPAddress
+ ") via UDP port" + _mcgillPortNumber);
result.add("Attemping to connect to " + IPAddress
+ ") via UDP port" + _mcgillPortNumber);
final String _dawsonRequestMessage = educationalInstitution
+ numDays;
System.out.println("Sending data "
+ _dawsonRequestMessage.length() + " bytes to server.");
result.add("Sending data " + _dawsonRequestMessage.length()
+ " bytes to server.");
result.add(_dawsonServer.requestData(_concordiaPortNumber,
_dawsonRequestMessage));
result.add(_dawsonServer.requestData(_mcgillPortNumber,
_dawsonRequestMessage));
result.add(_concordiaServer.getNonReturnersData(
educationalInstitution, numDays));
_initiatedServerResult=_dawsonServer.getNonReturnersData(
educationalInstitution, numDays);
if(_initiatedServerResult !=null)
{
result.add(_initiatedServerResult);
}
else{
result.add("No Defaulters in Dawson");
}
}
return _result = result.toString();
}
/**
* Description: Creates a remote Concordia server object
* Did the same for the other two servers
*/
public void exportServerConcordia() throws Exception {
Remote _obj = UnicastRemoteObject.exportObject(this,
_concordiaPortNumber);
Registry _r = LocateRegistry.createRegistry(_concordiaPortNumber);
_r.bind("concordia", _obj);
}
public static void main(String args[]) {
try {
DRMSServer concordia = new DRMSServer();
concordia.exportServerConcordia();
System.out.println("Concordia Server is up and running");
DRMSServer mcgill = new DRMSServer();
mcgill.exportServerMcgill();
System.out.println("Mcgill server is up and running");
DRMSServer dawson = new DRMSServer();
dawson.exportServerDawson();
System.out.println("Dawson server is up and running");
//Tried one solution but it didn't work
try {
while (true){
try{
Thread.currentThread();
Thread.sleep (50000000L);
}catch (InterruptedException e) {}
}
} catch (Exception ex) {
System.err.println("Exiting Frequency Keeper Server");
ex.printStackTrace();
}
}
catch (Exception e) {
e.printStackTrace();
}
}
最佳答案
我想说这一行已被执行:
System.exit(1);
关于Java RMI 错误 : Connection Reset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26791338/
每次暂存文件时,如果您需要取消暂存文件,Git 都会提供有用的说明: (use "git reset HEAD ..." to unstage) 不过体面Git Tutorials by Atlass
我需要添加几个文件以将它们组合到一个提交中,但我必须排除其中一个。在 this answer ,执行此操作的代码是: git add -u git reset -- file_to_ignore.da
这个问题在这里已经有了答案: What are typical use cases of git-reset's --merge and --keep flags? (4 个答案) 关闭 6 年前。
有时候,进行了错误的提交,但是还没有push到远程分支,想要撤销本次提交,可以使用git reset –-soft/hard命令。 1、二者区别: git reset –-soft:回退到某个版
我认为:软重置:从重置向量启动。硬复位:拉CPU的电平。 最佳答案 硬复位当然意味着整个CPU芯片及其所有外设都被复位。造成这种情况的原因可能有很多:复位引脚被外部拉高、时钟故障、片内低电压检测、看门
$python manage.py reset Unknown command: 'reset' Type 'manage.py help' for usage. 在django 1.6中是否取消了这
我是 git 的新手,所以问题可能很简单,git reset --hard HEAD 和 git reset --hard 有什么区别? 最佳答案 HEAD 在您未指定该参数时是隐含的。 但是,您可以
我使用 apollo-link-state 来本地存储错误,但清除缓存后出现以下错误。 我已在 apollo 客户端配置选项中将 errors 的默认值设置为空数组 []。 但是,在 apolloCl
我正在使用 bool 数组来存储标志(类似于“已更改”)。数组的大小是静态的,在编译时已知。 我需要定期重置数组,即将所有元素设置为 false。我应该使用常规数组和类似 memset 或 memcp
在 git 文档(和许多 SO 线程)中,推荐使用这种重置方法: $ git reset --soft HEAD^ ;# go back to WIP state $ git reset
在我的实验中,我没能发现两者之间的任何功能差异 git reset --hard 和 git reset --merge 使用说明也没有给出任何提示 --hard res
如何重置所有列过滤器?调用 reset() 似乎重置了表,但过滤器的所有字段保持不变。 最佳答案 您可以将输入值绑定(bind)到表的过滤器,如下所示: 注意 [value] 绑定(bind)。 关
使用 std::unique_ptr::reset,您可以轻松地将您的实例恢复到新状态。 C++11 之前,为了实现类似的行为,我看到很多类都定义了一个 Reset() 方法来重置其所有内部成员。但现
为了恢复工作树和索引中的更改,此答案 ( https://stackoverflow.com/a/5812972/8278160) 建议运行以下命令: git reset --hard 运行它是否与运
我目前正在测试竞技场。我本来以为这段代码会编译,但在运行时失败了,令人惊喜的是,编译器发现了这个问题。但我不知道它的推理是否正确。有人能给我解释一下吗?。错误:。来自umpalo的相关代码:
我目前正在测试竞技场。我本来以为这段代码会编译,但在运行时失败了,令人惊喜的是,编译器发现了这个问题。但我不知道它的推理是否正确。有人能给我解释一下吗?。错误:。来自umpalo的相关代码:
我正在尝试在不触发“重置”事件的情况下重置我的收藏。我已经设置了我的收藏来收听“重置”和“添加”事件 @.listenTo(@options.muses, 'add', @addOne) @.list
根据http://en.cppreference.com/w/cpp/memory/unique_ptr/reset , void reset( pointer ptr = pointer() );
我有一个别名,unstage,用于从暂存区域中删除更改。 unstage = reset -- 我注意到 git 的帮助建议改为 git reset HEAD。我还注意到 git rm --cache
这个问题在这里已经有了答案: What's the difference between HEAD^ and HEAD~ in Git? (17 个答案) 关闭 6 年前。 git reset --
我是一名优秀的程序员,十分优秀!