Android客户端通过socket与服务器通信(解决源码使用出现的错误)

拿别人的成果,自己新建工程,贴别人的代码看下效果。因为自己搭建的工程和别人的不一样,所以会出现这样那样的问题。

http://blog.csdn.net/randyjiawenjie/article/details/6556613

自己来使用时,出现了两个错误,第一个是:

运行java文件:java Server时,出现错误:

Exception in thread "main" java .lang.NoClassDefFoundError:Server


这个错误是因为你把Server.java文件包含在res文件夹下,而该文件头有:

  1. 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和其他信息:




修改后的工程下载:

http://download.csdn.net/detail/shizikong/7379477

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值