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