android Socket实现简单聊天小程序

android Socket实现简单聊天小程序

服务器端:

package org.hwq.echo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TalkServer {
	public static void main(String[] args) throws IOException{
		ServerSocket server = null;
		Socket client = null;
		BufferedReader in = null;
		PrintWriter out = null;
		try{
			server = new ServerSocket(4700);
			client = server.accept();
			out = new PrintWriter(client.getOutputStream());
			in = new BufferedReader(new InputStreamReader(client.getInputStream()));
			String line = in.readLine();
			while(!"bye".equals(line)){
				System.out.println("client:"+line);
				out.println("echo:"+line);
				out.flush();
				line = in.readLine();
			}
		}catch (Exception e) {
			e.printStackTrace();
			if(client !=null)
				client.close();
			if(server != null)
				server.close();
		}
	}
}


手机端:
package org.hwq.cho;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class EchoActivity extends Activity implements OnClickListener {
	EditText show,msg;
	Button send;
	Handler handler;
	Socket client;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        handler = new MyHandler();
        show = (EditText) findViewById(R.id.show);
        msg = (EditText) findViewById(R.id.msg);
        send = (Button) findViewById(R.id.send);
        send.setOnClickListener(this);
    }
	@Override
	public void onClick(View arg0) {
		String message = msg.getText().toString();
//		System.out.println("msg:"+message);
		new EchoThread(EchoActivity.this,message).start();
	}
	public class MyHandler extends Handler{
		@Override
		public void handleMessage(Message msg) {
			switch(msg.what){
			case 1:
				Toast.makeText(EchoActivity.this, "建立连接失败", 0).show();
				break;
			case 2:
				String message = (String) msg.obj;
				System.out.println("Handler:"+message);
				show.append("\n"+message);
				break;
			}
		}
	}
	private class EchoThread extends Thread{
		private Context context;
		private String msg;
		EchoThread(Context context,String msg){
			this.context = context;
			this.msg = msg;
		}
		public void run(){
			if(client == null){
				try {
					client = new Socket("192.168.1.102",4700);
				} catch (IOException e) {
					Message message = new Message();
					message.what = 1;
					handler.sendMessage(message);
				}
			}
			System.out.println("建立连接");
			try{
				BufferedReader in;
				BufferedReader input;
				PrintWriter out;
				in = new BufferedReader(new InputStreamReader(client.getInputStream()));
				out = new PrintWriter(client.getOutputStream());
				String line = msg;
				if(!"bye".equals(line)){
					System.out.println("line:"+line);
					out.println(line);
					out.flush();
					String echo = in.readLine();
					System.out.println("server:"+echo);
					Message message = new Message();
					message.obj = echo;
					message.what = 2;
					handler.sendMessage(message);
				}
			}catch (Exception e) {
				
			}
		}
	}
}


注意几点:
1、添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>

如果没添加,无法使用socket连接网络。
2、在新启线程中不要使用android系统UI界面
在EchoThrad的run()方法里面,有下面代码:
if(client == null){
				try {
					client = new Socket("192.168.1.102",4700);
				} catch (IOException e) {
					Message message = new Message();
					message.what = 1;
					handler.sendMessage(message);
				}
			}

这里的handler.sendMessage(message);是发送一个消息给handler,然后handler根据消息弹出一个Toast显示连接失败。如果这里直接使用
Toast.makeText(EchoActivity.this, "建立连接失败", 0).show();

会报如下错:
Can't create handler inside thread that has not called Looper.prepare()

你可能感兴趣的:(android)