2

我实际上想在 Java 服务器和我的 Android 游戏之间编写 TCP 通信,以将数据保存到数据库中。曾经有一个全球排行榜。

实际上,我现在就编写了服务器,并且可以使用我编写的客户端连接到它,并希望稍后在 Android 中实现。这是来自客户端的一些代码:

    public void saveToDatabase(String name , int level, int killpoints){
        try {
            Socket soc = new Socket("localhost", PORT);
            DataOutputStream  out = new DataOutputStream(soc.getOutputStream());
            DataInputStream in = new DataInputStream(new BufferedInputStream(soc.getInputStream()));

            //to call the save statement!
            out.writeInt(0);
            //give the stuff 

            out.writeUTF(name);
            out.writeInt(level);
            out.writeInt(level);

            //close it
            out.close();
            in.close();
            soc.close();

        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
//          e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
//          e.printStackTrace();
        }
    }

服务器现在所做的是它获取第一行并根据值检查要做什么。在服务器上发生这种情况:

public void run() {
        try {
            DataOutputStream out = new DataOutputStream (socket.getOutputStream());
//          DataInputStream  in = new DataInputStream(new InputStreamReader(
//                  socket.getInputStream()));
            DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
            Server.textArea.setText(Server.textArea.getText()+"Client connected: "+ clientNumber+ "\n");

            int firstLine = in.readInt(); //get first line for switch

            switch (firstLine) {
            case 0:
//              getting the whole objekt for the database in own lines!
                String name = in.readUTF();
                int level = in.readInt();
                int kp = in.readInt();
                Server.textArea.setText(Server.textArea.getText() + "SAVE: "
                        + name + " Level: " + level + " KP: " + kp + "\n");
//              Server.textArea.setText(Server.textArea.getText() + "SAVE called\n");       
                break;
            case 1:
                // else if return the top10
                Server.textArea.setText(Server.textArea.getText()
                        + "Return top10\n");
                // outp.write("asdf string");
                break;
            default:
                break;
            }

            out.close();
            in.close();
            socket.close();
            Server.textArea.setText(Server.textArea.getText()
                    + "Client disconnected: "+ clientNumber + "\n");
        } catch (Exception e) {
            System.out.println("IO error " + e);
        }
    }

我将服务器端的所有内容记录到一个文本区域,并在服务器端得到它: 控制台错误

我承诺com.saveToDatabase("test", 2, 123651); 如果我将所有内容都以 UTF 格式发送,我实际上还会得到一些奇怪的东西:在此处输入图像描述

希望你能帮助我,甚至可以告诉我这是否也适用于 android。非常感谢。目前它没有正确转换字符串。

SAVE:  Level: 1908 KP: 1702065249
Client disconnected: 0
4

1 回答 1

2

您的代码有太多问题。你写了一个 int (writeInt) 但你在服务器上读了一个字节 (read)。writeUTF 也只在线上放置一个字符串,但您读取一个带有新行的字符串。使用DataInputStream 读取对应的DataOutputStream。还要在套接字之前关闭输出流。

于 2013-01-22T22:19:46.987 回答