您的位置:首页 > 理论基础 > 计算机网络

android tcp/ip server接多个client

2015-08-28 14:27 465 查看
网上找了个例子改了下,测试几个点没有问题,太多的话,没有测试过,如有高手,请指教

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();

}





}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: