android tcp/ip server接多个client

来源:互联网 发布:ugui scrollview优化 编辑:程序博客网 时间:2024/05/21 19:49

网上找了个例子改了下,测试几个点没有问题,太多的话,没有测试过,如有高手,请指教 


DEMO:http://download.csdn.net/detail/small5e4444/9057981


一共做了三个类:

1、是TestTcpServer_activity 就是个普通的activity,做个按钮启动server;


2、Server 负责启动server,并且启动线程,在线程里 socket = server.accept();等待client;收到client后,把client存在list中,再new Runnable,去处理每个client;


3、ServerThread实现接口Runnable,去处理每个client


server端:

1、

import com.socket.Server;


public class TestTcpServer_activity extends Activity {


/** Called when the activity is first created. */
private EditText porText;
private Server server;


private TextView prinText;
private String String1;

private Button btnStr,btnStop,btnAg;
@Override
public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.tcp_server);
   // TODO Auto-generated method stub
   
   porText = (EditText)findViewById(R.id.serverPort);
   prinText = (TextView)findViewById(R.id.serverDisplay);
   btnStr = (Button)findViewById(R.id.btnStart);
   btnStop = (Button)findViewById(R.id.btnstop);
   btnAg = (Button)findViewById(R.id.btnAg);
   setTitle(Info.getLocalHostIp());
   
   prinText.setOnLongClickListener(new OnLongClickListener() {

@Override
public boolean onLongClick(View v) {
// TODO Auto-generated method stub
String1 = "";
prinText.setText(String1);
return true;
}
});
}

Handler _handler = new Handler() {
public void handleMessage(Message msg) {
super.handleMessage(msg);


// 刷新信息
try {
// 输出接受到的数据(更新控件)
if (String1 == null) {
String1  = msg.getData().getString("msg");
}
else {
String1  += msg.getData().getString("msg");
}
prinText.setText(String1);
} catch (Exception e) {
}
}
};

public void onStartServerClicked(View view) {

String port = porText.getText().toString();
if (!port.equals("")) {
System.out.println("点击");
server = new Server(_handler, 5001);//我把端口写死了;_handler是显示值用的
server.StartServer();


btnStr.setEnabled(false);
btnStop.setEnabled(true);
btnAg.setEnabled(true);
porText.setEnabled(false);
}else {
Toast.makeText(getApplicationContext(), "请输入监听端口号", Toast.LENGTH_SHORT).show();
}
}


public void onStopServerClicked(View view) {
server.StopServer();
server = null;

btnStr.setEnabled(true);
btnAg.setEnabled(false);
btnStop.setEnabled(false);
porText.setEnabled(true);
}

}


2、



public class Server {


// 定义保存所有Socket的ArrayList


    public static ArrayList<Socket>socketList= new ArrayList<Socket>();


private ServerSocket server = null;

private  Handler handlerDis;


private  Socket socket = null;
    
public Server(Handler handler,int port) {
handlerDis = handler;
try {
System.out.println("进"+port);
server = new ServerSocket(port);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Sendmsg("服务器启动出错" + "\n");
}
}
    
   
    /**
     * 监听客户端
     */
private  Thread StartListen = new Thread() 
{
public void run() 
{
while(true){


   try{
       socket = server.accept();
       Sendmsg("客户端加入:ip" + socket.getInetAddress()+ "/" + socket.getPort() +"\n");
       
       socketList.add(socket);
         new Thread(new ServerThread(socket)).start();
       
   }catch(IOException e){
       e.printStackTrace();
   }
}
}
};
    //开启服务器
    public void StartServer()
    {
    StartListen.start();
    Sendmsg("服务器已启动,开始监听...." + "\n");
    }
    
    //关闭服务器
    public void StopServer()
    {
    try {
server.close();
Sendmsg("服务器已关闭" + "\n");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
    }    

}


3、




public class ServerThread implements Runnable{

private     InputStream in;
        private OutputStream os;//   = _socket_2.getOutputStream(); 



// 定义当前线程所处理的Socket


    Socket s =null;

   
    public ServerThread(Socket s)


        throws IOException{


        this.s = s;


        in = s.getInputStream();
        os=s.getOutputStream(); 
       


    }


    public void run(){

    String hex="";
         byte[] buffer;
         
    while(true){
    try {
    buffer = new byte[in.available()];
   
    if(in.read(buffer)>0){
    System.out.println("fengsidai----"+buffer.length);
    for (int i = 0; i < buffer.length; i++) { 
    hex = Integer.toHexString(buffer[i] & 0xFF);
    if (hex.length() == 1) { 
           hex='0' + hex;
           }
    System.out.println("fsd···········"+hex);//这个可以把16进制接收上来的数据,以16进制形式在String中表现
    }
    System.out.println(s.getInetAddress().toString());
    System.out.println(s.getInetAddress().toString()=="/192.168.2.151");
    System.out.println(s.getInetAddress().toString().equals("/192.168.2.151"));
   
    if(s.getInetAddress().toString().equals("/192.168.2.151")){//发送数据给发来数据的客户端
    byte[] c=new byte[]{0x01,0x02,0x03};
    os.write(c); 
    os.flush(); 
    }
   
    }
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
   
    }


    
    /**
     * 
     */
    public static String bytesToHexString(byte[] src){ 
        StringBuilder stringBuilder = new StringBuilder(""); 
        if (src == null || src.length <= 0) { 
            return null; 
        } 
        for (int i = 0; i < src.length; i++) { 
            int v = src[i] & 0xFF; 
            String hv = Integer.toHexString(v); 
            if (hv.length() < 2) { 
                stringBuilder.append(0); 
            } 
            stringBuilder.append(hv); 
        } 
        return stringBuilder.toString(); 
    } 
    
    


}

0 0
原创粉丝点击