我试图让客户端远程访问java程序,我已经阅读了有关套接字的内容,但似乎有几种协议和方法。
基本上我只是希望能够在应用程序的客户端部分按下按钮并激活本地服务器部分的相关功能。
我想我应该在单独的线程中监听套接字并传输/读取字符串以了解推送的内容?它主要用于学习目的。
我想知道如何实现这一点的一些建议/快速解释,我已经看到了基本的客户端服务器通信的例子,但我没有找到关于如何做到这一点的任何事情。 (新线程与否?)显然我似乎并不完全理解inputstream / outputstream的概念。
答案 0 :(得分:2)
让两个Java应用程序(服务器和客户端)相互通信的一种非常简单的方法是使用Remote Method Invocation(RMI),尤其是在同一台机器上。 RMI允许在Java应用程序之间共享对象,这意味着它是一种非常高级的通信抽象,并且无需编写自定义网络代码或处理所涉及的并发。
这是一个非常基本的例子:
创建一个描述服务器提供的功能的通用接口:
package com.example.remote;
import java.io.Serializable;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface RemoteControlInterface extends Remote, Serializable {
public void sendCommand(String command) throws RemoteException;
}
此界面必须扩展java.rmi.Remote
和java.io.Serializable
,并且每个methot都必须能够投放java.rmi.RemoteException
。把它放在一个库中,并在服务器和客户端中使用这个库。如何实现,取决于您使用的IDE。最简单的方法可能是将服务器,客户端和公共库放在同一个项目中。
在服务器应用程序中创建公共接口的实现:
package com.example.remote.server;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import com.example.remote.RemoteControlInterface;
public class RemoteControl extends UnicastRemoteObject implements RemoteControlInterface {
private static final long serialVersionUID = 1L;
protected RemoteControl() throws RemoteException {
}
@Override
public void sendCommand(String command) throws RemoteException {
System.out.println("remote control asked for " + command);
}
}
公共接口的实现必须扩展java.rmi.server.UnicastRemoteObject
。
创建实际的服务器应用程序,该应用程序将RemoteControlInterface
的实现实例作为remoteControl
发布为正在侦听端口1234
的服务器。
package com.example.remote.server;
import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class Server {
public static void main(String[] args) throws MalformedURLException, RemoteException, AlreadyBoundException {
Registry registry = LocateRegistry.createRegistry(1234);
registry.bind("remoteControl", new RemoteControl());
}
}
创建连接到端口1234
上的服务器的实际客户端应用程序,并使用名称RemoteControlInterface
检索已发布的remoteControl
实例。
package com.example.remote.client;
import java.rmi.AccessException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import com.example.remote.RemoteControlInterface;
public class Client {
public static void main(String[] args) throws AccessException, RemoteException, NotBoundException {
Registry registry = LocateRegistry.getRegistry(1234);
RemoteControlInterface greetingService = (RemoteControlInterface) registry.lookup("remoteControl");
greetingService.sendCommand("helloWorld");
}
}
这将导致服务器应用程序在其控制台上打印remote control asked for helloWorld
。
公共接口中所有方法的参数和返回值可能是:
java.io.Serializable
。对于JRE提供的所有类以及放置在公共库中的所有类,该字母都是正确的。虽然RMI可以做得更多,但这应该足以实现一个简单的遥控器。
答案 1 :(得分:0)
好吧,
通过实际实现客户端程序和服务器端程序:)
为了理解这一点,您需要一些有关服务器端编程基础知识的信息。让我们采取一个基本的Web /应用程序服务器。 Apache tomcat。你会像你想要的那样制作你的前面(gui等等),让我们说你按下一个按钮,说“点击我,我会打招呼!”
当我们点击该按钮时,您需要启动一个功能(如果它是一个Web应用程序,这将是Javascript),它将向服务器发送消息或“请求”。服务器接收此请求,处理它并发送包含数据的“响应”。
在java web项目中,您将某些URL(例如www.example.com/hello)映射到包含代码(servlet或端点)的某些类。通常,您还会将数据片段附加到您的“请求”中,以便服务器执行某些操作。
让我们以登记表格为例。您将创建多个输入字段,当我们单击提交时,这些字段中的数据将附加到请求并发送到服务器。在服务器端,我们将收到一个请求对象(例如javax.servlet.httpservletrequest)。从这个对象我们可以打开一个数据流并读取附加到它的数据。
通常(没有框架或JSON库的帮助)可以做:
InputStream inputStream = request.getInputStream();
if (inputStream != null) {
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
char[] charBuffer = new char[128];
int bytesRead = -1;
while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
stringBuilder.append(charBuffer, 0, bytesRead);
}
获取数据后,对其执行某些操作,然后通过httpresponse对象发送响应。这是服务器端计算的基础。还有很多其他内容,例如向服务器发送异步请求。使用对象表示法来简化对请求的读取,使用REST轻松访问我们的数据。
但要开始尝试从一个简单的tomcat项目开始,并查看servlet,servlet映射ec。