繁体   English   中英

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

[英]Java <-> C# Socket: cant receive messages

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

我的工作流程

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

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);

我已经尝试过双方的等待。 我没有得到任何例外或错误,所以我真的不知道我的问题在哪里。

谢谢

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM