我正在为纸牌游戏构建原型,我有一个网络版本的游戏,其中我连接到socket.io。在所有主流浏览器上都可以正常工作。
网络应用版本中的代码
import io from 'socket.io-client'
export const connectToSocket = (uid, cb) => {
socket = io.connect(domain, { path: '/api/v1/streams/socket/', query: 'token='+uid})
socket.on('connect', function(){
console.log('Socket connected')
});
socket.on('message', function(data){
cb([null,JSON.parse(data)])
});
socket.on('connect_error', err => cb([err, null]))
socket.on('disconnect', function(){cb([400, null])});
}
但是,当我尝试通过react native连接时,我会收到错误消息
收到的数据不是字符串,或者不是公认的编码。
反应本机代码
import io from 'socket.io-client'
let socket
export const connectToSocket = (uid, cb) => {
socket = io.connect({path: '/api/v1/streams/socket/', query: `token=${uid}`})
}
我已经阅读了关于stackoverflow和git的所有文章,在我看来,几乎每个人都可以使用的解决方案是强制Websocket传输而不是池化。例如:
socket = io.connect({path: '/api/v1/streams/socket/', query: `token=${uid}`, transports: ['websocket']})
但是此解决方案不适用于我。我知道后端可以正常运行,因为Web应用程序版本可以连接。另外,当我发送带有本机响应的连接请求时,服务器端会记录它应该记录的内容。
尽管服务器端工作正常,但这是连接事件的代码
func (s *sockets) socketHandleConnectionEvent(so socketio.Socket) {
token := so.Request().URL.Query().Get("token")
uid, err := g.f.verifyToken(token)
if err != nil {
fmt.Println("Could not verify token")
return
}
//Connect user
s.clients.set(uid, so)
// Check if player is currently in a room
inRoom, roomID, err := IsPlayerInRoom(uid)
if err != nil {
fmt.Println("Error: Checking player is in room")
}
if inRoom == true {
fmt.Println("REJOINING ROOM")
so.Join(roomID)
SendCurrentGameState(roomID, uid)
return
}
gameID, gameStarted := GenerateRoom(uid)
so.Join(gameID)
SendCurrentGameState(gameID, uid)
if gameStarted {
s.addTimer(gameID, uid)
}
return
}