Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';为java程序制作本地远程服务器的最简单方法是什么?_Java_Sockets_Server_Client_Inputstream - Fatal编程技术网

什么';为java程序制作本地远程服务器的最简单方法是什么?

什么';为java程序制作本地远程服务器的最简单方法是什么?,java,sockets,server,client,inputstream,Java,Sockets,Server,Client,Inputstream,我试图为java程序创建一个远程客户端,我读过关于套接字的文章,但似乎有几种协议和方法 基本上,我只希望能够在应用程序的客户机部分按下按钮,并在本地激活服务器部分的相关功能 我想我应该在一个单独的线程中监听套接字,然后传输/读取字符串,以了解推送了什么?主要是为了学习 我想要一些建议/快速解释,以了解如何实现这一点,我已经看到了基本的客户机-服务器通信示例,但我没有发现任何关于如何实现这一点的明确信息(新线程与否?),显然我似乎没有完全理解inputstream/outputstream的概念

我试图为java程序创建一个远程客户端,我读过关于套接字的文章,但似乎有几种协议和方法

基本上,我只希望能够在应用程序的客户机部分按下按钮,并在本地激活服务器部分的相关功能

我想我应该在一个单独的线程中监听套接字,然后传输/读取字符串,以了解推送了什么?主要是为了学习

我想要一些建议/快速解释,以了解如何实现这一点,我已经看到了基本的客户机-服务器通信示例,但我没有发现任何关于如何实现这一点的明确信息(新线程与否?),显然我似乎没有完全理解inputstream/outputstream的概念

通过实际实现客户端程序和服务器端程序:)

为了理解这一点,您需要一些关于服务器端编程基础知识的信息。让我们以一个基本的web/应用程序服务器为例。阿帕奇猫。你将使你的前端(图形用户界面等…)如你所愿,让我们假设你做了一个按钮,说:“点击我,我会说你好!”

当我们点击该按钮时,您需要启动一个函数(如果它是一个web应用程序,则将使用Javascript),该函数将向服务器发送消息或“请求”。服务器接收该请求,对其进行处理并发送包含数据的“响应”

在java web项目中,您可以将某些URL(如www.example.com/hello)映射到包含代码的特定类(servlet或端点)。通常,您也会将数据片段附加到“请求”中,以便服务器处理

让我们以登记表为例。您将创建几个输入字段,当我们单击submit时,这些字段中的数据将附加到请求并发送到服务器。在服务器端,我们将接收一个请求对象(例如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轻松访问we中的数据


但要开始,请尝试从一个简单的tomcat项目开始,并查看servlet、servlet映射

让两个Java应用程序(一个服务器和一个客户机)相互通信的一种非常简单的方法是使用(RMI),尤其是在同一台机器上。RMI允许在Java应用程序之间共享对象,这意味着,它是一种非常高级的通信抽象,不需要编写自定义网络代码或处理涉及的并发性

下面是一个非常基本的例子:

步骤1:创建一个公共接口 创建一个描述th服务器提供的功能的通用接口:

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
,并且每个方法必须能够抛出
java.rmi.RemoteException
。将其放入库中,并在服务器和客户端中使用该库。这是如何实现的,取决于您使用的IDE。最简单的方法可能是将服务器、客户端和公共库放在同一个项目中

步骤2:创建服务器应用程序 在服务器应用程序中创建公共接口的实现:

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());
    }

}
步骤3:创建客户端应用程序 创建实际的客户端应用程序,该应用程序连接到端口
1234
上的服务器,并使用名称
remoteControl
检索已发布的
RemoteControlInterface
实例

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");
    }

}
这将导致服务器应用程序在其控制台上打印请求helloWorld的
远程控制

公共接口中所有方法的参数和返回值可以是:

  • 任何基本Java类型(布尔、int、…)
  • 两个应用程序共享的实现
    java.io.Serializable
    的任何类(字符串、日期等),只要两个应用程序具有相同版本的相应类文件。这封信适用于JRE提供的所有类以及放置在公共库中的所有类

虽然RMI可以做得更多,但这应该足以实现一个简单的远程控制。

非常感谢,我需要深入了解这一点,您的解释已经让事情更清楚了。虽然这让我对客户端/服务器编程有了一些了解,但我很难了解如何将其应用到我的具体案例中。首先,我不明白为什么我应该使用URL在本地设置而不是IPs中将数据从一个程序发送到另一个程序,然后我仍然不确定在服务器和客户端上以什么顺序打开什么,是否应该在单独的线程中进行(服务器在等待输入时不允许空闲);此外,关于tomcat/apache项目,我真的不确定是否放弃java,在我甚至不太熟悉的环境中尝试一些东西,以实现我可能无法在java中复制的东西,这是我继续进行的最佳方式。如果您在使用url发送数据时遇到问题,说明您处于本地设置,那么为什么要使用服务器/客户端设置呢?只需创建一个标准的桌面应用程序,而不是同时使用服务器和客户端。有了tomcat,你就不是droppi了