将Java客户端字符串发送到C#服务器

3
我对网络技术还很陌生,到目前为止,我已经成功让我的 Android 应用程序(客户端)与我的 Unity C# 服务器连接,但是在 Java 发送字符串和服务器解码它方面遇到了一些困难。
C# 客户端将读取输入,但当我记录客户端消息时,它是黑色的。所以我的最佳猜测是问题出在 Java 字符串编码或解码上。
请告诉我是否有人能够发现我的错误,或者是否有更好的建议来处理写入器和读取器。
非常感谢您的帮助!
java 客户端发送消息的线程
 import android.os.AsyncTask;
import android.util.Log;

import java.io.DataOutputStream;
import java.net.Socket;

public class SendMsgToServer extends AsyncTask<Socket, Void, Void> {


    @Override
    protected Void doInBackground(Socket... sockets) {

        Socket client = sockets[0];

        //Check Connection is established
        if (client.isConnected()){
            try {
                String msgToServer = "Pleasure doing business";
                DataOutputStream data = new DataOutputStream(client.getOutputStream());
                data.writeUTF(msgToServer);

                // Source: https://dev59.com/emXWa4cB1Zd3GeqPLUh5
//                PrintWriter outputMsg = new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())), true);
//                outputMsg.write("Message to the Server.");
                Log.d("Server", data.toString());

            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            Log.d("Server", "Server Connection is not established");
        }




        return null;
    }
}

C#服务器

using UnityEngine;
using System.Collections;
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Text;

public class clientTcp : MonoBehaviour {

    static bool socketReady = false;
    static TcpListener server = null;
    static NetworkStream networkStream;
    static StreamWriter writer; 
    static StreamReader reader;
    static Byte[] bytes = new Byte[256];
    static NetworkStream stream;
    static TcpClient client;
    String Host = "localhost";
    Int32 port = 13000;


    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {

    }
    public void setupSocketServer() {
            //Create thread to accept the connection ; else Unity crashes
        Thread acceptClient = new Thread(new ThreadStart(SocketClient));
        acceptClient.Start();


    }
    //msg is from the textfield
    public void writeSocket(string msg) {

        if (socketReady == false) {
            return;
        }
        String data = "hi";
        byte[] msgToClient = System.Text.Encoding.ASCII.GetBytes(data);
        stream.Write(msgToClient, 100, msg.Length);

    }

    public void readSocket() {

        Thread readClient = new Thread (new ThreadStart (ReadClient));
        readClient.Start ();

    }

    static void ReadClient() {
        Debug.Log ("ReadClient Thread started");

        // http://stackoverflow.com/questions/29265430/socket-communication-between-java-and-c-sharp-application

        int length = networkStream.ReadByte ();
        byte[] buffer = new byte[length];


        int size = networkStream.ReadByte ();
        byte[] buff = new byte[size];
        using (var memoryStream = new MemoryStream(buff,false)) {
            using (var streamReader = new StreamReader(memoryStream, Encoding.UTF8)) {
                var message = streamReader.ReadLine();
                buff = Encoding.UTF8.GetBytes(message);
                networkStream.Read(buffer, 0 ,buffer.Length);
                Debug.Log (message);
                networkStream.Flush();
            }

        }
    }


    //Thread to set up the Unity Server and await connection request from the Android App.
    static void SocketClient() {

        Int32 port = 13000;
        IPAddress serverAddr = IPAddress.Parse("192.168.1.15");
        //Establish Server
        server = new TcpListener(serverAddr, port);
        server.Start();

        //Await connection
        while (true) {
            client = server.AcceptTcpClient ();
            Debug.Log("Client Connected");
            socketReady = true;
            networkStream = client.GetStream();
            writer = new StreamWriter(networkStream);
            reader = new StreamReader(networkStream);

            String data= null;

            //Create a stream object for reading and writing
            stream = client.GetStream();
            Debug.Log("client.getStream");
//          int i;
//          while((i = stream.Read(bytes,0,bytes.Length)) != 0 ) {
//              data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
//              Debug.Log(data);
            }
        }
    }

你的 writeSocket 方法使用 ASCII 编码吗?其他所有内容都使用 UTF8。确保所有流也使用 UTF8 编码。 - ManoDestra
1个回答

0
原来我错过了这行代码:
string mess = System.Text.Encoding.UTF8.GetString(buff);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接