Java 错误是什么?Android编程新手
我正在尝试实现一个服务器客户端程序来在Android中发送消息。你能告诉我代码中的错误是什么,以及如何纠正它们吗?服务器运行正常,但客户端程序有一个错误 这是服务器代码,运行正常Java 错误是什么?Android编程新手,java,android,networking,exception-handling,android-emulator,Java,Android,Networking,Exception Handling,Android Emulator,我正在尝试实现一个服务器客户端程序来在Android中发送消息。你能告诉我代码中的错误是什么,以及如何纠正它们吗?服务器运行正常,但客户端程序有一个错误 这是服务器代码,运行正常 package com.app.MyServer; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.ServerSocket; import java
package com.app.MyServer;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.TextView;
public class MyServer extends Activity {
ServerSocket ss = null;
String mClientMsg = "";
Thread myCommsThread = null;
protected static final int MSG_ID = 0x1337;
public static final int SERVERPORT = 6000;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tv = (TextView) findViewById(R.id.TextView01);
tv.setText("Nothing from client yet");
this.myCommsThread = new Thread(new CommsThread());
this.myCommsThread.start();
}
@Override
protected void onStop() {
super.onStop();
try {
// make sure you close the socket upon exiting
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
Handler myUpdateHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_ID:
TextView tv = (TextView) findViewById(R.id.TextView01);
tv.setText(mClientMsg);
break;
default:
break;
}
super.handleMessage(msg);
}
};
class CommsThread implements Runnable {
public void run() {
Socket s = null;
try {
ss = new ServerSocket(SERVERPORT );
Log.v("SErver ",ss.toString());
} catch (IOException e) {
e.printStackTrace();
}
while (!Thread.currentThread().isInterrupted()) {
Message m = new Message();
Log.v("Message ",m.toString());
m.what = MSG_ID;
try {
if (s == null && ss!=null)
{
s = ss.accept();
Log.v("Drrr","It is not null");
}
else
Log.v("The thing is ", "ss is null");
BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()));
String st = null;
st = input.readLine();
mClientMsg = st;
myUpdateHandler.sendMessage(m);
} catch (IOException e) {
Log.v("Error ",e.toString());
e.printStackTrace();
}
}
}
}
}
客户端代码:
package com.exercise.AndroidClient;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class AndroidClient extends Activity {
EditText textOut;
TextView textIn;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textOut = (EditText)findViewById(R.id.textout);
Button buttonSend = (Button)findViewById(R.id.send);
textIn = (TextView)findViewById(R.id.textin);
buttonSend.setOnClickListener(buttonSendOnClickListener);
}
protected class connect extends AsyncTask<String,DataInputStream,String>
{
@Override
protected void onPreExecute()
{
Log.i( "makemachine", "onPreExecute()" );
// TODO Auto-generated method stub
Socket socket = null;
DataOutputStream dataOutputStream = null;
DataInputStream dataInputStream = null;
try {
socket = new Socket("10.0.2.2", 5000);
dataOutputStream = new DataOutputStream(socket.getOutputStream());
dataInputStream = new DataInputStream(socket.getInputStream());
dataOutputStream.writeUTF(textOut.getText().toString());
publishProgress(dataInputStream);
}
catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
if (socket != null)
{
try {
socket.close();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (dataOutputStream != null){
try {
dataOutputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (dataInputStream != null){
try {
dataInputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
super.onPreExecute();
}
protected void onProgressUpdate(DataInputStream... dataInputStream) {
Log.v("The mesage length is ",dataInputStream.toString());
textIn.setText(dataInputStream.toString());
}
@Override
protected void onPostExecute( String result )
{
super.onPostExecute(result);
Log.i( "connected", "onPostExecute(): " + result );
}
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
return null;
}
}
Button.OnClickListener buttonSendOnClickListener
= new Button.OnClickListener(){
public void onClick(View arg0)
{
Log.v("Sending the message ","to the server");
}};
}
package com.exercise.AndroidClient;
导入java.io.DataInputStream;
导入java.io.DataOutputStream;
导入java.io.IOException;
导入java.net.Socket;
导入java.net.UnknownHostException;
导入android.app.Activity;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.view;
导入android.widget.Button;
导入android.widget.EditText;
导入android.widget.TextView;
公共类AndroidClient扩展活动{
编辑文本输出;
TextView textIn;
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textOut=(EditText)findViewById(R.id.textOut);
Button Button send=(Button)findViewById(R.id.send);
textIn=(TextView)findViewById(R.id.textIn);
buttonSend.setOnClickListener(ButtonSendClickListener);
}
受保护的类连接扩展异步任务
{
@凌驾
受保护的void onPreExecute()
{
Log.i(“makemachine”、“onPreExecute()”);
//TODO自动生成的方法存根
套接字=空;
DataOutputStream DataOutputStream=null;
DataInputStream DataInputStream=null;
试一试{
插座=新插座(“10.0.2.2”,5000);
dataOutputStream=新的dataOutputStream(socket.getOutputStream());
dataInputStream=新的dataInputStream(socket.getInputStream());
dataOutputStream.writeUTF(textOut.getText().toString());
发布进度(数据输入流);
}
捕获(未知后异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
最后
{
if(套接字!=null)
{
试一试{
socket.close();
}
捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
如果(dataOutputStream!=null){
试一试{
dataOutputStream.close();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
如果(dataInputStream!=null){
试一试{
dataInputStream.close();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
super.onPreExecute();
}
受保护的void onProgressUpdate(DataInputStream…DataInputStream){
Log.v(“mesage长度为”,dataInputStream.toString());
setText(dataInputStream.toString());
}
@凌驾
受保护的void onPostExecute(字符串结果)
{
super.onPostExecute(结果);
Log.i(“已连接”,“onPostExecute():”+结果);
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
//TODO自动生成的方法存根
返回null;
}
}
Button.OnClickListener按钮EndockListener
=新建按钮。OnClickListener(){
公共void onClick(视图arg0)
{
Log.v(“发送消息”,“到服务器”);
}};
}
日志是:
02-06 01:55:31.421: E/AndroidRuntime(582): FATAL EXCEPTION: main
02-06 01:55:31.421: E/AndroidRuntime(582): android.os.NetworkOnMainThreadException
02-06 01:55:31.421: E/AndroidRuntime(582): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
02-06 01:55:31.421: E/AndroidRuntime(582): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
02-06 01:55:31.421: E/AndroidRuntime(582): at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
02-06 01:55:31.421: E/AndroidRuntime(582): at libcore.io.IoBridge.connect(IoBridge.java:112)
02-06 01:55:31.421: E/AndroidRuntime(582): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
02-06 01:55:31.421: E/AndroidRuntime(582): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
02-06 01:55:31.421: E/AndroidRuntime(582): at java.net.Socket.startupSocket(Socket.java:566)
02-06 01:55:31.421: E/AndroidRuntime(582): at java.net.Socket.tryAllAddresses(Socket.java:127)
02-06 01:55:31.421: E/AndroidRuntime(582): at java.net.Socket.<init>(Socket.java:177)
02-06 01:55:31.421: E/AndroidRuntime(582): at java.net.Socket.<init>(Socket.java:149)
02-06 01:55:31.421: E/AndroidRuntime(582): at com.exercise.AndroidClient.AndroidClient$1.onClick(AndroidClient.java:45)
02-06 01:55:31.421: E/AndroidRuntime(582): at android.view.View.performClick(View.java:3511)
02-06 01:55:31.421: E/AndroidRuntime(582): at android.view.View$PerformClick.run(View.java:14105)
02-06 01:55:31.421: E/AndroidRuntime(582): at android.os.Handler.handleCallback(Handler.java:605)
02-06 01:55:31.421: E/AndroidRuntime(582): at android.os.Handler.dispatchMessage(Handler.java:92)
02-06 01:55:31.421: E/AndroidRuntime(582): at android.os.Looper.loop(Looper.java:137)
02-06 01:55:31.421: E/AndroidRuntime(582): at android.app.ActivityThread.main(ActivityThread.java:4424)
02-06 01:55:31.421: E/AndroidRuntime(582): at java.lang.reflect.Method.invokeNative(Native Method)
02-06 01:55:31.421: E/AndroidRuntime(582): at java.lang.reflect.Method.invoke(Method.java:511)
02-06 01:55:31.421: E/AndroidRuntime(582): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
02-06 01:55:31.421: E/AndroidRuntime(582): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
02-06 01:55:31.421: E/AndroidRuntime(582): at dalvik.system.NativeStart.main(Native Method)
02-06 01:55:31.421:E/AndroidRuntime(582):致命异常:主
02-06 01:55:31.421:E/AndroidRuntime(582):android.os.NetworkOnMainThreadException
02-06 01:55:31.421:E/AndroidRuntime(582):在android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
02-06 01:55:31.421:E/AndroidRuntime(582):在libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)上
02-06 01:55:31.421:E/AndroidRuntime(582):在libcore.io.IoBridge.connecterno(IoBridge.java:127)
02-06 01:55:31.421:E/AndroidRuntime(582):在libcore.io.IoBridge.connect(IoBridge.java:112)上
02-06 01:55:31.421:E/AndroidRuntime(582):位于java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
02-06 01:55:31.421:E/AndroidRuntime(582):在java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
02-06 01:55:31.421:E/AndroidRuntime(582):位于java.net.Socket.startupSocket(Socket.java:566)
02-06 01:55:31.421:E/AndroidRuntime(582):位于java.net.Socket.tryalladdress(Socket.java:127)
02-06 01:55:31.421:E/AndroidRuntime(582):位于java.net.Socket(Socket.java:177)
02-06 01:55:31.421:E/AndroidRuntime(582):位于java.net.Socket(Socket.java:149)
02-06 01:55:31.421:E/AndroidRuntime(582):在com.exerce.AndroidClient.AndroidClient$1.onClick(AndroidClient.java:45)
02-06 01:55:31.421:E/AndroidRuntime(582):在android.view.view.performClick(view.java:3511)
02-06 01:55:31.421:E/AndroidRuntime(582):在android.view.view$PerformClick.run(view.java:14105)
02-06 01:55:31.421:E/AndroidRuntime(582):在android.os.Handler.handleCallback(Handler.java:605)上
02-06 01:55:31.421:E/AndroidRuntime(582):位于android.os.Handler.dispatchMessage(Handler.java:92)
02-06 01:55:31.421:E/AndroidRuntime(582):在android.os.Looper.loop(Looper.java:137)
02-06 01:55:31.421:E/AndroidRuntime(582):位于android.app.ActivityThread.main(ActivityThread.java:4424)
02-06 01:55:31.421:E/AndroidRuntime(582):位于java.lang.reflect.Method.Invokenactive(本机方法)
02-06 01:55:31.421:E/AndroidRuntime(582):位于java.lang.reflect.Method.invoke(Method.java:511)
02-06 01:55:31.421:E/AndroidRuntime(582):在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
02-06 01:55:31.421:E/AndroidRuntime(582):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
02-06 01:55:31.421:E/AndroidRuntime(582):在dalvik.system.NativeStart.main(本机方法)
我读到我们不能在UI线程中实现网络线程。这就是我使用AsyncTask线程的原因。但即使如此,我仍然使用了
That is why I am using the AsyncTask thread.But even then I get the NetworkOnMainThread Exception.