Packet nach Shared verschoben

This commit is contained in:
staccatomamba
2016-07-25 09:23:22 +02:00
parent 91b2c77fc9
commit 7c43f0dca7
18 changed files with 385 additions and 327 deletions

View File

@@ -96,6 +96,7 @@
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant-run-support" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/pre-dexed" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/reload-dex" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/restart-dex" />

View File

@@ -4,6 +4,7 @@ import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
@@ -17,6 +18,7 @@ import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.util.Base64;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
@@ -31,27 +33,38 @@ import android.widget.TextView;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import javax.crypto.NoSuchPaddingException;
import soapConnection.DataIdentifier;
import soapConnection.Packet;
import soapConnection.SoapConnectionManager;
import util.SecurityUtils;
import util.Util;
/**
* Created by bib on 03.05.2016.
*/
public class ChatActivity extends ActionBarActivity{
private static final String LOG_TAG = "CHAT";
//View Variablen
protected TextView chat;
protected EditText text;
@@ -59,20 +72,18 @@ public class ChatActivity extends ActionBarActivity{
//Server Variablen
public static Socket socket;
protected static final String dstAddress = "192.168.1.103"; //10.0.2.2"
protected static final int dstPort = 5000;
DataOutputStream st;
DataOutputStream socketOutputStream;
String SaveCompleteMS;
String saveCompleteMessage;
BufferedReader in = null;
// BufferedReader inputReader = null;
//Design View
protected ListView listView;
protected boolean isMe = true;
protected List<ChatMessageFormat> chatMessages;
protected ArrayAdapter<ChatMessageFormat> adapter;
ChatMessageFormat chatMessage;
public static List<ChatMessageFormat> chatMessages;
public static ArrayAdapter<ChatMessageFormat> adapter;
public static ChatMessageFormat chatMessage;
Thread currentlisten;
@@ -119,22 +130,12 @@ public class ChatActivity extends ActionBarActivity{
titlepic.setImageBitmap(GetCircleBitmap(customerImage));
}
//Online Status listener
/* ImageView img = (ImageView) mCustomView.findViewById(R.id.status);
img.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
ChatActivity.this.openOptionsMenu(); // activity's onCreateOptionsMenu gets called
//optionsMenu.performIdentifierAction(R.id., 0);
}
});*/
titlename.setText(name);
action.setCustomView(mCustomView);
action.setDisplayShowCustomEnabled(true);
senden = (Button)findViewById(R.id.Sendebutton);
//chat = (TextView)findViewById(R.id.ChatText);
chatMessages = new ArrayList<>();
@@ -144,26 +145,25 @@ public class ChatActivity extends ActionBarActivity{
listView.setAdapter(adapter);
try {
socket = MainActivityMitarbeiter.socket;
in = MainActivityMitarbeiter.in;
//nachricht an server senden welcher name jetz aktiv connected ist
st = new DataOutputStream(socket.getOutputStream());
}catch(Exception e){/*Fail*/}
MainActivityMitarbeiter.Test();
Log.i("CHAT", "listen is still alive: " + MainActivityMitarbeiter.listen.isAlive());
socketOutputStream = new DataOutputStream(socket.getOutputStream());
} catch(Exception e){
Log.e("CHAT_ERROR", "Fehler bei der Socket-Erstellung: " + e.getMessage());
}
// MainActivityMitarbeiter.listen.interrupt();
// MainActivityMitarbeiter.listen = null;
CreateFile();
ReadMessageToStorage();
//Öffnet eine Verbindung zum Server
// new Thread(new OpenConnection()).start();
//new Thread(new OpenConnection()).start();
text = (EditText)findViewById(R.id.editText);
@@ -175,12 +175,12 @@ public class ChatActivity extends ActionBarActivity{
//isMe = true;
if(text.getText().toString().equals("exit")){
if(text.getText().toString().equals("exit")) {
//eine möglich keit die connection zu schließen
// new Thread(new ConnectionClose()).start();
}else if(!text.getText().toString().equals("")){
} else if(!text.getText().toString().equals("")) {
new Thread(new MessageSender()).start();
}else{
} else {
Toast.makeText(ChatActivity.this, "Sie müssen schon Text eingeben ", Toast.LENGTH_SHORT).show();
}
}
@@ -191,63 +191,54 @@ public class ChatActivity extends ActionBarActivity{
t.start();
//MainActivityMitarbeiter.listen.sus
//sharedpreferences = true;
SharedPreferences sp = getSharedPreferences(Util.PREFS_NAME, 0);
SharedPreferences.Editor editor = sp.edit();
editor.putBoolean("IsInChatActivity", true);
editor.commit();
}
/*public class OpenConnection implements Runnable{
public void run(){
try {
socket = new Socket(dstAddress,dstPort);
// Log.v("Status: ","Vorhanden 3");
//nachricht an server senden welcher name jetz aktiv connected ist
dataOutputStream = new DataOutputStream(socket.getOutputStream());
name=name+"/1";
byte[] ts = name.getBytes();
dataOutputStream.write(ts);
dataOutputStream.flush();
} catch (Exception e) {
// e.printStackTrace();
Log.v("Connection: ","Konnte nicht Aufgebaut");
socket = null;
//methode zur abfrage
}
}
}*/
public class MessageSender implements Runnable{
public void run(){
String al = text.getText().toString();
byte[] ts = al.getBytes();
//TODO: Packet erstellen
//ChatActivity.
try{
if(socket!= null ) {
Log.i(LOG_TAG, "Sende Nachricht...");
if(socket != null ) {
Log.d(LOG_TAG, "Ist der Socket mit dem Server Verbunden: " + (socket.isConnected()));
Packet p = new Packet();
p.ChatMessage = text.getText().toString();
p.SenderPersonOid = SoapConnectionManager.User.getPersonOid().intValue();
p.ChatDataIdentifier = DataIdentifier.MESSAGE;
p.ChatName = SoapConnectionManager.User.getFullName();
p.RecipientPersonOid = personOid;
st.write(p.GetDataStream());
st.flush();
SharedPreferences settings = getSharedPreferences(Util.PREFS_NAME, 0);
byte[] tenantByteArray = Base64.decode(settings.getString(Util.PREFS_TENANT_KEY, null), Base64.DEFAULT);
ByteArrayInputStream tenantStream = new ByteArrayInputStream(tenantByteArray);
p.Tenant = SecurityUtils.decrypt(tenantStream).toString();
socketOutputStream.write(p.GetDataStream());
socketOutputStream.flush();
}
else {
Log.i("SEND_CHAT_MESSAGE","Socket ist null");
}
// Update der GUI
listView.post(new Runnable() {
@Override
public void run() {
Log.i(LOG_TAG, "Führe GUI-Update durch...");
Calendar c = Calendar.getInstance();
SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
String formattedDate = df.format(c.getTime());
SaveCompleteMS = text.getText().toString()+"/"+isMe+"%"+formattedDate+"\n";
saveCompleteMessage = text.getText().toString()+"/"+isMe+"%"+formattedDate+"\n";
WriteMessagesfromStorage(text.getText().toString()+"/"+isMe+"%"+formattedDate+"\n");
@@ -256,113 +247,73 @@ public class ChatActivity extends ActionBarActivity{
adapter.notifyDataSetChanged();
text.setText("");
}
});
}catch(IOException s){
Log.v("Status: ","Senden einer Nachricht konnte nicht ausgeführt werden. Save wird ausgeführt");
SaveAfterLoseConnection(SaveCompleteMS);
SaveAfterLoseConnection(saveCompleteMessage);
s.printStackTrace();
} catch (NoSuchPaddingException | InvalidAlgorithmParameterException | NoSuchAlgorithmException | InvalidKeyException e) {
e.printStackTrace();
}
}
}
/* public class ConnectionClose implements Runnable{
public void run(){
try {
// Log.v("Bin ich Überhaupt", "Hier drinne");
if (dataOutputStream != null) {
dataOutputStream.flush();
dataOutputStream.close();
}
if (socket != null)
socket = null;
// Log.v("Schliesen :","?? Möglich");
// }
Log.v("Status","Socket succesfull closed");
}catch(IOException se){
Log.v("Status: ","Schließen nicht möglich. Es ist ein Fehler aufgetreten");
}
}
}*/
// Erhalte Messages all the time
public class SocketListener implements Runnable{
String str;
long i = 1;
//BufferedReader in = null;
Packet chatPacket;
public void run(){
try{
//DesignTechnische gründe
Log.v("Komme","ICh den Rein");
while(true){
if (socket != null) {
Log.v("Komme","So wie es aussieht nicht ");
if(socket.isConnected()) {
Log.v("Connection Steht ", "Connection Steht");
Log.v("Komme","So wie es aussieht nicht2 ");
//final TextView text = (TextView)findViewById(R.id.ChatText);
final ListView listV = (ListView) findViewById(R.id.list_msg);
Log.v("Komme","So wie es aussieht nicht 3");
// in = new BufferedReader(new InputStreamReader(MainActivityMitarbeiter.socket.getInputStream()));
InputStream stream = socket.getInputStream();
/*---> da wird das pendant ausgeführt und nicht dieses */ String s = in.readLine();
Log.v("Komme","So wie es aussieht nicht 4");
CharSequence cs = text.getText();
int size = stream.available();
// wir nehmen mal cs raus
//str = cs + "\r\n" + s;
str = s;
if(size == 0) {
continue;
}
if (s == null)
break;
Log.i("", "");
StringBuilder total = new StringBuilder(stream.available());
int counter = 0;
while(counter < size) {
char c = (char) stream.read();
total.append(c);
counter++;
}
chatPacket = new Packet(total.toString());
//Design Spezifisch
listV.post(new Runnable() {
@Override
public void run() {
Calendar c = Calendar.getInstance();
SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
String formattedDate = df.format(c.getTime());
WriteMessagesfromStorage(chatPacket.ChatMessage + "/" + false + "%" + chatPacket.getFormattedMessageTimeStamp() + "\n");
boolean determind = false;
WriteMessagesfromStorage(str+"/"+determind+"%"+formattedDate+"\n");
chatMessage = new ChatMessageFormat(str, determind, formattedDate);
chatMessage = new ChatMessageFormat(chatPacket.ChatMessage, false, chatPacket.getFormattedMessageTimeStamp());
chatMessages.add(chatMessage);
adapter.notifyDataSetChanged();
Log.v("","");
if(isOnStop == true){
SetNotify("Bärtiger Hanz",str);
}
}
});
i++;
} else {
Log.i("SOCKETLISTENER/CHAT", "Nicht mit dem Socket verbunden");
}
} else {
if (in != null)
in.close();
}
// else Log.v("Connection","nicht aufgebaut"); nach tausend versuchen break und fehler ausgabe
}
}catch(Exception e){
Log.v("Status ","Verbindung zum Server wurde seitens dem Server getrennt ");
// Log.e(getClass().getName(),e.getMessage());
// e.printStackTrace();
Log.e("Status ","Verbindung zum Server wurde seitens dem Server getrennt ");
}
}
}
@@ -433,11 +384,11 @@ public class ChatActivity extends ActionBarActivity{
byte[] ts = al.getBytes();
try {
if (socket != null && st != null) {
if (socket != null && socketOutputStream != null) {
//try catch bei catch SaveAfterLoseConnection();
st.write(ts);
st.flush();
socketOutputStream.write(ts);
socketOutputStream.flush();
}
}catch(Exception xs){
@@ -518,9 +469,12 @@ public class ChatActivity extends ActionBarActivity{
}
public void onResume() {
isOnStop = false;
SharedPreferences sp = getSharedPreferences(Util.PREFS_NAME, 0);
SharedPreferences.Editor editor = sp.edit();
editor.putBoolean("IsInChatActivity", true);
editor.commit();
super.onResume();
}
@@ -529,9 +483,12 @@ public class ChatActivity extends ActionBarActivity{
// Thread t = new Thread(new ConnectionClose());
// t.start();
SharedPreferences sp = getSharedPreferences(Util.PREFS_NAME, 0);
SharedPreferences.Editor editor = sp.edit();
editor.putBoolean("IsInChatActivity", false);
editor.commit();
isOnStop = true;
super.onStop();
}
@@ -539,7 +496,10 @@ public class ChatActivity extends ActionBarActivity{
// Thread t = new Thread(new ConnectionClose());
// t.start();
// currentlisten = null;
SharedPreferences sp = getSharedPreferences(Util.PREFS_NAME, 0);
SharedPreferences.Editor editor = sp.edit();
editor.putBoolean("IsInChatActivity", false);
editor.commit();
super.onDestroy();
}

View File

@@ -5,9 +5,11 @@ import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.support.v4.app.NotificationCompat;
import android.os.Bundle;
import android.util.Base64;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
@@ -15,11 +17,12 @@ import android.view.View;
import android.widget.Button;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Calendar;
@@ -31,6 +34,9 @@ import soapConnection.Packet;
import soapConnection.SoapCalls;
import soapConnection.SoapConnectionManager;
import util.SecurityUtils;
import util.Util;
public class MainActivityMitarbeiter extends Activity {
@@ -39,10 +45,8 @@ public class MainActivityMitarbeiter extends Activity {
protected Button logoutbutton;
public static Socket socket;
protected static final String dstAddress = SoapCalls.DESTINATION_ADDRESS;
protected static final int dstPort = 5000;
DataOutputStream dataOutputStream;
public static BufferedReader in = null;
// public static BufferedReader inputReader = null;
//Name, der Zum Server gesendet wird
protected String name;
@@ -55,7 +59,7 @@ public class MainActivityMitarbeiter extends Activity {
File Unsendfile;
public static Thread listen;
public static SocketListener socketListener;
//Für Notification
private static boolean isOnStop = false;
@@ -139,7 +143,7 @@ public class MainActivityMitarbeiter extends Activity {
public class OpenConnection implements Runnable{
public void run(){
try {
socket = new Socket(dstAddress, dstPort);
socket = new Socket(SoapCalls.DESTINATION_ADDRESS, SoapCalls.DESTINATION_PORT);
Log.d("OpenConnection","Verbindung hergestellt");
SendAfterGetConnection();
@@ -152,7 +156,8 @@ public class MainActivityMitarbeiter extends Activity {
// dataOutputStream.flush();
// Starte SocketListener
listen = new Thread(new SocketListener());
socketListener = new SocketListener();
listen = new Thread(socketListener);
listen.start();
} catch (Exception e) {
@@ -174,54 +179,60 @@ public class MainActivityMitarbeiter extends Activity {
}
}
public static void Test() {
if(listen.isAlive()) {
try {
socketListener.terminate();
listen.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class SocketListener implements Runnable {
String str;
private volatile boolean running = true;
public void terminate() {
running = false;
}
public void run() {
try {
while (true) {
while (running) {
if (socket != null) {
if (socket.isConnected()) { //----------> isThreadPausabfrage das könnte das Problem mit dem SocketListener vorort beheben
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
Log.v("Connection Steht ", "Message Erhalten");
String s = in.readLine();
InputStream stream = socket.getInputStream();
String[] splitt = s.split(":");
int size = stream.available();
str = s;
if (s == null) {
break;
if(size == 0) {
continue;
}
Calendar c = Calendar.getInstance();
SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
String formattedDate = df.format(c.getTime());
StringBuilder total = new StringBuilder(stream.available());
boolean determind = false;
int counter = 0;
Log.v("MESSAGE",splitt[0]);
CreateFile(splitt[0]);
while(counter < size) {
Log.v("MESSAGE", "Komme ich in den Save-Bereich hinein");
char c = (char) stream.read();
WriteMessagesfromStorage(splitt[1] + "/" + determind + "%" + formattedDate + "\n");
total.append(c);
SetNotify(splitt[0], splitt[1]);
} else {
if (in != null) {
in.close();
counter++;
}
Log.i("MESSAGE/MAIN", "Empfangene Nachricht: " + total.toString());
}
}
}
} catch(Exception e) {
Log.v("Status ","Verbindung zum Server wurde serverseitig getrennt ");
// Log.e(getClass().getName(),e.getMessage());
in = null;
Log.e("Listener/Main", "" + e);
e.printStackTrace();
}
}
}
@@ -238,13 +249,9 @@ public class MainActivityMitarbeiter extends Activity {
socket.close();
}
if(in != null) {
in = null;
}
Log.v("Status","Socket succesfully closed");
Log.i("MAIN CONNECTION CLOSE","Socket succesfully closed");
}catch(IOException se){
Log.v("Fehler Aufgetreten",se.getMessage());
Log.e("MAIN ERROR:", se.getMessage());
}
}
}
@@ -274,9 +281,14 @@ public class MainActivityMitarbeiter extends Activity {
if(socket.isConnected()) {
try {
Packet p = new Packet();
p.ChatName = SoapConnectionManager.User.getFullName();
SharedPreferences settings = getSharedPreferences(Util.PREFS_NAME, 0);
byte[] tenantByteArray = Base64.decode(settings.getString(Util.PREFS_TENANT_KEY, null), Base64.DEFAULT);
ByteArrayInputStream tenantStream = new ByteArrayInputStream(tenantByteArray);
p.Tenant = SecurityUtils.decrypt(tenantStream).toString();
p.ChatDataIdentifier = DataIdentifier.LOGIN;
p.SenderPersonOid = SoapConnectionManager.User.getPersonOid().intValue();
new Thread(new TestMessageSender(p.GetDataStream())).start();
} catch(Exception e) {

View File

@@ -18,8 +18,6 @@ public class MessageAdapter extends ArrayAdapter<ChatMessageFormat> {
private Activity activity;
private List<ChatMessageFormat> messages;
public MessageAdapter(Activity context, int resource, List<ChatMessageFormat> objects) {
super(context, resource, objects);
this.activity = context;
@@ -36,37 +34,21 @@ public class MessageAdapter extends ArrayAdapter<ChatMessageFormat> {
ChatMessageFormat chatMessage = getItem(position);
int viewType = getItemViewType(position);
//Splitt message um zu wissen ob from server oder nicht
String line = chatMessage.getMessage();
String[] splitt = line.split(":");
// String line = chatMessage.getMessage();
//Server nachricht kenntlich machen
if (chatMessage.getIsME()) {
layoutResource = R.layout.item_chat_right;
} else if(splitt[0].equals("Server")) {
layoutResource = R.layout.item_chat_sever_right;
// } else if(splitt[0].equals("Server")) {
// layoutResource = R.layout.item_chat_sever_right;
}else {
layoutResource = R.layout.item_chat_left;
}
/* Original
if (chatMessage.getIsME()) {
layoutResource = R.layout.item_chat_left;
} else {
layoutResource = R.layout.item_chat_right;
}
*/
/* if (convertView != null) {
holder = (ViewHolder) convertView.getTag();
Log.v("Status","Bin ich hier ?? ");
} else {*/
convertView = inflater.inflate(layoutResource, parent, false);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
//}
//set message content
holder.msg.setText(chatMessage.getMessage());
@@ -74,8 +56,9 @@ public class MessageAdapter extends ArrayAdapter<ChatMessageFormat> {
//TODO eine weitere option für Chatmessage hinzufügen zum abfragen wegen send Message
if(holder.send_tick != null)
holder.send_tick.setText(Html.fromHtml("&#x2713;")+""+Html.fromHtml("&#x2713;"));
if(holder.send_tick != null) {
holder.send_tick.setText(Html.fromHtml("&#x2713;") + "" + Html.fromHtml("&#x2713;"));
}
if(chatMessage.getIsME()){

View File

@@ -7,7 +7,8 @@ public enum DataIdentifier {
MESSAGE(0),
LOGIN(1),
LOGOUT(2),
NULL(3);
NULL(3),
STATUS_NOTIFICATION(4);
private final int value;
DataIdentifier(int value) {
@@ -17,4 +18,16 @@ public enum DataIdentifier {
public int getValue() {
return value;
}
public static DataIdentifier getEnumValue(int pValue) {
DataIdentifier[] identifiers = DataIdentifier.values();
for (DataIdentifier identifier : identifiers) {
if (identifier.getValue() == pValue) {
return identifier;
}
}
return DataIdentifier.NULL;
}
}

View File

@@ -4,7 +4,13 @@ import android.util.Log;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
/**
* Created by JettenM on 05.07.2016.
@@ -15,29 +21,73 @@ public class Packet {
public int SenderPersonOid;
public int RecipientPersonOid;
public String ChatMessage;
public Date MessageTimeStamp;
public String Tenant;
public Packet() {
ChatDataIdentifier = DataIdentifier.NULL;
ChatMessage = null;
ChatName = null;
SenderPersonOid = 0;
ChatMessage = "";
ChatName = SoapConnectionManager.User.getFullName();
Tenant = "";
SenderPersonOid = SoapConnectionManager.User.getPersonOid().intValue();
RecipientPersonOid = 0;
MessageTimeStamp = Calendar.getInstance().getTime();
}
public String getFormattedMessageTimeStamp() {
DateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
return df.format(MessageTimeStamp);
}
public Packet(byte[] dataStream) {
ChatDataIdentifier = DataIdentifier.values()[ByteBuffer.allocate(4).getInt()];
//Aufbau Message:
// die ersten fünf ";" ignorieren
// SenderOid;RecipientOid;ClientNameLength;MessageLength;ChatDataIdentifier;Tenant;[ClientName][ChatMessage][MessageTimeStamp]
//23;281;20;389;1;[Tenant]; 6 Semikola
public Packet(String message) {
String[] gesplittet = message.split(";");
String senderPersonOidString = gesplittet[0];
String recipientPersonOidString = gesplittet[1];
String chatNameLengthString = gesplittet[2];
String chatMessageLengthString = gesplittet[3];
String chatIdentifierString = gesplittet[4];
Tenant = gesplittet[5];
SenderPersonOid = Integer.parseInt(senderPersonOidString);
RecipientPersonOid = Integer.parseInt(recipientPersonOidString);
ChatDataIdentifier = DataIdentifier.getEnumValue(Integer.parseInt(chatIdentifierString));
int chatNameLength = Integer.parseInt(chatNameLengthString);
int chatMessageLength = Integer.parseInt(chatMessageLengthString);
int headerLength = senderPersonOidString.length() + recipientPersonOidString.length() + chatNameLengthString.length() + chatMessageLengthString.length() + chatIdentifierString.length() + Tenant.length() + 7;
String actualMessage = message.substring(headerLength - 1);
ChatName = actualMessage.substring(0, chatNameLength);
ChatMessage = actualMessage.substring(chatNameLength, chatMessageLength + chatNameLength);
String dateString = actualMessage.substring(chatMessageLength + chatNameLength);
DateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss", Locale.GERMAN);
try {
MessageTimeStamp = df.parse(dateString);
} catch (ParseException e) {
e.printStackTrace();
}
}
public byte[] GetDataStream() {
String dataStreamAsString = "" + SenderPersonOid + ";" + RecipientPersonOid + ";" + ChatName.length() + ";" + ChatMessage.length() + ";";
String dataStreamAsString = "" + SenderPersonOid + ";" + RecipientPersonOid + ";" + ChatName.length() + ";" + ChatMessage.length()+ ";" + ChatDataIdentifier.getValue() + ";" + Tenant + ";";
dataStreamAsString += ChatName + ChatMessage;
dataStreamAsString += ChatName + ChatMessage + getFormattedMessageTimeStamp();
byte[] blaaah = new byte[1024];
byte[] blaaah = new byte[dataStreamAsString.length()];
try {
blaaah = dataStreamAsString.getBytes("UTF8");

View File

@@ -9,6 +9,7 @@ public class SoapCalls {
public static String GET_CONTACTS_FOR_PERSON = "GetContactsForPerson";
public static String DESTINATION_ADDRESS = "192.168.1.103";
public static int DESTINATION_PORT = 5000;
public static String TOKEN_CHECK_URL = "http://" + DESTINATION_ADDRESS + "/bewoplanermobil/main/checktoken?token=";

View File

@@ -42,6 +42,7 @@
android:id="@+id/editText"
android:hint="@string/hinttxt_chat"
android:padding="10dp"
android:maxLength="1024"
/>
<!-- width -> 300dp heigh -> 60dp android:layout_marginBottom="30dp" android:layout_marginBottom="30dp"

View File

@@ -69,7 +69,6 @@
<Reference Include="WindowsBase" />
</ItemGroup>
<ItemGroup>
<Compile Include="Packet.cs" />
<Compile Include="Server.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>

View File

@@ -1,82 +0,0 @@
using System;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Text;
using BS.Shared;
namespace BeWoChatServer
{
public class Packet
{
public Socket Socket { get; set; }
public int ClientNumber { get; set; }
public string ClientName { get; set; }
public long SenderPersonOid { get; set; }
public long RecipientPersonOid { get; set; }
public DataIdentifier DataIdentifier { get; set; }
public string ChatMessage { get; set; }
public byte[] DataBuffer = new byte[1024];
public Packet(Socket pSocket, int pClientNumber, string pClientName, long pSenderPersonOid, long pRecipientPersonOid)
{
Socket = pSocket;
ClientNumber = pClientNumber;
ClientName = pClientName;
SenderPersonOid = pSenderPersonOid;
RecipientPersonOid = pRecipientPersonOid;
}
// 0 4 8 12 20 28
// Description -> |dataIdentifier|name length|message length|sender person oid|recipient person oid| name | message |
// Size in bytes -> | 4 | 4 | 4 | 8 | 8 |name length|message length|
public Packet(byte[] dataStream)
{
DataIdentifier = (DataIdentifier)BitConverter.ToInt32(dataStream, 0);
var nameLength = BitConverter.ToInt32(dataStream, 4);
var messageLength = BitConverter.ToInt32(dataStream, 8);
SenderPersonOid = BitConverter.ToInt64(dataStream, 12);
RecipientPersonOid = BitConverter.ToInt64(dataStream, 20);
ClientName = nameLength > 0 ? Encoding.UTF8.GetString(dataStream, 28, nameLength) : null;
ChatMessage = messageLength > 0 ? Encoding.UTF8.GetString(dataStream, 28 + nameLength, messageLength) : null;
}
public void GetData(string message)
{
//Aufbau Message:
// die ersten fünf ";" ignorieren
// SenderOid;RecipientOid;ClientNameLength;MessageLength;ChatDataIdentifier;ClientNameChatMessage
//23;281;20;389;1; 5 Semikola
var gesplittet = message.Split(';');
SenderPersonOid = Convert.ToInt64(gesplittet[0]);
RecipientPersonOid = Convert.ToInt64(gesplittet[1]);
var chatNameLength = Convert.ToInt32(gesplittet[2]);
var chatMessageLength = Convert.ToInt32(gesplittet[3]);
var headerLength = gesplittet[0].Length + gesplittet[1].Length + gesplittet[2].Length + gesplittet[3].Length + 5;
var actualMessage = message.Substring(headerLength - 1);
ClientName = actualMessage.Substring(0, chatNameLength);
ChatMessage = actualMessage.Substring(chatNameLength);
}
// Java kennt nur unsigned bytes (-127 bis 128)
public byte[] GetDataStream()
{
var result = "";
return Encoding.UTF8.GetBytes(result);
}
}
}

View File

@@ -6,6 +6,7 @@ using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using BeWo.Data;
using BeWo.Data.Access;
using BeWo.Data.Entities;
@@ -16,7 +17,10 @@ namespace BeWoChatServer
{
public class Server
{
private static object _Lock = string.Empty;
// Fehlercodes zwischen 1000 und 1499
//TODO: Login hier implementieren und das andere Projekt löschen
private static readonly object _Lock = string.Empty;
private static readonly Dictionary<Socket, long> clientList = new Dictionary<Socket, long>();
protected static Socket serverSocket;
@@ -25,17 +29,10 @@ namespace BeWoChatServer
private static int clientCount;
static Packet dataPacketsdf;
public static void Main(string[] args)
{
try
{
// Benutzt den DefaultHibernateSessionManager
DefaultHibernateSessionManager.CurrentTenant = "demo";
DefaultHibernateSessionManager.OpenSession();
var test = DAOFactory.GenericDAO.LoadByID<ChatMessage>(1);
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
var server = new IPEndPoint(IPAddress.Any, 5000);
@@ -53,8 +50,6 @@ namespace BeWoChatServer
}
}
//TODO: Datenbankverbindung herstellen
public static void OnClientConnected(IAsyncResult asyncResult)
{
try
@@ -65,7 +60,7 @@ namespace BeWoChatServer
clientList.Add(workerSocket, 0);
WaitForClientData(workerSocket, clientCount, "LEER", 0, 0);
WaitForClientData(workerSocket, "", 0, 0);
serverSocket.BeginAccept(OnClientConnected, null);
}
@@ -75,7 +70,7 @@ namespace BeWoChatServer
}
}
public static void WaitForClientData(Socket socket, int clientNumber, string clientName, long oid, long recipientPersonOid)
public static void WaitForClientData(Socket socket, string clientName, long oid, long recipientPersonOid)
{
try
{
@@ -84,7 +79,7 @@ namespace BeWoChatServer
asyncCallback = OnReceiveData;
}
var packet = new Packet(socket, clientNumber, clientName, oid, recipientPersonOid);
var packet = new Packet(socket, clientName, oid, recipientPersonOid);
socket.BeginReceive(packet.DataBuffer, 0, packet.DataBuffer.Length, SocketFlags.None, asyncCallback, packet);
}
@@ -98,6 +93,8 @@ namespace BeWoChatServer
{
var dataPacket = (Packet) asyncResult.AsyncState;
Debug.WriteLine("Nachricht erhalten " + DateTime.Now);
try
{
var responseByteCount = dataPacket.Socket.EndReceive(asyncResult);
@@ -114,8 +111,6 @@ namespace BeWoChatServer
dataPacket.GetData(message);
}
// Nur bei DataIdentifier.Login
//TODO: SenderOid im Dictionary speichern
switch(dataPacket.DataIdentifier) {
case DataIdentifier.Login:
var endPoint = dataPacket.Socket.RemoteEndPoint;
@@ -127,6 +122,12 @@ namespace BeWoChatServer
{
clientList[dataPacket.Socket] = dataPacket.SenderPersonOid;
}
//foreach(var client in clientList)
//{
// client.Key.Send(Encoding.UTF8.GetBytes("Client eingeloggt"));
//}
break;
case DataIdentifier.Message:
if(responseByteCount == 0)
@@ -136,21 +137,37 @@ namespace BeWoChatServer
}
else
{
try
{
Monitor.Enter(_Lock);
DefaultHibernateSessionManager.CurrentTenant = "demo";
DefaultHibernateSessionManager.CurrentTenant = dataPacket.Tenant;
var chatMessage = new ChatMessage
{
SenderPersonOid = dataPacket.SenderPersonOid,
ChatText = dataPacket.ChatMessage,
EmpfängerPersonOid = dataPacket.RecipientPersonOid,
Uhrzeit = dataPacket.MessageTimeStamp,
InsUser = dataPacket.ClientName
};
DAOFactory.GenericDAO.Insert(chatMessage);
if(dataPacket.RecipientPersonOid > 0 && clientList.ContainsValue(dataPacket.RecipientPersonOid))
{
var recipients = clientList.Where(w => w.Value.Equals(dataPacket.RecipientPersonOid));
foreach(var recipient in recipients)
{
recipient.Key.Send(dataPacket.GetDataStream());
}
}
}
finally
{
Monitor.Exit(_Lock);
}
// in DB speichern und an evtl. an den Empfänger schicken, sofern dieser in der clientList enthalten ist
}
break;
@@ -158,10 +175,18 @@ namespace BeWoChatServer
break;
}
WaitForClientData(dataPacket.Socket, dataPacket.ClientNumber, dataPacket.ClientName, dataPacket.SenderPersonOid, dataPacket.RecipientPersonOid);
WaitForClientData(dataPacket.Socket, dataPacket.ClientName, dataPacket.SenderPersonOid, dataPacket.RecipientPersonOid);
}
catch (Exception e)
{
var sender = dataPacket.Socket;
if(clientList.ContainsKey(sender))
{
clientList.Remove(sender);
sender.Close();
}
Debug.WriteLine("ChatServerException: " + e.Message);
}
}

Binary file not shown.

View File

@@ -1,7 +1,9 @@
using System.Linq;
using System;
using System.Linq;
using System.Web.Services;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Service.ServiceContracts;
using BeWo.Service.ServiceImplementations;

View File

@@ -60,12 +60,11 @@ namespace BeWo.Data
var baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
var splittedBaseDirectory = baseDirectory.Split('\\'); // 0 -3
var correctBaseDirectory = string.Empty;
for(var i = 0; i < 4; i++)
{
correctBaseDirectory += splittedBaseDirectory[i] + "\\";
}
var test = correctBaseDirectory;
_SessionFactories[CurrentTenant] = new Configuration().Configure(Path.Combine(correctBaseDirectory, @"Multitenancy\" + CurrentTenant + ".config")).BuildSessionFactory();
}

View File

@@ -22,6 +22,10 @@ namespace BeWo.Data.Entities
private long? _SenderPersonOid;
public ChatMessage()
{
_Tid = TableID.ChatMessage;
}
public virtual string ChatText
{

View File

@@ -827,6 +827,7 @@ namespace BS.Shared
Message,
Login,
Logout,
Null
Null,
StatusNotification
}
}

88
Shared/Packet.cs Normal file
View File

@@ -0,0 +1,88 @@
using System;
using System.Diagnostics;
using System.Globalization;
using System.Net.Sockets;
using System.Text;
using BS.Shared;
namespace BeWoChatServer
{
public class Packet
{
// Fehlercodes zwischen 1500 und 1999
public Socket Socket { get; set; }
public string ClientName { get; set; }
public long SenderPersonOid { get; set; }
public long RecipientPersonOid { get; set; }
public DataIdentifier DataIdentifier { get; set; }
public string ChatMessage { get; set; }
public DateTime MessageTimeStamp { get; set; }
public string Tenant { get; set; }
public byte[] DataBuffer = new byte[1024];
//Aufbau Message:
// die ersten fünf ";" ignorieren
// SenderOid;RecipientOid;ClientNameLength;MessageLength;ChatDataIdentifier;Tenant;[ClientName][ChatMessage][MessageTimeStamp]
//23;281;20;389;1;[Tenant]; 6 Semikola
public Packet(Socket pSocket, string pClientName, long pSenderPersonOid, long pRecipientPersonOid)
{
Socket = pSocket;
ClientName = pClientName;
SenderPersonOid = pSenderPersonOid;
RecipientPersonOid = pRecipientPersonOid;
MessageTimeStamp = DateTime.Now;
}
public void GetData(string message)
{
Debug.WriteLine("Nachricht: " + message);
try
{
var gesplittet = message.Split(';');
var senderPersonOidString = gesplittet[0];
var recipientPersonOidString = gesplittet[1];
var chatNameLengthString = gesplittet[2];
var chatMessageLengthString = gesplittet[3];
var chatIdentifierString = gesplittet[4];
Tenant = gesplittet[5];
DataIdentifier = (DataIdentifier) Convert.ToInt32(chatIdentifierString);
SenderPersonOid = Convert.ToInt64(senderPersonOidString);
RecipientPersonOid = Convert.ToInt64(recipientPersonOidString);
var chatNameLength = Convert.ToInt32(chatNameLengthString);
var chatMessageLength = Convert.ToInt32(chatMessageLengthString);
var headerLength = senderPersonOidString.Length + recipientPersonOidString.Length + chatNameLengthString.Length + chatMessageLengthString.Length + chatIdentifierString.Length + Tenant.Length + 7;
var actualMessage = message.Substring(headerLength - 1);
ClientName = actualMessage.Substring(0, chatNameLength);
ChatMessage = actualMessage.Substring(chatNameLength, chatMessageLength);
var dateString = actualMessage.Substring(chatMessageLength + chatNameLength);
MessageTimeStamp = DateTime.ParseExact(dateString, "dd.MM.yyyy HH:mm:ss", CultureInfo.InvariantCulture);
}
catch(Exception exception)
{
Debug.WriteLine("Error 1500: " + exception.Message);
}
}
public byte[] GetDataStream()
{
var result = "";
result += SenderPersonOid + ";" + RecipientPersonOid + ";" + ClientName.Length + ";" + ChatMessage.Length + ";" + (int) DataIdentifier + ";" + Tenant + ";" + ClientName + ChatMessage + DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss");
return Encoding.UTF8.GetBytes(result);
}
}
}

View File

@@ -216,6 +216,7 @@
<Compile Include="Extensions\EnumExtensions.cs" />
<Compile Include="Extensions\ICollectionExtensions.cs" />
<Compile Include="Extensions\IDictionaryTExtensions.cs" />
<Compile Include="Packet.cs" />
<Compile Include="Rss\RssManager.cs" />
<Compile Include="Services\BillingData.cs" />
<Compile Include="Services\Calculations.cs" />