1

サーバーが Ruby 上にあり、クライアントが Scala 上にある場合、TCPSocket 経由でデータを送信する際に問題があります。

Scala は常に で停止しin.readInt()ます。デッドロックのように見えますが、Ruby サーバーはスレッドを使用して実行されています。

Ruby がクライアントで Scala がサーバーの場合は問題ありません。

ルビー:

require 'socket'
require 'rjb'

Rjb.load("#{ENV['SCALA_HOME']}/lib/scala-library.jar:scala.jar")
Rjb.primitive_conversion = true

ScalaObject = Rjb.import('ruby.ScalaObject')

@port = nil

t = Thread.new do
  server = TCPServer.new(0)
  @port = server.addr[1]

  connection = server.accept

  puts "ruby: received #{connection.read(4).unpack('l>').first}"

  to_send = 5
  puts "ruby: sending #{to_send}"
  connection.write([to_send].pack('l>'))
  connection.flush
end

while @port.nil?
  sleep(0.1)
end

ScalaObject.start(@port)

t.join

スカラ:

package ruby

import java.io._
import java.net._

object ScalaObject {
  def start(port: Int) {
    val socket = new Socket("localhost", port)

    val out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream, 65536))
    val in = new DataInputStream(new BufferedInputStream(socket.getInputStream, 65536))

    val to_send = 4
    println("scala: sending " + to_send.toString())

    out.writeInt(to_send)
    out.flush()

    println("scala: received " + in.readInt())
  }
}
4

0 に答える 0