0
簡單的步驟:Android的 - 消息準備閱讀,但我不能獲取它們
- 客戶端寫入消息,並將其發送到服務器(正常工作)
- 消息被分發給服務器(正常工作)
- 服務器抓起消息(正常工作)
- 服務器處理該消息並作出相應的應答(正常工作)
- 服務器將消息發送回給客戶機(正常工作)
- 消息被分發給客戶端(正常工作)
- 客戶抓起消息(NOP ....問題)
正如你在代碼中看到;每次按下「oos」的大小實際上都在增加,但我無法以某種方式讀取oos中的數據。
當我按下按鈕時,開始被調用,並且當我按下另一個按鈕Get獲取調用。
//客戶
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);
}
}
}
這實際上是混淆了我:(....
其實,沒有用.. 順便說一句,客戶端GETS消息cuz「消息可用顯示超過1每次點擊。所以問題是在某處周圍」ReadUTF「 –
你會評論在那裏你認爲程序卡住了?!或者一些堆棧跟蹤..,某事......並且順便說一句,也許這是因爲服務器需要接受一條消息來回應一些消息,你在get方法中只是期望一些消息,我發送了一些東西,我更新了答案 – 2013-10-05 17:37:16
程序在客戶端的「ReadUTF」似乎是錯誤的,因爲我說「ois」的大小隨着發送到服務器的每條消息而增加,這意味着實際上有一些消息被傳回但sIn字符串變量以某種方式不會將該消息分配給自己... –