如果服务器在 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())
}
}