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