SocketServerService

 avatar
hacker98
plain_text
5 months ago
10 kB
5
Indexable
main
package com.example.chatappdemo;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

import com.example.chatappdemo.DAO.ConversationDAO;
import com.example.chatappdemo.DAO.MessDAO;
import com.example.chatappdemo.DAO.MyinfoDAO;
import com.example.chatappdemo.DAO.ReceiveRequestDAO;
import com.example.chatappdemo.DAO.SentRequestDAO;
import com.example.chatappdemo.model.Conversation;
import com.example.chatappdemo.model.Mess;
import com.example.chatappdemo.model.Myinfo;
import com.example.chatappdemo.model.ReceiveRequest;

import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import java.util.Locale;

public class SocketServerService extends Service {

    private static final String TAG = "SocketServerService";
    private ServerSocket serverSocket;
    private Thread socketServerThread;
    private javaExternal func= new javaExternal();
    private Myinfo myinfo;
    @Override
    public void onCreate() {
        super.onCreate();
        MyinfoDAO myinfoDAO = new MyinfoDAO(this);
        String myIP= getDeviceIpAddress();
        myinfo = myinfoDAO.getInfoByIP(myIP);
        // Khởi tạo server trên một cổng nào đó
        socketServerThread = new Thread(() -> {
            try {
                serverSocket = new ServerSocket(1234);  // Chọn cổng cho server
                Log.i(TAG, "Server started on port 1234");

                while (!Thread.currentThread().isInterrupted()) {
                    Socket clientSocket = serverSocket.accept();
                    Log.i(TAG, "Client connected");
                    BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                    String message = in.readLine();
                    Log.i(TAG, "Message from client: " + message);
                    String messText="";
                    String ClientIP= String.valueOf(clientSocket.getInetAddress().getHostAddress());
                    try{
                        JSONObject jsonObject=new JSONObject(message.toString());
                        String type=jsonObject.getString("type");
                        switch (type) {
                            case "MESSAGE": {
                                JSONObject messageContent = jsonObject.getJSONObject("content");
                                messText = messageContent.getString("mess_text");
//                                save database
                                Log.i("Socket","tin nhan nhan duoc tu" +ClientIP+ " la : " + messText);
                                ConversationDAO conversationDAO = new ConversationDAO(this);
                                MessDAO messDAO =new MessDAO(this);
                                Conversation conversation =conversationDAO.getConversationByIPReceive(ClientIP);

//                               giai ma tin nhan
                                String messAlgorithm= messageContent.getString("algorithm");
                                String messDecrypt="giai ma that bai";
                                if(messAlgorithm.equals("AES128")){
                                    messDecrypt = func.decryptAES128(messText,conversation.getKeyEncrypt128());
                                }else if(messAlgorithm.equals("AES256")){
                                    messDecrypt = func.decryptAES256(messText,conversation.getKeyEncrypt256());
                                }else if(messAlgorithm.equals("SNOWV")){
                                    messDecrypt = func.decryptSNOWV(messText,conversation.getKeyEncrypt256());
                                }
//                               save database
                                Mess messSave= new Mess(conversation.getConver_id(),ClientIP,messText,getCurrentTime(),messAlgorithm);
                                conversation.setLast_mess(messDecrypt);
                                conversation.setLast_mess_time(getCurrentTime());
                                conversationDAO.updateConversation(conversation);
                                messDAO.insertMess(messSave);
//                                tao su kien
                                Intent intent = new Intent("com.example.chatappdemo.NEW_MESSAGE");
                                intent.putExtra("ClientIP",ClientIP);
                                intent.putExtra("message", messDecrypt);
                                sendBroadcast(intent);
                                break;
                            }
                            case "FRIEND_REQUEST": {
                                JSONObject messContent = jsonObject.getJSONObject("content");
//                            save database
                                String IPRequest = messContent.getString("IPRequest");
                                String name = messContent.getString("name");
                                String publicKey = messContent.getString("publicKey");
                                ReceiveRequest receiveRequest = new ReceiveRequest(IPRequest, name, publicKey);
                                ReceiveRequestDAO receiveRequestDAO = new ReceiveRequestDAO(this);
                                receiveRequestDAO.insertReceiveRequest(receiveRequest);

                                Intent intent = new Intent("com.example.chatappdemo.NEW_REQUEST");
                                sendBroadcast(intent);
                                break;
                            }
                            case "FRIEND_RESPONSE": {
                                JSONObject messContent = jsonObject.getJSONObject("content");
                                SentRequestDAO sentRequestDAO = new SentRequestDAO(this);
                                ConversationDAO conversationDAO = new ConversationDAO(this);

                                String IPSent = messContent.getString("IPSent");
                                String name = messContent.getString("name");
                                String key128 = messContent.getString("key128");
                                String key256= messContent.getString("key256");
                                String status = messContent.getString("status");


                                if (status.equals("ACCEPT")) {
                                    sentRequestDAO.deleteSentRequestByIP(IPSent);
//                                    giai ma khoa ma hoa
                                    String keyEnrypt128= func.decryptRSA(key128,myinfo.getPrivateKey());
                                    String keyEnrypt256 = func.decryptRSA(key256,myinfo.getPrivateKey());
//                                    luu vao database
                                    Conversation conversation = new Conversation(IPSent, name, " ", " ", keyEnrypt128,keyEnrypt256,"AES128");
                                    conversationDAO.insertConversation(conversation);
//                                    gui broadcast
                                    Intent intent = new Intent("com.example.chatappdemo.CHANGE_ADAPTER_ACCEPT");
                                    intent.putExtra("status",status);
                                    intent.putExtra("ClientIP",ClientIP);
                                    sendBroadcast(intent);
                                } else {
                                    sentRequestDAO.deleteSentRequestByIP(IPSent);
                                    Intent intent = new Intent("com.example.chatappdemo.CHANGE_ADAPTER_REFUSE");
                                    intent.putExtra("status",status);
                                    intent.putExtra("ClientIP",ClientIP);
                                    sendBroadcast(intent);
                                }
                                break;
                            }
                        }
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                    in.close();
                    clientSocket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
        socketServerThread.start();
    }
    public String getCurrentTime(){
        SimpleDateFormat sdf= new SimpleDateFormat("hh:mm a", Locale.getDefault());
        return sdf.format(new Date());
    }
    private String getDeviceIpAddress() {
        try {
            for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
                NetworkInterface intf = en.nextElement();
                for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
                    InetAddress inetAddress = enumIpAddr.nextElement();
                    if (!inetAddress.isLoopbackAddress() && inetAddress.getHostAddress().matches("\\d+\\.\\d+\\.\\d+\\.\\d+")) {
                        return inetAddress.getHostAddress();
                    }
                }
            }
        } catch (Exception ex) {
            Log.e(TAG, "Không thể lấy địa chỉ IP của thiết bị", ex);
        }
        return null;
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        // Dừng server socket khi service bị hủy
        if (serverSocket != null && !serverSocket.isClosed()) {
            try {
                serverSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        socketServerThread.interrupt();
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;  // Không sử dụng binding
    }
}
Editor is loading...
Leave a Comment