Java 安卓系统-信息可以阅读,但我无法获取它们

Java 安卓系统-信息可以阅读,但我无法获取它们,java,android,client,messages,Java,Android,Client,Messages,简单步骤: 客户端编写消息并将其发送到服务器(工作正常) 消息被传递到服务器(工作正常) 服务器获取消息(工作正常) 服务器处理消息并做出适当的回复(工作正常) 服务器将消息发送回客户端(工作正常) 消息被传递到客户端(工作正常) 客户端获取消息(nop…问题) 正如你在代码中看到的;“oos”的大小实际上随着每次印刷都在增加,但我无法从oos中读取数据 当我按下一个按钮时,Start被调用,当我按下另一个按钮时,Start被调用 //客户 package com.example.clien

简单步骤:

  • 客户端编写消息并将其发送到服务器(工作正常)
  • 消息被传递到服务器(工作正常)
  • 服务器获取消息(工作正常)
  • 服务器处理消息并做出适当的回复(工作正常)
  • 服务器将消息发送回客户端(工作正常)
  • 消息被传递到客户端(工作正常)
  • 客户端获取消息(nop…问题)
正如你在代码中看到的;“oos”的大小实际上随着每次印刷都在增加,但我无法从oos中读取数据

当我按下一个按钮时,Start被调用,当我按下另一个按钮时,Start被调用

//客户

package com.example.clienttest;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

    Thread m_objThreadClient;
    Socket clientSocket;
    TextView serverMessage;
    EditText clientMessage;
    String sIn = "Nothing", sOut;
    DataOutputStream oos;
    DataInputStream ois;
    int i = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        serverMessage = (TextView) findViewById(R.id.textView1);
        clientMessage = (EditText) findViewById(R.id.editText1);


        m_objThreadClient = new Thread( new Runnable(){
            public void run()
            {
                try {
                    clientSocket = new Socket("10.0.2.2", 4000);
                    oos = new DataOutputStream (clientSocket.getOutputStream());
                    ois = new DataInputStream (clientSocket.getInputStream());


                } catch (Exception e) {
                    serverMessage.setText(e.getMessage());
                }

            }
        });
        m_objThreadClient.start();


    }

    public void Start(View view)throws IOException{
        sOut = clientMessage.getText().toString();
          try {
              oos.writeUTF(sOut);
              serverMessage.setText("Messages availible:" + ois.available() );

          }
          catch (Exception e) {
          }

    }
    public void Get(View view){
          try {

                sIn = ois.readUTF();
                serverMessage.setText("Message: " + sIn );
          }
          catch (Exception e) {
          }

    }

    public void onStop(){
        try {
            oos.close();
            ois.close();
            clientSocket.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
//服务器

import java.net.ServerSocket;
import java.net.Socket;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;

import java.util.Hashtable;

public class Server2 {

    @SuppressWarnings("resource")
    public static void main (String[] args) throws IOException {

        ServerSocket server = null;  
        try {
            server = new ServerSocket(4000); 
        } catch (IOException e) {
            System.err.println("Could not start up on: " + "4000" + "Maby server is already open? Or a portforwording messup?");
            System.err.println(e);
            System.exit(1);
        }

        Socket client = null;
        while(true) {
            try {
                client = server.accept();
                String IP = client.getInetAddress().toString();
                System.out.print(IP + " Connected\n");
            } catch (IOException e) {
                System.err.println("Accept failed.");
                System.err.println(e);
            }

            Thread t = new Thread(new ClientConn(client));
            t.start();
        }
    }
}


class ClientConn implements Runnable {
    private Socket client;
    String Recv, Send;
    DataInputStream inFromClient;
    DataOutputStream outToClient;

    ClientConn(Socket client) {
        this.client = client;
        try {

            inFromClient = new DataInputStream(client.getInputStream());
            outToClient = new DataOutputStream(client.getOutputStream());
            } catch (IOException e) {
            e.printStackTrace();
            }
    }

    public void run() {
        try {
            while ((Recv = inFromClient.readUTF()) != null) {

                System.out.print("Msg: " + Recv + " \n");
                if( Recv.equals("Hi")){
                    Send = "Welcome";
                }
                else{
                    Send = "Wat?";
                }

                outToClient.writeUTF(Send);
                System.out.print("Replying:" + Send + "\n");
            }
        } catch (IOException e) {
            System.out.print("No input ");
            System.err.println(e);
        }
    }

}

这真的让我困惑:(…

在从服务器发送一些数据后尝试刷新数据,然后再试一次

 outToClient.writeUTF(Send);
 outToClient.flush();//add this one
顺便说一句,当您单击调用
get()
方法时,客户机正在等待一些消息,而服务器也在等待一些消息,可能您需要发送一些东西来获取一些东西,如下所示

public void Get(View view){
          try {
                oos.writeUTF("What's up?!");
                oos.flush();
                sIn = ois.readUTF();
                serverMessage.setText("Message: " + sIn );
          }
          catch (Exception e) {
          }

    }

顺便说一下,请遵循Java命名规则,您的方法遵循m$si sharp命名规则
Get()->Get()
Thank.:)

实际上是这样的,没有用。。顺便说一句,正如前面所说的,客户端会收到消息,因为“每次点击都会显示超过1条可用消息。所以问题就出在”ReadUTF“附近“请您评论一下您认为程序在哪里卡住了?!”?!或者一些堆栈跟踪…,还有一些…,顺便说一句,这可能是因为服务器需要接受一条消息作为响应,在get方法中的一些消息只是期望一些消息,在这些消息中您不发送一些东西。我更新了答案。程序在客户端的“ReadUTF”处似乎是错误的,因为我说过“ois”的大小随着发送到服务器的每条消息的增加而增加,这意味着实际上有一些消息被发送回客户端。但是sIn string变量不知何故没有将该消息分配给它自己…我看到了,伙计,我们检查一下服务器中的流程,因为您看到服务器首先读取字符串,然后处理并发送响应,在客户端中,您必须发送一些东西才能获得一些东西,那么如何调用
Start()
方法?!因此,在尝试读取某些数据之前,可能需要调用
Get()
中的
Start()
方法,并在
Start()
方法中刷新数据。如果客户端被困在
Get()
方法中,这意味着客户端和服务器都在等待对方。正如我在主要帖子中所说,启动和获取两个单独的按钮来调用它们,我按下开始按钮,直到我看到可用消息的大小为6或更多。然后我去拿,但是我不能从中读出任何一个字节。服务器进程流工作正常,顺便说一句,我在那里看到了收到的消息以及服务器将回复的消息。