每一部智能手机都是一部微型电脑,在学校里最喜欢的就是找上十个八个同学一起局域网内开几局dota,突然想到,拿手机C一个游戏来玩怎样,不用连wifi、不用开数据,几部手机选一个做主机,其他手机连上它的热点,便可以互动起来游戏搞起来了,多开心~~
实际实现过程中发现拿手机本身做server的手段还真是很少有人使用,网上也很少有现成的解决方案,经过一番摸索,简单实现了手机自身做server(可兼做客户端)的socket通信功能,写出来请大家指导一下,也是简单梳理一下方便日后复用。
遇到的最大问题可能是server端socket的阻塞问题,因为我们需要server端一直有socket处于监听状态,这样才能保证可以不断接受客户端的连接请求以及客户端发送的消息,进而广播给所有客户端机器。因此我们不能将serversocket放在MainActivity中,因为会阻塞app的运行,所以可以新建一个service,在service中定义serversocket的操作,在MainActivity中定义一个button,通过button启动service来打开server端。我的service代码如下:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import android.app.Service;
import android.content.Intent;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Message;
public class ServerSocketService extends Service{
private static ArrayList<Socket> socketList = new ArrayList<Socket>();
private ServerSocket serverSocket = null;
@Override
public IBinder onBind(Intent intent){
return null;
}
@Override
public void onCreate(){
super.onCreate();
}
@Override
public void onDestroy(){
super.onDestroy();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId){
try{
new Thread(new ServerThread()).start();
}catch(Exception e){
e.printStackTrace();
}
return START_STICKY;
}
public class ServerThread implements Runnable{
private Socket socket = null;
public ServerThread(){
}
public void run(){
try{
serverSocket = new ServerSocket(4567);
while(true){
socket = serverSocket.accept();
socketList.add(socket);
new Thread(new HandleInputMessageThread(socket)).start();
}
}catch(IOException e){
e.printStackTrace();
}
}
}
public class HandleInputMessageThread implements Runnable{
private Socket socket = null;
public HandleInputMessageThread(Socket sock){
this.socket = sock;
}
public void run(){
while(true){
InputStream inputStream = null;
try{
inputStream = socket.getInputStream();
byte data[] = new byte[1024*4];
int i = 0;
while((i = inputStream.read(data))!=-1){
String buffer = null;
buffer = new String(data,"gbk");
buffer = buffer.trim() + "\n";
OutputStream outputStream = null;
for(Socket sock : socketList){
outputStream = sock.getOutputStream();
outputStream.write(buffer.getBytes("gbk"));
outputStream.flush();
}
break;
}
}catch(IOException e){
e.printStackTrace();
}
}
}
}
}
客户端的实现就比较简单,客户端代码实现连接服务端功能以及发送消息数据等功能即可,此处不再贴出。
希望能对有需要的人有所帮助~路很长,慢慢飞