用React native从Android模拟器连接Scala Websocket



我最近正在用React Native v40和Expo v40开发一个聊天应用程序。一切工作正常,但我不能连接到我的Scala(2.13.3) Websocket。Socket是用Play(2.8)构建的

更清楚:

Client.ts

var wsUri = "ws://localhost:9000/ws";
let websocket: WebSocket
export function init() {
testWebSocket();
}
function testWebSocket() {
websocket = new WebSocket(wsUri);
websocket.onopen = function (evt: Event) { onOpen(evt) };
websocket.onclose = function (evt: Event) { onClose(evt) };
websocket.onmessage = function (evt: MessageEvent<string>) { onMessage(evt) };
websocket.onerror = function (evt: Event) { onError(evt) };
}
function onOpen(evt: Event) {
doSend("Hello world");
}
function onClose(evt: Event) {
console.log("closing connection")
}
function onMessage(evt: MessageEvent<string>) {
console.log(evt.data)
}
function onError(evt: Event) {
console.error(evt)
}
export function doSend(message: string) {
websocket.send(message);
}

我的Scala Websocket是这样的:

Controller.scala:

def ws: WebSocket = WebSocket.accept[String, String] { request =>
ActorFlow.actorRef { out =>
ChatMessagingActor.props(out)
}
}

我的演员:

object ChatMessagingActor {
def props(clientActorRef: ActorRef) = Props(new ChatMessagingActor(clientActorRef))
}
class ChatMessagingActor(clientActorRef: ActorRef) extends Actor {
val logger: Logger = play.api.Logger(getClass)
override def receive: Receive = {
case msg: String =>
println(msg)
clientActorRef ! msg
case None =>
clientActorRef ! s"Closing the connection as requested"
self ! PoisonPill
}
override def postStop(): Unit = println("Closing Messaging Socket")
}

那么现在的问题是什么?

当我启动模拟器(甚至我的物理设备)时,我收到以下错误

Object { isTrusted: false, message: "Failed to connect to localhost/127.0.0.1:9000" }

,连接立即关闭

当我尝试通过浏览器连接时,我没有得到任何错误。

到目前为止我试过了吗?
  1. 我尝试连接到wss://echo.websocket.org工作很好
  2. 我尝试了一个基本的html js页面连接到websocket,其中
  3. 我更改了客户端的套接字地址。ts到ws://127.0.0.1:9000/ws

我想这可能是一个安全问题,但我不太确定。我是错过了Scala的一些政策变化,还是这是Android的事情?任何帮助都将不胜感激。谢谢你的时间:)

解决问题:

我改变了Url (var wsUri)从本地主机到我的私人ip地址(我仍然不知道为什么这会起作用:D)

最新更新