通过android DLL实现统一android wifi套接字通信

通过android DLL实现统一android wifi套接字通信,android,sockets,unity3d,dll,chat,Android,Sockets,Unity3d,Dll,Chat,我们能够在两个本地android应用程序和两个基于Unity的android应用程序之间建立socket wifi聊天。现在,根据新的要求,我们需要开发两个unity应用程序,这两个应用程序都有android dll和客户端和服务器代码 我们需要通过这些DLL连接两个基于unity的android应用程序,然后,我们需要开始它们之间的通信 Android服务器DLL public class Server { Activity activity; ServerSocket ser

我们能够在两个本地android应用程序和两个基于Unity的android应用程序之间建立socket wifi聊天。现在,根据新的要求,我们需要开发两个unity应用程序,这两个应用程序都有android dll和客户端和服务器代码

我们需要通过这些DLL连接两个基于unity的android应用程序,然后,我们需要开始它们之间的通信

Android服务器DLL

public class Server {
    Activity activity;
    ServerSocket serverSocket;
    String message = "";
    static final int socketServerPORT = 8082;

    private static volatile Server sSoleInstance;

    //private constructor.
    private Server(Activity activity) {

        //Prevent form the reflection api.
        if (sSoleInstance != null) {
            throw new RuntimeException("Use getInstance() method to get the single instance of this class.");
        } else {
            this.activity = activity;
            Thread socketServerThread = new Thread(new SocketServerThread());
            socketServerThread.start();
        }
    }

    public static Server getInstance(Activity activity) {
        if (sSoleInstance == null) { //if there is no instance available... create new one
            synchronized (Client.class) {
                if (sSoleInstance == null) sSoleInstance = new Server(activity);
            }
        }

        return sSoleInstance;
    }

/*  public Server(Activity activity) {
        this.activity = activity;
        Thread socketServerThread = new Thread(new SocketServerThread());
        socketServerThread.start();
    }*/

    public int getPort() {
        return socketServerPORT;
    }

    public void onDestroy() {
        if (serverSocket != null) {
            try {
                serverSocket.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    private class SocketServerThread extends Thread {

        int count = 0;

        @Override
        public void run() {
            try {
                serverSocket = new ServerSocket(socketServerPORT);

                while (true) {
                    Socket socket = serverSocket.accept();
                    count++;
                    message += "#" + count + " from "
                            + socket.getInetAddress() + ":"
                            + socket.getPort() + "\n";

                    activity.runOnUiThread(new Runnable() {

                        @Override
                        public void run() {
                            //activity.msg.setText(message);
                            Log.e("server message", message);
                        }
                    });

                    SocketServerReplyThread socketServerReplyThread = new SocketServerReplyThread(
                            socket, count);
                    socketServerReplyThread.run();

                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

    private class SocketServerReplyThread extends Thread {

        private Socket hostThreadSocket;
        int cnt;

        SocketServerReplyThread(Socket socket, int c) {
            hostThreadSocket = socket;
            cnt = c;
        }

        @Override
        public void run() {
            OutputStream outputStream;
            String msgReply = "Hello from Server, you are #" + cnt;

            try {
                outputStream = hostThreadSocket.getOutputStream();
                PrintStream printStream = new PrintStream(outputStream);
                printStream.print(msgReply);
                printStream.close();

                message += "replayed: " + msgReply + "\n";

                activity.runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                    //  activity.msg.setText(message);
                        Log.e("server message", message);
                    }
                });

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                message += "Something wrong! " + e.toString() + "\n";
            }

            activity.runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    Log.e("server message", message);
                    //activity.msg.setText(message);
                }
            });
        }

    }

    public String getIpAddress() {
        String ip = "";
        try {
            Enumeration<NetworkInterface> enumNetworkInterfaces = NetworkInterface
                    .getNetworkInterfaces();
            while (enumNetworkInterfaces.hasMoreElements()) {
                NetworkInterface networkInterface = enumNetworkInterfaces
                        .nextElement();
                Enumeration<InetAddress> enumInetAddress = networkInterface
                        .getInetAddresses();
                while (enumInetAddress.hasMoreElements()) {
                    InetAddress inetAddress = enumInetAddress
                            .nextElement();

                    if (inetAddress.isSiteLocalAddress()) {
                        ip += "Server running at : "
                                + inetAddress.getHostAddress();
                    }
                }
            }

        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            ip += "Something Wrong! " + e.toString() + "\n";
        }
        return ip;
    }
}
公共类服务器{
活动;
服务器套接字服务器套接字;
字符串消息=”;
静态最终int socketServerPORT=8082;
私有静态易失性服务器ssolenstance;
//私有构造函数。
专用服务器(活动){
//防止反射api。
if(sSoleInstance!=null){
抛出新的RuntimeException(“使用getInstance()方法获取该类的单个实例。”);
}否则{
这个。活动=活动;
Thread socketServerThread=新线程(新的socketServerThread());
socketServerThread.start();
}
}
公共静态服务器getInstance(活动){
如果(sSoleInstance==null){//如果没有可用的实例…创建一个新实例
已同步(Client.class){
if(sSoleInstance==null)sSoleInstance=新服务器(活动);
}
}
返回信度;
}
/*公共服务器(活动){
这个。活动=活动;
Thread socketServerThread=新线程(新的socketServerThread());
socketServerThread.start();
}*/
公共int getPort(){
返回socketServerPORT;
}
公共空间{
if(serverSocket!=null){
试一试{
serverSocket.close();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
私有类SocketServerThread扩展线程{
整数计数=0;
@凌驾
公开募捐{
试一试{
serverSocket=新的serverSocket(socketServerPORT);
while(true){
Socket=serverSocket.accept();
计数++;
消息+=“#”+计数+“来自”
+socket.getInetAddress()+“:”
+socket.getPort()+“\n”;
activity.runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
//activity.msg.setText(消息);
Log.e(“服务器消息”,消息);
}
});
SocketServerReplyThread SocketServerReplyThread=新的SocketServerReplyThread(
插座,计数);
socketServerReplyThread.run();
}
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
私有类SocketServerReplyThread扩展线程{
私有套接字hostThreadSocket;
int-cnt;
SocketServerReplyThread(Socket-Socket,int-c){
hostThreadSocket=套接字;
cnt=c;
}
@凌驾
公开募捐{
输出流输出流;
String msgReply=“你好,来自服务器,您是#”+cnt;
试一试{
outputStream=hostThreadSocket.getOutputStream();
PrintStream PrintStream=新的PrintStream(outputStream);
printStream.print(msgReply);
printStream.close();
消息+=“重播:”+msgReply+“\n”;
activity.runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
//activity.msg.setText(消息);
Log.e(“服务器消息”,消息);
}
});
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
消息+=“有问题!”+e.toString()+“\n”;
}
activity.runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
Log.e(“服务器消息”,消息);
//activity.msg.setText(消息);
}
});
}
}
公共字符串getIpAddress(){
字符串ip=“”;
试一试{
枚举enumNetworkInterfaces=网络接口
.getNetworkInterfaces();
while(enumNetworkInterfaces.hasMoreElements()){
NetworkInterface NetworkInterface=EnumNetworkInterface
.nextElement();
枚举enumInetAddress=网络接口
.getInetAddresses();
while(enumInetAddress.hasMoreElements()){
InetAddress InetAddress=enumInetAddress
.nextElement();
if(inetAddress.isSiteLocalAddress()){
ip+=“运行在以下位置的服务器:”
+inetAddress.getHostAddress();
}
}
}
}捕获(SocketException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
ip++=“有问题!”+e.toString()+“\n”;
}
返回ip;
}
}
Android客户端DLL代码

