java Android socket 多线程 总结

今天做了一个多线程的例子,多个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();
}
}
}
}



有错误 大家指出了 谢谢哈
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值