2016-08-30 145 views
3

我正在構建一個聊天應用程序。我有一個客戶端(Ionic 2)與服務器(Java)交談。客戶端可以從服務器成功接收消息(例如,在連接時收到"Welcome to the chat!"),但是當我嘗試從客戶端向服務器發送消息時,它不會到達那裏(事件中沒有調用DataListener<Message>)。 。Sockets.io接收但不發送消息

有什麼建議嗎?

服務器代碼:

import com.corundumstudio.socketio.AckRequest; 
import com.corundumstudio.socketio.Configuration; 
import com.corundumstudio.socketio.SocketIOClient; 
import com.corundumstudio.socketio.SocketIOServer; 
import com.corundumstudio.socketio.listener.ConnectListener; 
import com.corundumstudio.socketio.listener.DataListener; 
import com.corundumstudio.socketio.listener.DisconnectListener; 

public class Server { 

    public static void main(String[] args) { 
     Configuration config = new Configuration(); 
     config.setHostname("localhost"); 
     config.setPort(3700); 
     final SocketIOServer server = new SocketIOServer(config); 

     server.addConnectListener(new ConnectListener() { 
      @Override 
      public void onConnect(SocketIOClient client) { 
       System.out.println("onConnected"); 
       client.sendEvent("chat_message:message", new Message("Welcome to the chat!")); 
      } 
     }); 

     server.addDisconnectListener(new DisconnectListener() { 
      @Override 
      public void onDisconnect(SocketIOClient client) { 
       System.out.println("onDisconnected"); 
      } 
     }); 

     server.addEventListener("chat_message:send", Message.class, new DataListener<Message>() { 
      @Override 
      public void onData(SocketIOClient client, Message data, AckRequest ackSender) throws Exception { 
       System.out.println("onSend: " + data.toString()); 
       server.getBroadcastOperations().sendEvent("chat_message:message", data); 
      } 
     }); 

     System.out.println("Starting server..."); 
     server.start(); 
     System.out.println("Server started"); 

    } 
} 

public class Message { 
    private String message; 

    public Message(String message) { 
     this.message = message; 
    } 

    public String getMessage() { 
     return message; 
    } 
    public void setMessage(String message) { 
     this.message = message; 
    } 
} 

客戶端代碼:

import { Component, NgZone } from '@angular/core'; 
import { Http } from "@angular/http"; 
import { MessageModel } from '../model/messageModel'; 
import { UtilityService } from '../utils/utilityService'; 
declare var io; 

@Component({ 
    templateUrl: 'build/pages/chat/chat.html', 
    providers: [UtilityService] 
}) 

export class ChatPage { 

    private socketHost: string = "http://localhost:3700"; 
    private messages: MessageModel[] = []; 
    private zone: NgZone = null; 
    private chatBox: string = null; 
    private socket: any = null; 
    private utilityService: UtilityService = null; 

    constructor(http: Http, utilityService: UtilityService) { 
    this.utilityService = utilityService; 
    this.setUpMessageService(http); 
    } 

    setUpMessageService(http: Http): void { 
    this.messages = []; 
    this.zone = new NgZone({ enableLongStackTrace: false }); 
    let url = this.socketHost + "/fetch"; 

    http.get(url).subscribe((success) => { 
     var data = success.json(); 
     console.log(data); 
     for (var i = 0; i < data.length; i++) { 
     this.messages.push(data[i].message); 
     } 
    }, (error) => { 
     console.log(JSON.stringify(error)); 
    }); 
    this.chatBox = ""; 

    this.socket = io(this.socketHost); 
    this.socket.on("chat_message:message", (messageModel: MessageModel) => { 
     this.zone.run(() => { 
     console.log('run: ' + messageModel); 
     this.messages.push(messageModel); 
     }); 
    }); 
    } 

    send(msg) { 
    if (msg && msg != "") { 
     let messageModel: MessageModel = new MessageModel(); 
     messageModel.message = msg; 
     console.log(messageModel); 
     this.socket.emit("chat_message:send", messageModel); 
    } 
    this.chatBox = ""; 
    } 
} 

import { Injectable } from "@angular/core"; 

    @Injectable() 
    export class MessageModel { 
      public message: string = null; 
    } 

回答

0

如果我將消息作爲字符串發送,而不是來自客戶端的MessageModel,它就起作用。