public class Client extends AsyncTask<Void, Void, Void> {

    String dstAddress;
    int dstPort = 8082;
    String response = "";
    String textResponse;

    private static volatile Client sSoleInstance;

    //private constructor.
    private Client(String addr, String textRespons) {

        //Prevent form the reflection api.
        if (sSoleInstance != null) {
            throw new RuntimeException("Use getInstance() method to get the single instance of this class.");
        } else {
           dstAddress = addr;
           this.textResponse = textRespons;
           execute();
        }
    }

    public static Client getInstance(String addr, String textRespons) {
        if (sSoleInstance == null) { //if there is no instance available... create new one
            synchronized (Client.class) {
                if (sSoleInstance == null) sSoleInstance = new Client(addr, textRespons);
            }
        }

        return sSoleInstance;
    }

    //Make singleton from serialize and deserialize operation.
   /* protected Client readResolve() {
        return getInstance();
    }*/

    /*Client(String addr,  String textResponse) {
        dstAddress = addr;
        //dstPort = port;
        this.textResponse = textResponse;
    }
*/
    @Override
    protected Void doInBackground(Void... arg0) {

        Socket socket = null;

        try {
            socket = new Socket(dstAddress, dstPort);

            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(
                    1024);
            byte[] buffer = new byte[1024];

            int bytesRead;
            InputStream inputStream = socket.getInputStream();

            /*
             * notice: inputStream.read() will block if no data return
             */
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                byteArrayOutputStream.write(buffer, 0, bytesRead);
                response += byteArrayOutputStream.toString("UTF-8");
            }

        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            response = "UnknownHostException: " + e.toString();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            response = "IOException: " + e.toString();
        } finally {
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        Log.e("Client response",response);
        //textResponse.setText(response);
        super.onPostExecute(result);
    }

}
公共类客户端扩展异步任务{
字符串地址;
int dstPort=8082;
字符串响应=”;
字符串文本响应;
私有静态易失性客户端;
//私有构造函数。
专用客户端(字符串地址、字符串文本响应){
 string ipAddress = inputFieldMacAddress.text.ToString();
        string response = "message";

        AndroidJavaClass myAndroidClass = new AndroidJavaClass("com.braintech.commoncommunicationport.socket_client.ClientMainClass");
        AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
        AndroidJavaObject myAndroidPlugin = myAndroidClass.CallStatic<AndroidJavaObject>("getInstance", ipAddress, response);

        myAndroidPlugin.Call("startClient", ipAddress, response); 
   AndroidJavaClass myAndroidClass = new AndroidJavaClass("com.braintech.commoncommunicationport.socket_server.Server");
        AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
        AndroidJavaObject myAndroidPlugin = myAndroidClass.CallStatic<AndroidJavaObject>("getInstance", activity);
      int port=  myAndroidPlugin.Call<int>("getPort");