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();
}
}
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();
}
}
相关文章推荐
- CentOS 6.0图解网络安装全过程
- 计算机网络常用英文单词
- iOS开发网络篇—GET请求和POST请求 iOS开发网络篇—GET请求和POST请求
- ASP.NET访问网络驱动器(映射磁盘)
- Http调试工具-Fiddler使用指引
- 网络处理2-异步POST请求和同步请求
- Android_开源框架_AndroidUniversalImageLoader网络图片加载
- PHP初学-http简述
- C# 文件读取和写入(UNC(网络共享)/本地文件/url文件)
- iOS网络开发——JSON数据解码(使用NSJSONSerialization)
- Web开发中关于servlet产生HTTP Status 404 - /webMVC/servlet/MyReturnMessage.jsp的处理
- C# HttpWebRequest采集时出现操作操时
- 获取本地IP与网络Ip及Mac地址
- 网络流
- android httpClient 支持HTTPS的2种处理方式
- hdu 3549 Flow Problem EK算法 网络流
- BP神经网络-详解
- Android网络编程-https
- http、TCP/IP协议与socket之间的区别
- Linux下基于HTTP协议带用户认证的GIT开发环境设置