2012-03-28 64 views
4

我需要我自己寫的java服務器和C#客戶端之間的套接字通信,問題是,C#客戶端無法收到來自我的Java服務器的任何消息,但將消息發送到我的Java服務器工作。的Java <-> C#插座:不能接收郵件

我的工作流程:

  1. 的Java:創建服務器
  2. 的Java:等待客戶端連接
  3. C#:創建客戶端
  4. C#:建立到服務器的連接
  5. C#:發送msg到服務器
  6. Java:msg收到
  7. java:發送消息到c #客戶端
  8. c#:從服務器接收msg < - 這是客戶端等待消息但從未獲取的點。

Java服務器代碼:

public class Communicator { 

    private int m_port; 
    private Socket m_socket; 
    private ServerSocket m_serverSocket; 

    public Communicator(int port) { 
     this.m_port = port; 
     initConnection(); 
    } 

    private void initConnection() { 

     try { 
      System.out.println("Creating Server"); 
      m_serverSocket = new ServerSocket(m_port); 
      System.out.println("Waiting for client connection"); 
      m_socket = m_serverSocket.accept(); 
      System.out.println("Connection made"); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public String sendMsg(JSONMessage msg) { 
     try { 

    //get msg 
    BufferedReader bufferedReader = new BufferedReader(
      new InputStreamReader(m_socket.getInputStream())); 
    System.out.println("Waiting for msg..."); 
     String answer = bufferedReader.readLine(); 
     System.out.println("Received: " + answer); 

     //send msg 
     PrintWriter writer = new PrintWriter(m_socket.getOutputStream(),true); 
     writer.print(msg.getMsg()); 
     System.out.println("Sending: " + msg.getMsg()); 

     writer.flush(); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

     return ""; 
    } 

} 

我的C#的客戶端代碼:

class Communicator 
    { 
     private int m_port; 
     private Thread mainThread; 

     public Communicator(int port) 
     { 
      m_port = port; 
      mainThread = new Thread(new ThreadStart(this.initConnection)); 
      mainThread.Start(); 
     } 

     public void initConnection() 
     { 
      IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), m_port); 
      Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

      try 
      { 
       Console.WriteLine("Trying to build connection"); 
       server.Connect(ip); 
       Console.WriteLine("Connection successful"); 

       NetworkStream ns = new NetworkStream(server); 
       StreamReader sr = new StreamReader(ns); 
       StreamWriter sw = new StreamWriter(ns); 
       string data; 

       string welcome = "Hello"; 
       Console.WriteLine("Sending: " + welcome); 
       sw.WriteLine(welcome); 
       sw.Flush(); 

       Console.WriteLine("Receiving..."); 
       data = sr.ReadLine(); 
       // --> NEVER REACHING THIS POINT <--- 
       Console.WriteLine("Received: " + data);           

      } 
      catch (SocketException e) 
      { 
       Console.WriteLine("Connection failed."); 
       return; 
      } 

     } 
    } 

是否有人有任何想法,爲什麼它從來沒有達到我的客戶端代碼Console.WriteLine("Received: " + data);

我已經嘗試過在兩邊等待。我沒有得到任何例外或錯誤,所以我不知道我的問題在哪裏。

感謝

回答

2

您需要使用println(),它會添加一個新行而不是print()。在Java中,readLine等待一個新行,我期望它在C#中執行相同的操作。另外println會自動刷新,所以你不需要刷新。

如果您打算使用此連接mreo而不是一次,則需要保留連接的BufferedReader和PrintWriter。 (所以我建議你在創建/接受套接字之後創建這些套接字)爲同一個套接字多次創建這些套接字可能容易出錯並且令人困惑。

4

如果你的接收機期待,你的發送者發送。你的發送者不發送線路,所以接收者一直等待,直到收到一個。

爲了避免將來出現這些問題,您應該始終制定一份說明文件,說明您的協議如何工作,理想情況下是在字節級。它應指定協議是否包含消息,如果是,發送方如何標記消息邊界以及接收方如何識別它們。

在這裏,您的接收器通過查找行尾來識別消息邊界。但是你的發件人不會用行尾標記消息邊界。所以接收者一直等待。

如果你有一個協議規範,這將是顯而易見的。將來,我強烈建議您花時間指定您實施的每個協議。

+0

更改爲writer.println(msg.getMsg());或者使用sr.在C#中沒有ReadLine。 – weismat 2012-03-28 06:57:54

+0

如果他使用'sr.Read',他將無法識別消息邊界。這取決於他在做什麼可能或不重要。 – 2012-03-28 06:59:23

+0

如果Java服務器也有Java客戶端,那麼他需要更改C#客戶端,而不是Java服務器。使用JSON,它應該是相當直接的,以確定是否是有效的JSON消息。 – weismat 2012-03-28 07:10:08