SocketServerService
plain_texta year ago
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
}
}ScanNetworkActivity
plain_texta year ago
package com.example.chatappdemo;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.io.IOException;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.concurrent.CountDownLatch;
public class ScanNetworkActivity extends AppCompatActivity {
private static final String TAG = "NetworkScan";
private static final int TIMEOUT_MS = 100; // Thời gian chờ (timeout) khi ping
private ListView listView;
private ArrayAdapter<String> adapter;
private List<String> ipList = new ArrayList<>();
private final int TOTAL_THREADS = 10;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scan_network);
listView = findViewById(R.id.listView);
adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, ipList);
listView.setAdapter(adapter);
ipList.clear();
adapter.notifyDataSetChanged();
CountDownLatch latch = new CountDownLatch(TOTAL_THREADS);
Toast.makeText(ScanNetworkActivity.this, "Bắt đầu quét mạng...", Toast.LENGTH_SHORT).show();
String subnet="192.168.244";
new Thread(() -> startNetworkScan(subnet, 1, 25, latch)).start();
new Thread(() -> startNetworkScan(subnet, 26, 50, latch)).start();
new Thread(() -> startNetworkScan(subnet, 51, 75, latch)).start();
new Thread(() -> startNetworkScan(subnet, 76, 100, latch)).start();
new Thread(() -> startNetworkScan(subnet, 101, 125, latch)).start();
new Thread(() -> startNetworkScan(subnet, 126, 150, latch)).start();
new Thread(() -> startNetworkScan(subnet, 151, 175, latch)).start();
new Thread(() -> startNetworkScan(subnet, 176, 200, latch)).start();
new Thread(() -> startNetworkScan(subnet, 201, 225, latch)).start();
new Thread(() -> startNetworkScan(subnet, 226, 254, latch)).start();
// Tạo một luồng để đợi cho tất cả luồng quét hoàn thành
new Thread(() -> {
try {
latch.await();
runOnUiThread(() -> {
Toast.makeText(ScanNetworkActivity.this, "Quét mạng hoàn tất!", Toast.LENGTH_SHORT).show();
});
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
// Xử lý khi người dùng chọn IP từ danh sách
listView.setOnItemClickListener((parent, view, position, id) -> {
String selectedIp = ipList.get(position);
Toast.makeText(ScanNetworkActivity.this, "Đã chọn IP: " + selectedIp, Toast.LENGTH_SHORT).show();
Intent intent = new Intent(ScanNetworkActivity.this, ChatActivity.class);
intent.putExtra("conversation_IP",selectedIp);
startActivity(intent);
});
}
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;
}
// Phương thức quét mạng cho một phạm vi IP nhất định
private void startNetworkScan(String subnet, int start, int end, CountDownLatch latch) {
String deviceIpAddress = getDeviceIpAddress();
// Quét từng IP trong phạm vi start đến end
for (int i = start; i <= end; i++) {
String host = subnet + "." + i;
// Bỏ qua IP của thiết bị hiện tại
if (host.equals(deviceIpAddress)) {
Log.d(TAG, "Bỏ qua địa chỉ IP của thiết bị: " + host);
continue;
}
// Thực hiện quét từng IP và cập nhật giao diện
try {
InetAddress inetAddress = InetAddress.getByName(host);
if (inetAddress.isReachable(TIMEOUT_MS)) {
Log.d(TAG, "Đã tìm thấy thiết bị: " + host);
// Cập nhật danh sách IP trên UI
runOnUiThread(() -> {
ipList.add(host);
adapter.notifyDataSetChanged();
});
} else {
Log.d(TAG, "Không thể ping IP: " + host);
}
// Tạm dừng giữa các lần quét để giảm tải hệ thống
Thread.sleep(100); // Nghỉ 100ms giữa các lần quét để tránh quá tải
} catch (IOException | InterruptedException e) {
Log.e(TAG, "Lỗi khi quét IP: " + host, e);
}
}
latch.countDown();
}
}
RSAKey
plain_texta year ago
package com.example.chatappdemo;
public class RSAKey {
public String publicKey;
public String privateKey;
public RSAKey(){
publicKey = new String();
privateKey = new String();
}
public RSAKey(String publicKey, String privateKey) {
this.publicKey = publicKey;
this.privateKey = privateKey;
}
public String getPublicKey() {
return publicKey;
}
public void setPublicKey(String publicKey) {
this.publicKey = publicKey;
}
public String getPrivateKey() {
return privateKey;
}
public void setPrivateKey(String privateKey) {
this.privateKey = privateKey;
}
}RequestReceiveAdapter
plain_texta year ago
package com.example.chatappdemo;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.chatappdemo.model.Conversation;
import com.example.chatappdemo.model.ReceiveRequest;
import java.util.List;
public class RequestReceiveAdapter extends RecyclerView.Adapter<RequestReceiveAdapter.RequestReceiveViewHolder> {
private List<ReceiveRequest> requestList;
private OnRequestClickListener listener;
public RequestReceiveAdapter(List<ReceiveRequest> requestList, OnRequestClickListener listener) {
this.requestList = requestList;
this.listener = listener;
}
@NonNull
@Override
public RequestReceiveViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_request_receive, parent, false); // Thay đổi layout theo tên file item layout bạn đã tạo
return new RequestReceiveViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull RequestReceiveViewHolder holder, int position) {
ReceiveRequest request = requestList.get(position);
holder.textViewIPRequest.setText(request.getIPRequest());
holder.textViewName.setText(request.getName());
holder.bind(request, listener);
}
public void updateRequestList(List<ReceiveRequest> updatedRequestList) {
// Cập nhật lại danh sách dữ liệu mới
this.requestList.clear();
this.requestList.addAll(updatedRequestList);
// Thông báo cho adapter rằng dữ liệu đã thay đổi
notifyDataSetChanged();
}
@Override
public int getItemCount() {
return requestList.size();
}
public static class RequestReceiveViewHolder extends RecyclerView.ViewHolder {
TextView textViewIPRequest;
TextView textViewName;
public RequestReceiveViewHolder(@NonNull View itemView) {
super(itemView);
textViewIPRequest = itemView.findViewById(R.id.textViewIPRequest); // Đảm bảo ID đúng trong layout
textViewName = itemView.findViewById(R.id.textViewName); // Đảm bảo ID đúng trong layout
}
public void bind(ReceiveRequest request, OnRequestClickListener listener) {
// Xử lý sự kiện click vào item
itemView.setOnClickListener(v -> {
if (listener != null) {
listener.onRequestClick(request);
}
});
}
}
}OnRequestClickListener
plain_texta year ago
package com.example.chatappdemo;
import com.example.chatappdemo.model.ReceiveRequest;
public interface OnRequestClickListener {
void onRequestClick(ReceiveRequest request);
}