Merge remote-tracking branch 'origin/setupBranch' into setupBranch

This commit is contained in:
Lars
2020-10-20 16:38:59 +02:00
8 changed files with 62 additions and 21 deletions

View File

@@ -72,10 +72,10 @@ namespace Client
Array.Copy(message, 1, payload, 0, message.Length - 1);
switch (id)
{
case 0x01:
case JSONConvert.LOGIN:
// json log in username data
break;
case 0x02:
case JSONConvert.MESSAGE:
// json message data
(string, string) combo = JSONConvert.GetUsernameAndMessage(payload);
string textUsername = combo.Item1;
@@ -84,11 +84,11 @@ namespace Client
break;
case 0x03:
case JSONConvert.LOBBY:
// lobby data
//TODO fill lobby with the data received
break;
case 0x04:
case JSONConvert.CANVAS:
// canvas data
break;
default:

View File

@@ -5,6 +5,7 @@ using System.ComponentModel;
using System.Text;
using System.Windows.Input;
using SharedClientServer;
using System.Diagnostics;
namespace Client
{
@@ -43,9 +44,6 @@ namespace Client
{
get
{
if (_model == null)
_model = new Model();
return _model;
}
@@ -61,5 +59,10 @@ namespace Client
get { return _lobbies; }
set { _lobbies = value; }
}
public void OnHostButtonClick()
{
Debug.WriteLine("Click host button");
}
}
}

View File

@@ -12,7 +12,7 @@
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition/>
@@ -34,7 +34,6 @@
<Label Grid.Row="0" Content="This client information:" FontSize="17"/>
<Label Grid.Row="1" Grid.Column="0" Content="Your username:" FontSize="15" VerticalAlignment="Center"/>
<TextBox Name="usernameTextbox" Grid.Row="1" Grid.Column="1" MaxLength="10" FontSize="15" VerticalAlignment="Center"/>
<Label Grid.Row="2" Grid.Column="0" Content="Which color you want to be:" FontSize="15" VerticalAlignment="Center"/>
<ComboBox Name="colorSelection" Grid.Row="2" Grid.Column="1" VerticalAlignment="Center" FontSize="15">
@@ -48,6 +47,7 @@
</ComboBox>
<Label Grid.Row="3" Name="testLabel" FontSize="15" VerticalAlignment="Center"/>
<Label Content="place username here" Grid.Column="1" HorizontalAlignment="Center" Margin="0,12,0,0" VerticalAlignment="Top" Grid.Row="1"/>
</Grid>
@@ -68,7 +68,7 @@
<RowDefinition Height="50"/>
</Grid.RowDefinitions>
<Button Name="joinButton" Grid.Row="0" Content="join a selected lobby" Click="Button_Click" Width="200" Height="40" HorizontalAlignment="Left" Margin="10, 0, 0, 0"/>
<Button Name="hostButton" Grid.Row="1" Content="host a new lobby" Command="{Binding ...}" Width="200" Height="40" HorizontalAlignment="left" Margin="10, 0, 0, 0"/>
<Button Name="hostButton" Grid.Row="1" Content="host a new lobby" Command="{Binding Path=OnHostButtonClick}" Width="200" Height="40" HorizontalAlignment="left" Margin="10, 0, 0, 0"/>
</Grid>
</Grid>

View File

@@ -37,7 +37,6 @@ namespace Client
if(lobbySelected != null)
{
testLabel.Content = lobbySelected.ID;
usernameTextbox.IsEnabled = false;
colorSelection.IsEnabled = false;
joinButton.IsEnabled = false;
hostButton.IsEnabled = false;

View File

@@ -10,12 +10,12 @@ namespace Server.Models
{
class ServerClient : ObservableObject
{
public string Username { get; set; }
private TcpClient tcpClient;
private NetworkStream stream;
private byte[] buffer = new byte[1024];
private byte[] totalBuffer = new byte[1024];
private int totalBufferReceived = 0;
public User User { get; set; }
/// <summary>
@@ -84,24 +84,25 @@ namespace Server.Models
/// <param name="message">the incoming message</param>
private void HandleIncomingMessage(byte[] message)
{
Debug.WriteLine($"Got message from {Username} : {message}");
Debug.WriteLine($"Got message from {User?.Username} : {message}");
byte id = message[0];
byte[] payload = new byte[message.Length - 1];
Array.Copy(message,1,payload,0,message.Length-1);
switch(id)
{
case 0x01:
case JSONConvert.LOGIN:
// json log in username data
string uName = JSONConvert.GetUsernameLogin(message);
string uName = JSONConvert.GetUsernameLogin(payload);
if (uName != null)
{
Username = uName;
Debug.WriteLine("[SERVERCLIENT] set username to " + Username);
User = new User(uName);
User.Username = uName;
Debug.WriteLine("[SERVERCLIENT] set username to " + uName);
}
break;
case 0x02:
case JSONConvert.MESSAGE:
// json message data
(string, string) combo = JSONConvert.GetUsernameAndMessage(payload);
string textUsername = combo.Item1;
@@ -110,10 +111,10 @@ namespace Server.Models
// todo handle sending to all except this user the username and message to display in chat
break;
case 0x03:
case JSONConvert.LOBBY:
// lobby data
break;
case 0x04:
case JSONConvert.CANVAS:
// canvas data
// todo send canvas data to all other serverclients in lobby
break;

View File

@@ -18,6 +18,7 @@ namespace Server.Models
public List<Lobby> lobbies;
private Dictionary<Lobby, List<ServerClient>> serverClientsInlobbies;
public Action newClientAction;
/// <summary>
/// use a padlock object to make sure the singleton is thread-safe
@@ -98,7 +99,7 @@ namespace Server.Models
{
foreach (ServerClient sc in serverClients)
{
if (sc.Username != username) sc.sendMessage(message);
if (sc.User.Username != username) sc.sendMessage(message);
}
}

View File

@@ -7,10 +7,15 @@ namespace SharedClientServer
{
class JSONConvert
{
public const byte LOGIN = 0x01;
public const byte MESSAGE = 0x02;
public const byte LOBBY = 0x03;
public const byte CANVAS = 0x04;
public static (string,string) GetUsernameAndMessage(byte[] json)
{
string msg = Encoding.ASCII.GetString(json);
dynamic payload = JsonConvert.DeserializeObject(msg);
return (payload.username, payload.message);
}
@@ -19,5 +24,30 @@ namespace SharedClientServer
dynamic payload = JsonConvert.DeserializeObject(Encoding.ASCII.GetString(json));
return payload.username;
}
public static byte[] GetUsernameMessage(string uName)
{
return GetMessageToSend(LOGIN, new
{
username = uName
});
}
/// <summary>
/// constructs a message that can be sent to the clients or server
/// </summary>
/// <param name="identifier">the identifier for what kind of message it is</param>
/// <param name="payload">the json payload</param>
/// <returns>a byte array containing a message that can be sent to clients or server</returns>
public static byte[] GetMessageToSend(byte identifier, dynamic payload)
{
// convert the dynamic to bytes
byte[] payloadBytes = Encoding.ASCII.GetBytes(JsonConvert.SerializeObject(payload));
// make the array that holds the message and copy the payload into it with the first spot containing the identifier
byte[] res = new byte[payloadBytes.Length + 1];
Array.Copy(payloadBytes, 0, res, 1, payloadBytes.Length);
res[0] = identifier;
return res;
}
}
}

View File

@@ -17,6 +17,13 @@ namespace SharedClientServer
_host = host;
}
public User(string username)
{
_username = username;
_score = 0;
_host = false;
}
public string Username
{
get { return _username; }