У меня есть сервер в Android Studio, который я использую для сохранения результатов в таблице лидеров. Когда я нажимаю «Отправить», я отправляю строку, например: «Save Score-Alex, 15000». В моей базе данных сохраняется как Имя: Alex
: Значение: "-Alex,,15000"
. Когда я пытаюсь вернуть свои значения, я получаю сообщение об ошибке "32413-32413/com.example.serverapp E/AndroidRuntime: FATAL EXCEPTION: main"
на "writer.println(data)"
. Я могу отправить его в базу данных из своего приложения, но когда я пытаюсь вернуть его с помощью писателя, я получаю эту ошибку. переменная данных содержит допустимую строку. Я попробовал .print (), и ошибка исчезла, но я все еще не получаю данные в своем приложении.
Сервер:
package com.example.serverapp
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.google.firebase.database.DataSnapshot
import com.google.firebase.database.DatabaseError
import com.google.firebase.database.FirebaseDatabase
import com.google.firebase.database.ValueEventListener
import java.io.*
import java.net.InetAddress
import java.net.ServerSocket
import java.net.Socket
import java.nio.charset.Charset
import java.util.*
import kotlin.concurrent.thread
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val server = ServerSocket(8888,10, InetAddress.getByName("0.0.0.0"))
val database = FirebaseDatabase.getInstance()
val databaseReference = database.getReference()
println("Server is running on port ${server.localPort}")
thread{run{
val client= server.accept()
println("Client connected: ${client.inetAddress.hostAddress}")
thread{
run{
val reader = BufferedReader(InputStreamReader(client.getInputStream()));
val writer = PrintWriter(BufferedWriter(OutputStreamWriter(client.getOutputStream())), true)
while(true){
val citeste=reader.readLine()
val linie=citeste.toString()
val indexsfarsitcomanda=linie.indexOf("-")
val comanda = linie.substring(0,indexsfarsitcomanda)
if(comanda.compareTo("Save Score")==0 && linie!=null){
System.out.println(linie)
val indexsfarsitnume = linie.indexOf(",")
val username = linie.substring(indexsfarsitcomanda,indexsfarsitnume)
val score = linie.substring(indexsfarsitnume,linie.length)
databaseReference.child(username).setValue(username+","+score)
}
if(comanda.compareTo("Get Leaderboard")==0 && linie!=null){
databaseReference.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
var data : String
for (user in dataSnapshot.children) {
System.out.println(client.toString());
data = user.value as String
System.out.println(data);
writer.println(data);
}
}
override fun onCancelled(databaseError: DatabaseError) {}
})
}
}
}
}
}
}
}
}
Служба, которую я использую для взаимодействия с сервером из моего приложения:
package com.example.gameproject;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
import androidx.annotation.Nullable;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
public class CommunicationService extends Service {
PrintWriter send;
BufferedReader get;
String message;
public void setSentObj(PrintWriter send){
this.send = send;
}
public void setGetObj(BufferedReader get){
this.get = get;
}
public final IBinder iBinder= new LocalBinder();
public class LocalBinder extends Binder {
public CommunicationService getService() {
return CommunicationService.this;
}
}
public IBinder onBind(Intent intent) {
return iBinder;
}
public void listen(){
send("Get Leaderboard-");
Thread listenToServerT = new Thread(new Listen());
Log.e("listenFunc", "incep asculttttt");
listenToServerT.start();
}
public void send(String mesaj){
this.message = mesaj;
Thread sendToServerT = new Thread(new Send());
sendToServerT.start();
Log.e("sendFunction", "S-a trimis");
}
public class Listen implements Runnable{
@Override
public void run() {
String data;
try {
if ((data = get.readLine()) != null){
System.out.println(data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class Send implements Runnable{
@Override
public void run() {
try{
send.println(message);
}catch (Exception e) {
e.printStackTrace();
}
}
}