Java NoMethodError:未定义的方法'bytesize';西纳特拉

Java NoMethodError:未定义的方法'bytesize';西纳特拉,java,ruby,sinatra,nomethoderror,Java,Ruby,Sinatra,Nomethoderror,当我试图通过java连接到我的ruby sinatra服务器时,我得到了错误NoMethodError:undefined方法'bytesize' 这是我的ruby代码,我想我需要某种方法,在客户端连接时运行,但我不确定: require 'sinatra' get '/hello' do 'this page displays hello' end get '/' do 'this page is the main page' end 下面是我的java应用程序的代码: private

当我试图通过java连接到我的ruby sinatra服务器时,我得到了错误
NoMethodError:undefined方法'bytesize'

这是我的ruby代码,我想我需要某种方法,在客户端连接时运行,但我不确定:

require 'sinatra'

get '/hello' do
'this page displays hello'
end

get '/' do
'this page is the main page'
end
下面是我的java应用程序的代码:

private static Socket connect;
private static OutputStream output;
private static InputStream input;

public static void main(String[] args) throws IOException {
    System.out.println("Connecting...");
    connect = new Socket(InetAddress.getByName("localhost"), 4567);
    System.out.println("Connected to: " + connect.getInetAddress().getHostName());

    output = new ObjectOutputStream(connect.getOutputStream());
    output.flush();

    //input = new ObjectInputStream(connect.getInputStream());
    System.out.println("Streams ready");
}

我猜这是因为以下代码中的
Rack
中出现了
theory
错误,再加上Ruby服务器的Java客户端调用中出现了
theory
错误:

# Return the bytesize of String; uses String#size under Ruby 1.8 and
# String#bytesize under 1.9.
if ''.respond_to?(:bytesize)
  def bytesize(string)
    string.bytesize
  end
else
  def bytesize(string)
    string.size
  end
end
module_function :bytesize
这在文件
lib/rack/utils.rb
中。。。Sinatra使用的,如下所示:

headers["Content-Length"] = body.inject(0) { |l, p| l + Rack::Utils.bytesize(p) }.to_s
这是在#finish方法中的文件
lib/sinatra/base.rb
中,在一个测试
计算内容长度的检查中

…无论如何,在#bytesize方法中,没有测试
string
是否为Nil。。。它只是在做一个测试,看看Ruby引擎本身是否支持#bytesize

换句话说,我猜你的身体是
Nil
,或者是一种不兼容的对象,它没有#bytesize方法,因为
Rack
不进行测试,它只是假设进入该方法的数据是好的,并纯粹基于底层引擎将方法调用传递给该对象。。。不基于用户代理。这是机架的理论错误

进一步排除故障,我猜Java代码中可能存在特定于用户的代理,而不是Ruby代码。甚至不是真正的用户代理,因为您似乎没有实例化“浏览器”,而只是打开一个套接字连接。我猜您实际上需要通过正式请求中的HTTP命令、RFC兼容协议等来调用服务器。。。因此,您需要发送语法正确的标题和正文

我见过这种情况发生在奇怪的客户机上,比如晦涩难懂的爬虫,它们不发送正确的头,或者只发送头而不发送正文。我进一步猜测,仅仅打开套接字连接是不够的。您需要向服务器发送标题和正文。我最后猜测,您可能会使用类似于
curl
wget
的Java库,而不仅仅是操作原始套接字。这将为您提供适当的协议聊天,并从Ruby/Sinatra端点返回您想要的内容。环顾一下这里,我发现:


当您通过浏览器访问Sinatra应用程序时,该应用程序是否正常工作?@Rospenman是的,工作完全正常。您认为该Java代码会发生什么情况?您没有发出任何HTTP请求。你为什么要使用
ObjectOutputStream
?@rospenman我想向服务器发送文本。你不能只打开一个套接字然后开始发送这样的数据,你需要创建一个正确的HTTP请求。使用这段代码,您只会得到与无效请求相关的服务器错误。是的。回到你的问题,我可以这样说:哪里有一个端点叫做?偶数“/”是在路径\信息头字段中显式调用的端点
Sinatra
Rack
下面没有任何东西可以创建响应。从技术上讲,这应该更优雅地失败,但它仍然可以通过使用实际的文本浏览器库(如我添加的链接)来解决。我看到Matt在更仔细地阅读了对原始问题的评论后也提到了这一点。