Я довольно новичок в сети и до сих пор сумел подключить мое приложение для 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);
}
}
}
Ваш метод writeSocket использует ASCII кодировку? Все остальное использует UTF8. Убедитесь, что все ваши потоки также используют кодировку UTF8. – ManoDestra