拿别人的成果,自己新建工程,贴别人的代码看下效果。因为自己搭建的工程和别人的不一样,所以会出现这样那样的问题。
http://blog.csdn.net/randyjiawenjie/article/details/6556613
自己来使用时,出现了两个错误,第一个是:
运行java文件:java Server时,出现错误:
Exception in thread "main" java .lang.NoClassDefFoundError:Server
这个错误是因为你把Server.java文件包含在res文件夹下,而该文件头有:
- package com.yarin.android.testPro;
在dos下运行时找不到这个类。
解决办法是:
去掉这一行,并且不要把Server.java这个文件从res中去掉(如果你在工程中有的话),或者如图把Server.java文件放到工程下其他包中:
重新在dos下编译,再在dos下运行。准确的说,应该说是在jdk集成的JRE下运行,即可以启动服务器了,刚开始启动时没有显示任何信息的:
第二个错误是:
运行去掉Server.java文件的工程时,出现错误
java.lang.runtimeexception:unable to instantiate activity componentinfo
这个错误参考了http://blog.csdn.net/gaohongijj/article/details/8010869可以解决,总结得很好。
自己新建一个工程后,Manifest.xml文件中包的名字默认是android:name="com.example.testpro.MainActivity",注意黑体部分,MainActivity是activity的默认名字,自己定义的是Activity01,如图:
所以应该相应改成:android:name="com.example.testpro.Activity01"
这样就大功告成了:启动模拟器,运行程序:
还有一个问题,服务器端并没有出现“111”等信息,并且点击发送出现异常:
android.os.NetworkOnMainThreadException,似乎只要解决了这个问题就可以实现通信了。。
有网上的解决方案来看,很可能是android版本的问题:(盗照搬别人的代码给自己用而不加思考做改变时就会出这样的错)
http://www.cnblogs.com/freexiaoyu/archive/2012/04/13/2445707.html
现在,我按照这个思路对Activity01.java文件进行异步多线程的修改:
package com.example.testpro;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
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.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Activity01 extends Activity {
private final String DEBUG_TAG = "Activity01";
private TextView mTextView = null;
private EditText mEditText = null;
private Button mButton = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = (Button) findViewById(R.id.Button01);
mTextView = (TextView) findViewById(R.id.TextView01);
mEditText = (EditText) findViewById(R.id.EditText01);
// 登陆
mButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
new Thread() {
public void run() {
Socket socket = null;
String message = mEditText.getText().toString()
+ "/r/n";
System.out.println("BEGIN");
try {
// 创建Socket
// socket = new Socket("192.168.1.110",54321);
socket = new Socket("192.168.0.103", 54321); // IP一定是本地机器的ip
// 向服务器发送消息
PrintWriter out = new PrintWriter(
new BufferedWriter(new OutputStreamWriter(
socket.getOutputStream())), true);
System.out.println("2");
out.println(message);
// 接收来自服务器的消息
BufferedReader br = new BufferedReader(
new InputStreamReader(socket
.getInputStream()));
String msg = br.readLine();
System.out.println("3");
if (msg != null) {
mTextView.setText(msg);
} else {
mTextView.setText("数据错误!");
}
System.out.println("4");
// 关闭流
out.close();
br.close();
// 关闭Socket
socket.close();
} catch (Exception e) {
// TODO: handle exception
Log.e(DEBUG_TAG, e.toString());
}
handler.sendEmptyMessage(0);//执行完毕后给handler发送一个空消息
}
// 定义Handler对象
private Handler handler = new Handler() {
@Override
// 当有消息发送出来的时候就执行Handler的这个方法
public void handleMessage(Message msg) {
super.handleMessage(msg);
// 处理UI
System.out.println("OK?");
}
};
}.start();// 启动一个线程
}
});
}
}
注意ip一定要是本地机器的IP地址。
这样再次运行工程到模拟器中,可以了,当我输入数字1的时候,服务器端将出现1和其他信息:
修改后的工程下载: