当我尝试使用 ObjectOutputStream 将自定义对象(请参阅 Content.java)从客户端发送到服务器时,在发送第一个对象后收到 StreamCorruptedException。因此,如果我尝试发送另一个对象,我会收到异常(第一次有效)。我已经用谷歌搜索并阅读了很多东西,现在我即将放弃,所以我请求你的帮助。
客户端.java
public class Client extends Thread {
private final static String TAG ="Client";
private final static String IP = "10.0.2.2";
private final static int PORT = 12345;
private Socket s;
private static ObjectOutputStream out;
private static ObjectInputStream in;
//private PrintWriter out;
//private BufferedReader in;
private TextView tv;
private Content c = new Content("");
public Client(TextView tv) {
this.tv = tv;
}
public void run() {
s = null;
out = null;
in = null;
String res;
try {
s = new Socket(IP, PORT);
Log.v(TAG, "C: Connected to server" + s.toString());
out = new ObjectOutputStream(s.getOutputStream());
in = new ObjectInputStream(s.getInputStream());
//out = new PrintWriter(s.getOutputStream(), true);
//in = new BufferedReader(new InputStreamReader(s.getInputStream()));
//c.setText("PING to server from client");
//out.writeObject(c);
while((c = (Content)in.readObject()) != null) {
try {
res = c.getText();
Log.i(TAG, res);
} catch (Exception e) {
Log.e("readobject", e.toString());
}
}
} catch(Exception e) {
Log.e("run @ client", e.toString());
} finally {
try {
out.close();
in.close();
s.close();
} catch(IOException e) {
Log.e(TAG, e.toString());
}
}
}
public String setText() throws Exception{
return in.toString();
}
public void sendText(String text) {
Content cont = new Content(text);
try {
out.writeObject(cont);
} catch(Exception e) {
e.printStackTrace();
Log.e("writeObject", e.toString());
} finally {
try {
out.flush();
out.close();
s.close();
Log.i(TAG, "Object sent");
} catch (Exception e){}
}
}
}
内容.java
public class Content implements Serializable{
private String text;
public Content(String text) {
this.text = text;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
Stack:
04-24 17:09:12.345: WARN/System.err(520): java.io.StreamCorruptedException
04-24 17:09:12.355: WARN/System.err(520): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1707)
04-24 17:09:12.355: WARN/System.err(520): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1660)
04-24 17:09:12.365: WARN/System.err(520): at client.android.Client.sendText(Client.java:83)
04-24 17:09:12.365: WARN/System.err(520): at client.android.ClientActivity.sendToServer(ClientActivity.java:38)
04-24 17:09:12.365: WARN/System.err(520): at java.lang.reflect.Method.invokeNative(Native Method)
04-24 17:09:12.365: WARN/System.err(520): at java.lang.reflect.Method.invoke(Method.java:521)
04-24 17:09:12.365: WARN/System.err(520): at android.view.View$1.onClick(View.java:2026)
04-24 17:09:12.365: WARN/System.err(520): at android.view.View.performClick(View.java:2364)
04-24 17:09:12.365: WARN/System.err(520): at android.view.View.onTouchEvent(View.java:4179)
04-24 17:09:12.365: WARN/System.err(520): at android.widget.TextView.onTouchEvent(TextView.java:6541)
04-24 17:09:12.375: WARN/System.err(520): at android.view.View.dispatchTouchEvent(View.java:3709)
04-24 17:09:12.375: WARN/System.err(520): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
0 4-24 17:09:12.385: WARN/System.err(520): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
04-24 17:09:12.385: WARN/System.err(520): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
04-24 17:09:12.385: WARN/System.err(520): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
04-24 17:09:12.385: WARN/System.err(520): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659)
04-24 17:09:12.385: WARN/System.err(520): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
04-24 17:09:12.385: WARN/System.err(520): at android.app.Activity.dispatchTouchEvent(Activity.java:2061)
04-24 17:09:12.395: WARN/System.err(520): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
04-24 17:09:12.395: WARN/System.err(520): at android.view.ViewRoot.handleMessage(ViewRoot.java:1691)
04-24 17:09:12.395: WARN/System.err(520): at android.os.Handler.dispatchMessage(Handler.java:99)
04-24 17:09:12.395: WARN/System.err(520): at android.os.Looper.loop(Looper.java:123)
04-24 17:09:12.395: WARN/System.err(520): at android.app.ActivityThread.main(ActivityThread.java:4363)
04-24 17:09:12.395: WARN/System.err(520): at java.lang.reflect.Method.invokeNative(Native Method)
04-24 17:09:12.395: WARN/System.err(520): at java.lang.reflect.Method.invoke(Method.java:521)
04-24 17:09:12.395: WARN/System.err(520): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
04-24 17:09:12.395: WARN/System.err(520): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
04-24 17:09:12.395: WARN/System.err(520): at dalvik.system.NativeStart.main(Native Method)
编辑:添加了 ClientActivity.java
客户端活动.java
public class ClientActivity extends Activity {
private EditText et;
private Client c;
private TextView tv;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
et =(EditText)findViewById(R.id.clientTxt);
tv = (TextView)findViewById(R.id.recievedTxt);
c = new Client(tv);
c.start();
try {
tv.setText(c.setText());
} catch (Exception e) {}
}
public void sendToServer(View v) throws Exception{
String text = et.getText().toString();
Log.i("EdittextVALUE", text);
c.sendText(text);
}
}
服务器.java
public class Server extends Thread {
private static final String TAG = "ServerThread";
private static final int PORT = 12345;
public void run() {
ServerSocket ss = null;
Socket s = null;
String res = "";
try {
Log.i(TAG, "Start server");
ss = new ServerSocket(PORT);
Log.i(TAG, "ServerSocket created waiting for Client..");
while(true) {
s = ss.accept();
Log.v(TAG, "Client connected");
Connection c = new Connection(s);
}
}catch(IOException e) {
e.printStackTrace();
} finally {
try {
//out.close();
//in.close();
s.close();
ss.close();
} catch (IOException e) {}
}
}
连接.java
public class Connection extends Thread {
private Socket socket;
private static ObjectOutputStream out;
private static ObjectInputStream in;
private final String TAG = "ConnectionClass";
public Connection(Socket socket) {
try {
this.socket = socket;
out = new ObjectOutputStream(socket.getOutputStream());
in = new ObjectInputStream(socket.getInputStream());
this.start();
} catch (IOException ex) {
ex.printStackTrace();
Log.e(TAG, ex.toString());
}
}
public void run() {
String res = "";
Content c = null;
try {
while(true) {
while((c = (Content)in.readObject()) != null) {
try {
res = c.getText();
Log.i(TAG, res);
} catch (Exception e) {
Log.e("lololololo", e.toString());
}
}
}
} catch (Exception ex) {
Log.e(TAG, ex.toString());
} finally {
try {
socket.close();
in.close();
out.close();
} catch (Exception e) {}
}
}
服务器活动.java
public class ServerActivity extends Activity {
public Server server;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
server = new Server();
server.start();
}
}