首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >服务器/客户端模式问题

服务器/客户端模式问题
EN

Stack Overflow用户
提问于 2009-09-09 12:51:24
回答 1查看 334关注 0票数 1

我试图在服务器/客户端模式下使用KirbyBase (在Ruby中),并且有一些问题.下面是设置(我正在使用一个特定的嵌入式linux系统(在文章底部解释),但是,为了参数起见,我将调用那些PC )。

  • 使用NFS安装在网络上的NAS驱动器的2台PC(安装在/mnt/sharedSpace上),一个是服务器,另一个是客户端.
  • 我以前在/mnt/sharedSpace/data中创建了两个名为“history.tbl”和“registeredTags.tbl”的表

以下是服务器代码:

代码语言:javascript
复制
# Multi-user server script for KirbyBase.

require 'DatabaseObjects.rb'
include DatabaseObjects
require 'kirbybase'
require 'drb'

puts 'Initializing database server and indexes...'

# Create an instance of the database.
db = KirbyBase.new(:server,nil,nil,'/mnt/sharedSpace/data/')

DRb.start_service('druby://:44444', db)

puts 'Server ready to receive connections...'

DRb.thread.join

下面是客户端代码:

代码语言:javascript
复制
#draft.rb
require 'kirbybase'
require 'DatabaseObjects.rb'
require 'drb'
include DatabaseObjects
begin
    db = KirbyBase.new(:client, '192.168.1.11', 44444)
    if db.table_exists?(:registeredTags)
        puts "found table"
        registeredTagsTable = db.get_table(:registeredTags)
        puts "got table"
        puts registeredTagsTable.select().to_report
    else
        puts "couldnt found table"
    end
rescue Exception => sp
    puts sp.message
    puts sp.backtrace.inspect
end

我启动服务器,它打印“服务器就绪.”然后在另一台机器上启动客户端代码,下面是我得到的信息:

代码语言:javascript
复制
undefined method `close' for nil:NilClass
["(druby://192.168.1.11:44444) /usr/lib/ruby/1.8/kirbybase.rb:1765:in `with_table'", "(druby://192.168.1.11:44444) /usr/lib/ruby/1.8/kirbybase.rb:992:in `get_header_vars'", "/usr/lib/ruby/1.8/kirbybase.rb:3112:in `update_header_vars'", "/usr/lib/ruby/1.8/kirbybase.rb:2026:in `initialize'", "/usr/lib/ruby/1.8/kirbybase.rb:2002:in `new'", "/usr/lib/ruby/1.8/kirbybase.rb:2002:in `create_called_from_database_instance'", "/usr/lib/ruby/1.8/kirbybase.rb:463:in `initialize'", "/usr/lib/ruby/1.8/kirbybase.rb:461:in `each'", "/usr/lib/ruby/1.8/kirbybase.rb:461:in `initialize'", "draft.rb:6:in `new'", "draft.rb:6"]

但是,如果在服务器代码运行的同一台机器上启动相同的客户端代码,一切都会顺利进行,并打印表内容。有什么主意.?

一些人要求的系统解释:我正在使用的设备是一台智能RFID阅读器,带有一台基于嵌入式linux arm的机上计算机。唯一的api/语言制造商允许并提供(w/o脱离许可条款)是ruby,他们不支持安装额外的东西,他们已经在设备中定制内核,使安装/编译尽可能困难。如果它们只是.rb库文件,我可以使用额外的红宝石文件--也就是说,我可以轻松地将它们包含在代码中,但是任何需要编译的内容都是不需要编译的。而且,这个系统没有创业板。

Edit2:响应第一个答案,我已经更改了上述功能如下:

代码语言:javascript
复制
def with_table(table, access='r')
    begin
        yield fptr = open(table.filename, access)
    ensure
        if !fptr.nil? then
                fptr.close
            end
    end
end

现在我发现了一个错误:

代码语言:javascript
复制
druby://localhost.localdomain:1027 - #<Errno::ECONNREFUSED: Connection refused - connect(2)>
["(druby://192.168.1.22:44444) /usr/lib/ruby/1.8/drb/drb.rb:736:in `open'", "(druby://192.168.1.22:44444) /usr/lib/ruby/1.8/drb/drb.rb:729:in `each'", "(druby://192.168.1.22:44444) /usr/lib/ruby/1.8/drb/drb.rb:729:in `open'", "(druby://192.168.1.22:44444) /usr/lib/ruby/1.8/drb/drb.rb:1196:in `initialize'", "(druby://192.168.1.22:44444) /usr/lib/ruby/1.8/drb/drb.rb:1176:in `new'", "(druby://192.168.1.22:44444) /usr/lib/ruby/1.8/drb/drb.rb:1176:in `open'", "(druby://192.168.1.22:44444) /usr/lib/ruby/1.8/drb/drb.rb:1092:in `method_missing'", "(druby://192.168.1.22:44444) /usr/lib/ruby/1.8/drb/drb.rb:1110:in `with_friend'", "(druby://192.168.1.22:44444) /usr/lib/ruby/1.8/drb/drb.rb:1091:in `method_missing'", "(druby://192.168.1.22:44444) /usr/lib/ruby/1.8/kirbybase.rb:1763:in `with_table'", "(druby://192.168.1.22:44444) /usr/lib/ruby/1.8/kirbybase.rb:992:in `get_header_vars'", "/usr/lib/ruby/1.8/kirbybase.rb:3114:in `update_header_vars'", "/usr/lib/ruby/1.8/kirbybase.rb:2028:in `initialize'", "/usr/lib/ruby/1.8/kirbybase.rb:2004:in `new'", "/usr/lib/ruby/1.8/kirbybase.rb:2004:in `create_called_from_database_instance'", "/usr/lib/ruby/1.8/kirbybase.rb:463:in `initialize'", "/usr/lib/ruby/1.8/kirbybase.rb:461:in `each'", "/usr/lib/ruby/1.8/kirbybase.rb:461:in `initialize'", "draft.rb:6:in `new'", "draft.rb:6"]
EN

回答 1

Stack Overflow用户

发布于 2009-09-09 21:57:03

Inside KirbyBase.new()参见with_table

代码语言:javascript
复制
def with_table(table, access='r')
    begin
        yield fptr = open(table.filename, access)
    ensure
        fptr.close
    end
end

我认为,正在发生的事情是,open()正在返回nil,而with_table调用站点中的相关块正在获取nil fptr,并试图在get_header_vars中删除nil。然后,随后的异常回滚回with_table,然后再尝试删除fptr,调用close,生成一个未获救的最终异常。

现在,我说open()返回的是nil,而不是open()失败,因为(参见打开(内核))当path是管道时,子节点总是返回nil,而父函数应该忽略它。因此,接下来要做的事情是开始调试KirbyBase的内部,并找出它是您的问题还是KirbyBase问题。我希望我已经帮你启动了。

调试这一点的一种方法是通过对KirbyBase进行猴子切换。如果您希望读取您自己的源代码副本,请在有gem的开发主机上执行以下操作:

代码语言:javascript
复制
gem fetch KirbyBase
mkdir t
gem unpack --target=t/. KirbyBase*
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1399500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档