Java< - > C#套接字:无法接收消息

时间:2012-03-28 06:51:49

标签: c# java sockets tcp message

我需要在我自己编写的java服务器和C#客户端之间进行套接字通信,问题是C#客户端无法从我的java服务器接收任何消息,但是发送邮件到我的java服务器。

我的工作流程:

  1. Java:创建服务器
  2. Java:等待客户端连接
  3. c#:创建客户端
  4. c#:构建与服务器的连接
  5. c#:向服务器发送一个msg
  6. Java:msg已收到
  7. java:将msg发送到c#client
  8. c#:从服务器接收消息< - 这是客户端等待消息但从未得到的消息。
  9. Java Server代码:

    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 个答案:

答案 0 :(得分:4)

如果您的接收方需要,则您的发件人必须发送。您的发件人不会发送线路,因此接收方会一直等到它为止。

为了避免将来出现这些问题,您应该始终制作一份规范文档,说明协议的工作原理,最好是在字节级别。它应指定协议是否包含消息,如果是,则指示发送方如何标记消息边界以及接收方如何识别它们。

此处,您的接收方通过查找行结尾来识别消息边界。但是您的发件人不会使用行结尾标记邮件边界。所以接收器永远等待。

如果您有协议规范,这将是显而易见的。将来,我强烈建议您花时间指定您实施的每个协议。

答案 1 :(得分:2)

您需要使用println()添加新行而不是print()。在Java中,readLine等待一个新行,我希望它在C#中也能这样做。 println也会自动刷新,所以你也不需要刷新。

如果您打算使用此连接mreo而不是一次,则需要保留BufferedReader和PrintWriter以进行连接。 (所以我建议你在创建/接受套接字后创建它们)为同一个套接字多次创建这些可能容易出错并且容易混淆。