Frågan#1
Jag försöker konvertera denna chatkod i länken nedan som är byggt i php till c#
Får inte riktigt till det eftersom PHP och ASP.NET skiljer sig ganska mycket i hur arrayer fungerar och sessions. Jag har försökt med en arraylist och även hashtable som php-arrayer egentligen är.
Här är länken:
http://anantgarg.com/2009/05/13/gmail-facebook-style-jquery-chat/
Här är min kod
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections;
namespace wwwroot.chat
{
public partial class chathandler : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString["action"] != null)
{
switch (Request.QueryString["action"].ToString())
{
case "chatheartbeat":
{
chatHeartbeat();
break;
}
case "sendchat":
{
sendChat();
break;
}
case "closechat":
{
closeChat();
break;
}
case "startchatsession":
{
startChatSession();
break;
}
}
}
if (Session["chatHistory"] == null)
{
Session["chatHistory"] = new ArrayList(); ;
}
if (Session["openChatBoxes"] == null)
{
Session["openChatBoxes"] = new ArrayList();
}
if(Session["tsChatBoxes"]==null)
{
Session["tsChatBoxes"] = new ArrayList();
}
ArrayList s = new ArrayList();
}
private void chatHeartbeat()
{
/* Add the Code to get the chat from the databse here and assign the result to datatable dtChat */
GenericCollection<Chat> messages = Chat.GetNotRecieved(User.Identity.Name);
string items = "";
foreach (Chat message in messages)
{
if (!((ArrayList)(Session["openChatBoxes"])).Contains(message.UsernameFrom) && ((ArrayList)(Session["chatHistory"])).Contains(message.UsernameFrom))
{
items = ((ArrayList)(Session["chatHistory"]))[((ArrayList)(Session["chatHistory"])).IndexOf((object)(message.UsernameFrom))].ToString();
}
message.Message = sanitize(message.Message);
items = items + "\"s\":\"0\",\"f\":\"{" + message.UsernameFrom.ToString() + "}\",\"m\":\"{" + message.Message + "}\"";
if (!((ArrayList)(Session["chatHistory"])).Contains(message.UsernameFrom))
{
((ArrayList)(Session["chatHistory"]))[((ArrayList)(Session["chatHistory"])).IndexOf((object)(message.UsernameFrom))] = "";
}
((ArrayList)(Session["chatHistory"]))[getIndexOf(((ArrayList)(Session["chatHistory"])), message.UsernameFrom.ToString())] += "\"s\":\"0\",\"f\":\"{" + message.UsernameFrom.ToString() + "}\",\"m\":\"{" + message.Message + "}\"";
((ArrayList)(Session["tsChatBoxes"]))[getIndexOf(((ArrayList)(Session["tsChatBoxes"])), message.UsernameFrom.ToString())] = null; // Unset means clear the session value
((ArrayList)(Session["openChatBoxes"]))[getIndexOf(((ArrayList)(Session["openChatBoxes"])), message.UsernameFrom.ToString())] = message.Sent;
}
if (Session["openChatBoxes"] != null)
{
ArrayList openChatBoxesArray = (ArrayList)(Session["openChatBoxes"]);
for (int i = 0; i < openChatBoxesArray.Count; i++)
{
int chatbox = i;
if (openChatBoxesArray[i] != null)
{
DateTime time = (DateTime)(openChatBoxesArray[i]);
string timeval = "";
TimeSpan Now = (TimeSpan)(DateTime.Now - time);
timeval = time.ToString("g:iA M dS");
string message = "Sent at " + timeval;
if (Now.Minutes > 180)
{
items += "\"s\":\"2\",\"f\":\"{" + chatbox.ToString() + "}\",\"m\":\"{" + message + "}\"";
if (((ArrayList)(Session["chatHistory"]))[chatbox] != null)
{
((ArrayList)(Session["chatHistory"]))[chatbox] = "";
}
((ArrayList)(Session["chatHistory"]))[chatbox] += "\"s\":\"2\",\"f\":\"{" + chatbox.ToString() + "}\",\"m\":\"{" + message + "}\"";
((ArrayList)(Session["tsChatBoxes"]))[chatbox] = "1";
}
}
}
}
Chat.UpdateRecieved(User.Identity.Name);
if (items != string.Empty)
{
items = items.Substring(0, items.Length - 1);
}
HttpContext.Current.Response.Write("{ ");
Response.Write("\"items\":[" + items + "]");
HttpContext.Current.Response.Write(" }");
Response.End();
}
private string sanitize(string text)
{
//text = htmlspecialchars(text, ENT_QUOTES); // Convert the html special characters
text = text.Replace("\n\r", "\n");
text = text.Replace("\r\n", "\n");
text = text.Replace("\n", "<br>");
return text;
}
private int getIndexOf(ArrayList SessionArray, string Value)
{
try
{
return SessionArray.IndexOf((object) Value);
}
catch
{
return 0;
}
}
private string chatBoxSession(int chatbox)
{
string items = "";
if (((ArrayList)(Session["chatHistory"]))[chatbox] != null)
{ // Check the Session variable
items = ((ArrayList)(Session["chatHistory"]))[chatbox].ToString();
}
return items;
}
private void sendChat()
{
string from = User.Identity.Name; // Assign Seesion user name value to $from value
string to = Request["to"]; // Assign POST FORM 'To' value to $to value}
string message = Request["message"]; // Assign POST FORM 'message' value to $message value
((ArrayList)(Session["openChatBoxes"]))[getIndexOf(((ArrayList)(Session["openChatBoxes"])), Request["to"])] = DateTime.Now.ToString("Y-m-d H:i:s");
string messagesan = sanitize(message);
if (((ArrayList)(Session["chatHistory"])).Contains(Request["to"]))
{
((ArrayList)(Session["chatHistory"]))[getIndexOf(((ArrayList)(Session["chatHistory"])), Request["to"])] = "";
}
((ArrayList)(Session["chatHistory"]))[getIndexOf(((ArrayList)(Session["chatHistory"])), Request["to"])] += "\"s\":\"1\",\"f\":\"{" + to + "}\",\"m\":\"{" + messagesan + "}\"";
((ArrayList)(Session["tsChatBoxes"]))[getIndexOf(((ArrayList)(Session["tsChatBoxes"])), Request["to"])] = null;
/* Add Insert Query here*/
Chat chatObj = new Chat();
chatObj.UsernameTo = to;
chatObj.UsernameFrom = from;
chatObj.Message = message;
chatObj.Sent = DateTime.Now;
chatObj.Recieved = false;
Chat.Insert(chatObj);
Response.Write("1");
Response.End();
}
private void closeChat()
{
int chatbox = 1; //value of chatbox
((ArrayList)(Session["openChatBoxes"]))[chatbox] = null;
Response.Write("1");
}
private void startChatSession()
{
string items = "";
if (Session["openChatBoxes"] != null)
{ // Check the Session variable
ArrayList openChatBoxesArray = (ArrayList)(Session["openChatBoxes"]);
for (int i = 0; i < openChatBoxesArray.Count; i++)
{ // Loop the session array
items += chatBoxSession(i); // Append to Items variable
}
}
if (items != string.Empty)
{
items = items.Substring(0, items.Length - 1);
}
HttpContext.Current.Response.Write("{ ");
HttpContext.Current.Response.Write("\"username\": \"" + HttpContext.Current.User.Identity.Name + "\","); // Display the Username Which is set in the session
HttpContext.Current.Response.Write("\"items\": [");
HttpContext.Current.Response.Write(items);
HttpContext.Current.Response.Write("]");
HttpContext.Current.Response.Write("}");
Response.End();
}
}
}
Here is the php code I am trying to convert
<?
define ('DBPATH','localhost'); // Constant defination , These constants are used to connect the database
define ('DBUSER','root'); // Constant defination
define ('DBPASS','password'); // Constant defination
define ('DBNAME','chat'); // Constant defination
session_start(); // Start the session , In php for some sever settings You need to start the session through coding
global $dbh; // global scop
$dbh = mysql_connect(DBPATH,DBUSER,DBPASS); // DB connections
mysql_selectdb(DBNAME,$dbh); // DB connections
if ($_GET['action'] == "chatheartbeat") // $_GET is used to read the value from the query string Ex : &action="XXX"
{
chatHeartbeat(); // If it is true then call chatHeartbeat() function
}
if ($_GET['action'] == "sendchat") {
sendChat(); // call sendChat() function
}
if ($_GET['action'] == "closechat") {
closeChat(); // call closeChat() function
}
if ($_GET['action'] == "startchatsession") {
startChatSession(); // call startChatSession () function
}
if (!isset($_SESSION['chatHistory'])) { // Check the session variable chatHistory has a value OR not
$_SESSION['chatHistory'] = array(); // re assign the array
}
if (!isset($_SESSION['openChatBoxes'])) { // Check the session variable openChatBoxes has a value OR not
$_SESSION['openChatBoxes'] = array();
}
function chatHeartbeat() {
$sql = "select * from chat where (chat.to = '".mysql_real_escape_string($_SESSION['username'])."' AND recd = 0) order by id ASC";
$query = mysql_query($sql); // Excute the query
$items = '';
$chatBoxes = array(); // Init array
while ($chat = mysql_fetch_array($query)) { // To loop the results
/*
Check session array value $_SESSION['openChatBoxes'][$chat['from'] is empty
And
$_SESSION['chatHistory'][$chat['from']] has a value
*/
if (!isset($_SESSION['openChatBoxes'][$chat['from']]) && isset($_SESSION['chatHistory'][$chat['from']])) {
$items = $_SESSION['chatHistory'][$chat['from']]; // Assign $item o session value ;
}
$chat['message'] = sanitize($chat['message']); // Call the user defind funtion
// Just fetch the value from the above query and assign to Items ( append the values )
$items .= <<<EOD
{
"s": "0",
"f": "{$chat['from']}",
"m": "{$chat['message']}"
},
EOD;
/*
Check session array value $_SESSION['chatHistory'][$chat['from'] is empty
Then Assign $_SESSION['chatHistory'][$chat['from']] as EMPTY
*/
if (!isset($_SESSION['chatHistory'][$chat['from']])) {
$_SESSION['chatHistory'][$chat['from']] = '';
}
// Just fetch the value from the above query and Assign ( . Means append )
$_SESSION['chatHistory'][$chat['from']] .= <<<EOD
{
"s": "0",
"f": "{$chat['from']}",
"m": "{$chat['message']}"
},
EOD;
unset($_SESSION['tsChatBoxes'][$chat['from']]); // Unset means clear the session value
$_SESSION['openChatBoxes'][$chat['from']] = $chat['sent']; // Assign new value to session
}
if (!empty($_SESSION['openChatBoxes'])) { // Check the session array value $_SESSION['openChatBoxes'] empty OR not
foreach ($_SESSION['openChatBoxes'] as $chatbox => $time) { // Loop the array
if (!isset($_SESSION['tsChatBoxes'][$chatbox])) {
$now = time()-strtotime($time);
$time = date('g:iA M dS', strtotime($time)); // Convert time stamp to date format
$message = "Sent at $time";
if ($now > 180) {
/*
append to Item variable
*/
$items .= <<<EOD {
"s": "2",
"f": "$chatbox",
"m": "{$message}"
},
EOD;
if (!isset($_SESSION['chatHistory'][$chatbox])) { // Again Check the session array value $_SESSION['chatHistory'][$chatbox] empty OR not
$_SESSION['chatHistory'][$chatbox] = ''; // Set $_SESSION['chatHistory'][$chatbox] array value as Empty
}
/*
append to $_SESSION['chatHistory'][$chatbox] variable
*/
$_SESSION['chatHistory'][$chatbox] .= <<<EOD
{
"s": "2",
"f": "$chatbox",
"m": "{$message}"
},
EOD;
$_SESSION['tsChatBoxes'][$chatbox] = 1; /// Assign to session varriable
}
}
}
}
$sql = "update chat set recd = 1 where chat.to = '".mysql_real_escape_string($_SESSION['username'])."' and recd = 0";
$query = mysql_query($sql);
// Run the update Query , Just Db updation ,
if ($items != '') {
$items = substr($items, 0, -1);
}
header('Content-type: application/json'); // Header type assign
?>
{
"items": [
<?php echo $items;?> // Display the items values
]
}
<?php
exit(0);
}
function chatBoxSession($chatbox) {
$items = '';
// This function return Just $_SESSION['chatHistory'][$chatbox] value if it is alredy set
if (isset($_SESSION['chatHistory'][$chatbox])) { // Check the Session variable
$items = $_SESSION['chatHistory'][$chatbox];
}
return $items;
}
function startChatSession() {
$items = '';
if (!empty($_SESSION['openChatBoxes'])) { // Check the Session variable
foreach ($_SESSION['openChatBoxes'] as $chatbox => $void) { // Loop the session array
$items .= chatBoxSession($chatbox); // Append to Items variable
}
}
if ($items != '') {
$items = substr($items, 0, -1);
}
header('Content-type: application/json');
?>
{
"username": "<?php echo $_SESSION['username'];?>", // Display the Username Which is set in the session
"items": [
<?php echo $items;?> // Display the Items valus
]
}
<?php
exit(0);
}
function sendChat() {
$from = $_SESSION['username']; // Assign Seesion user name value to $from value
$to = $_POST['to']; // Assign POST FORM 'To' value to $to value
$message = $_POST['message']; // Assign POST FORM 'message' value to $message value
$_SESSION['openChatBoxes'][$_POST['to']] = date('Y-m-d H:i:s', time());
$messagesan = sanitize($message);
if (!isset($_SESSION['chatHistory'][$_POST['to']])) {
$_SESSION['chatHistory'][$_POST['to']] = '';
}
// Assign to session variable
$_SESSION['chatHistory'][$_POST['to']] .= <<<EOD
{
"s": "1",
"f": "{$to}",
"m": "{$messagesan}"
},
EOD;
unset($_SESSION['tsChatBoxes'][$_POST['to']]); // Clear the session value
// Insert query
$sql = "insert into chat (chat.from,chat.to,message,sent) values ('".mysql_real_escape_string($from)."', '".mysql_real_escape_string($to)."','".mysql_real_escape_string($message)."',NOW())";
$query = mysql_query($sql); // Run the insert query
echo "1";
exit(0);
}
function closeChat() {
unset($_SESSION['openChatBoxes'][$_POST['chatbox']]); // Clear the session value
echo "1";
exit(0);
}
function sanitize($text) {
$text = htmlspecialchars($text, ENT_QUOTES); // Convert the html special characters
$text = str_replace("\n\r","\n",$text); // String Replace
$text = str_replace("\r\n","\n",$text); // String Replace
$text = str_replace("\n","<br>",$text); // String Replace
return $text;
}
Man kan inte initiera en arraylist som jag gjort. Men min förståelse för php-koden begränsar mig.