2016-07-13 3 views
3

Я довольно новичок в сети и до сих пор сумел подключить мое приложение для Android (клиент) к моему серверу Unity C#, однако я немного зациклился на Java, отправляющей Строка и сервер расшифровывают ее.Отправка сервера Java-сервера на сервер C#

Клиент C# будет считывать ввод, но когда я регистрирую сообщение клиента, он черный. Поэтому я полагаю, что проблема связана с кодировкой строки Java или декодированием.

Сообщите мне, если кто-нибудь может определить, где я ошибаюсь, или если у кого-то есть лучшие предложения о том, как обращаться с писателями и читателями.

Большое спасибо заранее!

Java-клиента SendMsg Thread

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: http://stackoverflow.com/questions/11154367/socket-java-client-c-sharp-server 
//    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); 
      } 
     } 
    } 
+0

Ваш метод writeSocket использует ASCII кодировку? Все остальное использует UTF8. Убедитесь, что все ваши потоки также используют кодировку UTF8. – ManoDestra

ответ

0

Оказывается, что я пропускал эту строку кода:

string mess = System.Text.Encoding.UTF8.GetString(buff); 
Смежные вопросы