【问题标题】:Java C# socket communicationJava C# 套接字通信
【发布时间】:2021-06-20 19:34:02
【问题描述】:

我正在处理 Java-C# 套接字通信,我想定期将 C# 对象的坐标发送到 java。问题是当我关闭连接时,java 客户端 Stream 只读取坐标(20 英里长的缓冲区)。我希望连接保持打开状态并更新坐标,而不必一直打开和关闭此连接。 附言这是可行的,但我以某种方式删除了以前使用的 C# 脚本,现在我无法弄清楚。

Java LocationRequester,将connect 发送到服务器,然后定期调用getline() 并将其传递给坐标。连接部分有效,getline() 只有在我关闭连接时才能完成,否则它会挂起。当我关闭连接时,我会得到一排超长的坐标。

public Socket clientSocket;
BufferedReader inputBuff;
String hostName;
int hostPort;

public LocationListener(String host, int port) {
    hostName = host;
    hostPort = port;
}

public void connect()
{           
    try {
         clientSocket = new Socket(hostName, hostPort);
         System.out.println("Connected to"+clientSocket.toString());
        InputStream input = clientSocket.getInputStream();
        InputStreamReader reader = new InputStreamReader(input);
        inputBuff = new BufferedReader(reader);
        String str;
    }
     catch(IOException e)
    {
        e.printStackTrace();
    }
}

public String getLine() {           
    String rstring = "";
    try {
        rstring = inputBuff.readLine();
        System.out.println(rstring);
    }
    catch(IOException e) {
         e.printStackTrace();
    }
    return rstring;
}

C# 代码似乎是问题所在。

    private void Start()
    {
        IPAddress address = IPAddress.Any;
        server = new TcpListener(address, 9999);
        server.Start();

        client = server.AcceptTcpClient();
        StartCoroutine(SendCords());
    }

    private IEnumerator SendCords()
    {
        while (true)
        {
            yield return new WaitForSeconds(0.5f);
            NetworkStream stream = client.GetStream();
            byte[] msg = System.Text.Encoding.ASCII.GetBytes(transform.position.ToString());
            stream.Write(msg, 0, msg.Length);
            stream.Flush();
            // client.Close();
            Debug.Log("Sending "+transform.position);
            
        }
    }

【问题讨论】:

    标签: java c# sockets


    【解决方案1】:

    java 代码正在读取一行。这意味着它将阻塞,直到它得到一个换行符'\n'。而且我猜您的 C# 代码没有添加换行符。在我看来,如果你在最后添加一个换行符,到你的 C# 消息负载中,java 代码应该得到信息并退出等待。试一试。

    【讨论】:

      【解决方案2】:

      @ferosekhanj 已经说得很好。我补充说BufferedReader.readLine() 的函数将在'\n' 和EOF 处停止读取。这就是为什么当你的 C# 程序关闭 Socket 时,你的 java 程序会收到一排超长的坐标。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-25
        • 2012-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多