今天做了一个多线程的例子,多个Android手机和电脑通信。
首先要说的时候 我的一个理解误区,也是我最大的收获。
先说一下socket,比如
while(true){ Socket sc=ServerSocker.accept();}
我一直以为这个阻塞是自己的while循环产生的,后来差资料发现,accept()方法自己产生阻塞,
也就说 进入while循环以后,代码会停在 Socket sc=ServerSocker.accept();这一行,知道有链接请求,才会进入下一个循环,继续等待连接,在那里阻塞。 这个while 循环是为了多个客户端链接,每一个链接都会得到一个Socket实例,用这个实例与客户端通讯,
这就需要自己开辟进程,进行处理了。语文学的不好,贴出代码来
java程序
package com.bh;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;public class Server{ /** * @param args */ int i=0; private static ServerSocket mServerSocker; private static Socket sc;// private static BufferedReader in;// private static PrintWriter out; public static void main(String[] args) throws IOException { mServerSocker=new ServerSocket(8888); while(true){ sc=mServerSocker.accept(); System.out.println("aaaaaaaa"); //Server s=new Server(); Thread r=new ReciveThreat(sc); r.start(); Thread s=new SendThread(sc); s.start(); System.out.println("kaishi"); //my.run(); //new Server().run(); } //out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(sc.getOutputStream())),true); } }
send类
package com.bh;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.Socket;public class SendThread extends Thread{ private Socket sc; int i=0; //private BufferedReader in; private PrintWriter out; public SendThread(Socket s) throws IOException { sc=s; //in=new BufferedReader(new InputStreamReader(sc.getInputStream())); out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(sc.getOutputStream())),true); //System.out.println("ok"); } @Override public void run() { // TODO Auto-generated method stub try { while(true){ Thread.sleep(3000); System.out.println("aa"); out.println(i++); } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
recive类
package com.bh;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.Socket;public class ReciveThreat extends Thread{ private Socket sc; private BufferedReader in; //private PrintWriter out; public ReciveThreat(Socket s) throws IOException { sc=s; in=new BufferedReader(new InputStreamReader(sc.getInputStream())); //out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(sc.getOutputStream())),true); } @Override public void run() { while(true){ try { String str; str = in.readLine(); if(str!=null){ System.out.println("read:"+str); System.out.println("run......"); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
Android程序
package com.bh.test;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.Socket;import java.net.UnknownHostException;import android.app.Activity;import android.os.Bundle;import android.os.Handler;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 Main extends Activity implements Runnable{ /** Called when the activity is first created. */ EditText et; String recive; Socket s; TextView t; PrintWriter out; BufferedReader in; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); et=(EditText) findViewById(R.id.edittext); Button b=(Button) findViewById(R.id.send); t=(TextView) findViewById(R.id.showtext); try { s = new Socket("10.0.2.2",8888); out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(s.getOutputStream())),true); in=new BufferedReader(new InputStreamReader(s.getInputStream())); } catch (UnknownHostException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } new Thread(this).start(); b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub String aa=et.getText().toString(); out.println(aa); //s.close(); Log.d("aaaaaaa", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); } }); } public Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { switch (msg.what) { case 1: t.setText(recive); break; default: break; } }; }; @Override public void run() { while(true){ try { //String str; recive = in.readLine(); Log.d("aaaaa",recive); if(recive!=null){ //t.setText(recive); handler.sendEmptyMessage(1); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}
有错误 大家指出了 谢谢哈
1 楼 luyunhan 2012-02-18
不知道楼主调试过没有,我在Android3.0的xoom上运行的时候强制关闭了。问题应该出现在客户端得39行上面。