Я использую C# Sockets. Я занимаюсь Auction Server и клиентский проект. Консольный режим.
На самом деле у меня есть 1 сервер, работающий с асинхроносом для нескольких клиентов. Мне нужны какие -то часы, чтобы запустить события. < /Strong> < /p>
На клиенте я могу отправлять команды, такие как: < /p>
[*] «Зарегистрировать пароль пользователя» < /li>
«Законное имя пользователя» < /li>
»xxx.xx. Продолжительность min_price " - Creat 1 Auction < /li>
etc..
< /ul>
Теперь у меня проблемы с логикой аукционной системы. 1 поток для каждого аукциона? Продано) < /li>
< /ul>
Я думал: < /p>
Сервер читал команду "creat" < /li>
Сервер Create the New Thread для этого аукциона < /li>
У потока есть таймер, который можно увидеть (Thread.timer == Time_to_TO_END)? (thread.timer = time_to_end) Отправить все сообщения! < /li>
< /ol>
Это псевдокод возможна?using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using Server;
using System.IO;
namespace Server
{
class Program
{
private static TcpClient _cashierClient = new TcpClient();
private static Dictionary loggedUsers = new Dictionary(); //
private static Dictionary loggedUsers2 = new Dictionary(); //
private static List registeredUsers = new List();
private static byte[] _buffer = new byte[1024];
private static List _clientSockets = new List();
private static Socket _serverSocket = new Socket
(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
static void Main(string[] args)
{
Console.Title = "Server";
ConnectToCashier();
SetupServer();
Console.ReadLine();
}
private static void ConnectToCashier()
{
Console.WriteLine("Connecting to Cashier...");
_cashierClient.Connect(IPAddress.Loopback, 101);
Stream stream = _cashierClient.GetStream();
byte[] receivedBuf = new byte[1024];
int rec = stream.Read(receivedBuf, 0, 1024);
byte[] data = new byte[rec];
Array.Copy(receivedBuf, data, rec);
Console.WriteLine(Encoding.ASCII.GetString(data));
}
private static void SetupServer()
{
Console.WriteLine("Setting up server...");
_serverSocket.Bind(new IPEndPoint(IPAddress.Any, 100)); //Bind any interfaces on port 100
_serverSocket.Listen(5); // Max 5 em Lista de espera
_serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
}
private static void AcceptCallback(IAsyncResult AR)
{
Socket socket = _serverSocket.EndAccept(AR);
_clientSockets.Add(socket);
Console.WriteLine("Client " + socket.RemoteEndPoint.ToString() + " connected");
socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), socket);
_serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
}
private static void ReceiveCallBack(IAsyncResult AR)
{
Socket socket = (Socket)AR.AsyncState;
int received = socket.EndReceive(AR);
byte[] dataBuf = new byte[received];
Array.Copy(_buffer, dataBuf, received);
string text = Encoding.ASCII.GetString(dataBuf);
Console.WriteLine(socket.RemoteEndPoint.ToString() + " sent: " + text);
string response = string.Empty;
string command = text.ToLower().Split()[0]; // "command word1 word2 word... wordX wordX+1"
int words = text.Split().Count(); // count the number of words + command
if (command == "get_time" && words == 1) // SERVER TIME
{
response = DateTime.Now.ToLongTimeString();
}
else if (command == "register" && words == 3) // REGIST USER
{
string[] split = text.Split();
if (userExists(split[1]))
{
response = "'" + split[1] + "' already in use. Choose another username";
}
else
{
newUser(split[1], split[2]); //split[1] = name, split[2] = password
response = "'" + split[1] + "' Successfully Registered";
}
}
else if (command == "login" && words == 3) // LOG IN
{
string[] split = text.Split();
if (!userExists(split[1]))// check for username
{
response = "Invalid Username";
}
else if (!userExists(split[1], split[2])) // check for username and corresponding password
{
response = "Wrong Password";
}
else if (loggedUsers.ContainsKey(split[1]) ||
loggedUsers2.ContainsKey(socket.RemoteEndPoint.ToString())) //checks if user is on hashtree by the [KEY = username] or [KEY = IPAdress]
{
int id;
if (loggedUsers2.TryGetValue(socket.RemoteEndPoint.ToString(), out id)) // O cliente já está logado com alguma conta
{
User user = getUser(id);
response = "You're allready Logged In As '" + user.username + "'";
}
else
{ // O cliente não está logged in e está a tentar entrar numa contra logada noutro computador
response = "Another Computer is currently logged onto this account";
}
}
else
{
Console.WriteLine(socket.RemoteEndPoint.ToString() + " loged in");
response = "Successfully Logging In";
//User user = new User(split[1], split[2]);
User user = getUser(split[1], split[2]); //split[1] = name, split[2] = password
loggedUsers.Add(user.username, user);
loggedUsers2.Add(socket.RemoteEndPoint.ToString(), user.ID);
}
}
else if (command == "balance" && words == 1) // SHOW AVAILABLE CASH
{
if (loggedUsers2.ContainsKey(socket.RemoteEndPoint.ToString())) // Verifica se está logado
{
int userID = loggedUsers2[socket.RemoteEndPoint.ToString()];
byte[] dataToSend = Encoding.ASCII.GetBytes("balance " + userID);
Stream stream = _cashierClient.GetStream();
stream.Write(dataToSend, 0, dataToSend.Length);
byte[] dataBuffer = new byte[1024];
int rec = stream.Read(dataBuffer, 0, 1024);
byte[] dataReceived = new byte[rec];
Array.Copy(dataBuffer, dataReceived, rec);
response = Encoding.ASCII.GetString(dataReceived);
}
else // Se não estiver logado...
{
response = "You are not logged in";
}
}
else if (command == "deposit" && words == 2)
{
if (loggedUsers2.ContainsKey(socket.RemoteEndPoint.ToString())) // Verifica se está logado
{
string[] split = text.Split();
split[1] = split[1].Replace(".", ","); // Se o user escrever ####.## altera para ####,##
decimal value;
if (Decimal.TryParse(split[1], out value)) // It's a decimal
{
if (value < 10) // Abaixo da quantia minima
{
response = "Minimum Deposit 10 EUROS";
}
else // Quantia aceitavel
{
int userID = loggedUsers2[socket.RemoteEndPoint.ToString()];
byte[] dataToSend = Encoding.ASCII.GetBytes("deposit " + userID + " " + value);
Stream stream = _cashierClient.GetStream();
stream.Write(dataToSend, 0, dataToSend.Length);
byte[] dataBuffer = new byte[1024];
int rec = stream.Read(dataBuffer, 0, 1024);
byte[] dataReceived = new byte[rec];
Array.Copy(dataBuffer, dataReceived, rec);
response = Encoding.ASCII.GetString(dataReceived);
}
}
else // No it's not.
{
response = "Invalid Cash Format. Use 'deposit ####,##'";
}
}
else // Se não estiver logado...
{
response = "You are not logged in";
}
}
else // Comando inválido
{
response = "Invalid Request";
}
byte[] data = Encoding.ASCII.GetBytes(response);
socket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendCallBack), socket);
socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), socket);
}
private static User getUser(string username, string password)
{
foreach (User user in registeredUsers)
{
if (user.username == username && user.password == password)
return user;
}
return null;
}
private static User getUser(int id)
{
foreach (User user in registeredUsers)
{
if (user.ID == id)
return user;
}
return null;
}
private static bool userExists(string username, string password)
{
foreach (User user in registeredUsers)
{
if (user.username == username && user.password == password)
return true;
}
return false;
}
private static bool userExists(string username)
{
foreach (User user in registeredUsers)
{
if (user.username == username)
return true;
}
return false;
}
private static void newUser(string username, string password)
{
User user = new User(username, password);
registeredUsers.Add(user); // adiciona à lista de user's registados
int userID = user.ID;
byte[] dataToSend = Encoding.ASCII.GetBytes("register " + userID);
Stream stream = _cashierClient.GetStream();
stream.Write(dataToSend, 0, dataToSend.Length);
}
private static void SendCallBack(IAsyncResult AR)
{
Socket socket = (Socket)AR.AsyncState;
socket.EndSend(AR);
}
}
}
< /code>
Клиентский код: < /p>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
namespace Client
{
class Program
{
private static Socket _clientSocket = new Socket
(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
static void Main(string[] args)
{
Console.Title = "Client";
LoopConnect();
SendLoop();
Console.ReadLine();
}
private static void SendLoop()
{
while (true)
{
Console.WriteLine("Enter a request: ");
string req = Console.ReadLine();
byte[] buffer = Encoding.ASCII.GetBytes(req);
_clientSocket.Send(buffer);
byte[] receivedBuf = new byte[1024];
int rec = _clientSocket.Receive(receivedBuf);
byte[] data = new byte[rec];
Array.Copy(receivedBuf, data, rec);
Console.WriteLine("Received: " + Encoding.ASCII.GetString(data));
}
}
private static void LoopConnect()
{
int attempts = 0;
while (!_clientSocket.Connected)
{
try
{
attempts++;
_clientSocket.Connect(IPAddress.Loopback, 100);
}
catch (SocketException) {
Console.Clear();
Console.WriteLine("Connection attempts: " + attempts.ToString());
}
}
Console.Clear();
Console.WriteLine("Connected");
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/168 ... nsole-mode
Аукционная система клиента. Консольный режим ⇐ C#
Место общения программистов C#
-
Anonymous
1756654475
Anonymous
Я использую C# Sockets. Я занимаюсь [b] Auction Server [/b] и клиентский проект. Консольный режим.
На самом деле у меня есть 1 сервер, работающий с асинхроносом для нескольких клиентов. Мне нужны какие -то часы, чтобы запустить события. < /Strong> < /p>
На клиенте я могу отправлять команды, такие как: < /p>
[*] «Зарегистрировать пароль пользователя» < /li>
«Законное имя пользователя» < /li>
»xxx.xx. Продолжительность min_price " - Creat 1 Auction < /li>
etc..
< /ul>
Теперь у меня проблемы с логикой аукционной системы. 1 поток для каждого аукциона? Продано) < /li>
< /ul>
Я думал: < /p>
Сервер читал команду "creat" < /li>
Сервер Create the New Thread для этого аукциона < /li>
У потока есть таймер, который можно увидеть (Thread.timer == Time_to_TO_END)? (thread.timer = time_to_end) Отправить все сообщения! < /li>
< /ol>
Это псевдокод возможна?using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using Server;
using System.IO;
namespace Server
{
class Program
{
private static TcpClient _cashierClient = new TcpClient();
private static Dictionary loggedUsers = new Dictionary(); //
private static Dictionary loggedUsers2 = new Dictionary(); //
private static List registeredUsers = new List();
private static byte[] _buffer = new byte[1024];
private static List _clientSockets = new List();
private static Socket _serverSocket = new Socket
(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
static void Main(string[] args)
{
Console.Title = "Server";
ConnectToCashier();
SetupServer();
Console.ReadLine();
}
private static void ConnectToCashier()
{
Console.WriteLine("Connecting to Cashier...");
_cashierClient.Connect(IPAddress.Loopback, 101);
Stream stream = _cashierClient.GetStream();
byte[] receivedBuf = new byte[1024];
int rec = stream.Read(receivedBuf, 0, 1024);
byte[] data = new byte[rec];
Array.Copy(receivedBuf, data, rec);
Console.WriteLine(Encoding.ASCII.GetString(data));
}
private static void SetupServer()
{
Console.WriteLine("Setting up server...");
_serverSocket.Bind(new IPEndPoint(IPAddress.Any, 100)); //Bind any interfaces on port 100
_serverSocket.Listen(5); // Max 5 em Lista de espera
_serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
}
private static void AcceptCallback(IAsyncResult AR)
{
Socket socket = _serverSocket.EndAccept(AR);
_clientSockets.Add(socket);
Console.WriteLine("Client " + socket.RemoteEndPoint.ToString() + " connected");
socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), socket);
_serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
}
private static void ReceiveCallBack(IAsyncResult AR)
{
Socket socket = (Socket)AR.AsyncState;
int received = socket.EndReceive(AR);
byte[] dataBuf = new byte[received];
Array.Copy(_buffer, dataBuf, received);
string text = Encoding.ASCII.GetString(dataBuf);
Console.WriteLine(socket.RemoteEndPoint.ToString() + " sent: " + text);
string response = string.Empty;
string command = text.ToLower().Split()[0]; // "command word1 word2 word... wordX wordX+1"
int words = text.Split().Count(); // count the number of words + command
if (command == "get_time" && words == 1) // SERVER TIME
{
response = DateTime.Now.ToLongTimeString();
}
else if (command == "register" && words == 3) // REGIST USER
{
string[] split = text.Split();
if (userExists(split[1]))
{
response = "'" + split[1] + "' already in use. Choose another username";
}
else
{
newUser(split[1], split[2]); //split[1] = name, split[2] = password
response = "'" + split[1] + "' Successfully Registered";
}
}
else if (command == "login" && words == 3) // LOG IN
{
string[] split = text.Split();
if (!userExists(split[1]))// check for username
{
response = "Invalid Username";
}
else if (!userExists(split[1], split[2])) // check for username and corresponding password
{
response = "Wrong Password";
}
else if (loggedUsers.ContainsKey(split[1]) ||
loggedUsers2.ContainsKey(socket.RemoteEndPoint.ToString())) //checks if user is on hashtree by the [KEY = username] or [KEY = IPAdress]
{
int id;
if (loggedUsers2.TryGetValue(socket.RemoteEndPoint.ToString(), out id)) // O cliente já está logado com alguma conta
{
User user = getUser(id);
response = "You're allready Logged In As '" + user.username + "'";
}
else
{ // O cliente não está logged in e está a tentar entrar numa contra logada noutro computador
response = "Another Computer is currently logged onto this account";
}
}
else
{
Console.WriteLine(socket.RemoteEndPoint.ToString() + " loged in");
response = "Successfully Logging In";
//User user = new User(split[1], split[2]);
User user = getUser(split[1], split[2]); //split[1] = name, split[2] = password
loggedUsers.Add(user.username, user);
loggedUsers2.Add(socket.RemoteEndPoint.ToString(), user.ID);
}
}
else if (command == "balance" && words == 1) // SHOW AVAILABLE CASH
{
if (loggedUsers2.ContainsKey(socket.RemoteEndPoint.ToString())) // Verifica se está logado
{
int userID = loggedUsers2[socket.RemoteEndPoint.ToString()];
byte[] dataToSend = Encoding.ASCII.GetBytes("balance " + userID);
Stream stream = _cashierClient.GetStream();
stream.Write(dataToSend, 0, dataToSend.Length);
byte[] dataBuffer = new byte[1024];
int rec = stream.Read(dataBuffer, 0, 1024);
byte[] dataReceived = new byte[rec];
Array.Copy(dataBuffer, dataReceived, rec);
response = Encoding.ASCII.GetString(dataReceived);
}
else // Se não estiver logado...
{
response = "You are not logged in";
}
}
else if (command == "deposit" && words == 2)
{
if (loggedUsers2.ContainsKey(socket.RemoteEndPoint.ToString())) // Verifica se está logado
{
string[] split = text.Split();
split[1] = split[1].Replace(".", ","); // Se o user escrever ####.## altera para ####,##
decimal value;
if (Decimal.TryParse(split[1], out value)) // It's a decimal
{
if (value < 10) // Abaixo da quantia minima
{
response = "Minimum Deposit 10 EUROS";
}
else // Quantia aceitavel
{
int userID = loggedUsers2[socket.RemoteEndPoint.ToString()];
byte[] dataToSend = Encoding.ASCII.GetBytes("deposit " + userID + " " + value);
Stream stream = _cashierClient.GetStream();
stream.Write(dataToSend, 0, dataToSend.Length);
byte[] dataBuffer = new byte[1024];
int rec = stream.Read(dataBuffer, 0, 1024);
byte[] dataReceived = new byte[rec];
Array.Copy(dataBuffer, dataReceived, rec);
response = Encoding.ASCII.GetString(dataReceived);
}
}
else // No it's not.
{
response = "Invalid Cash Format. Use 'deposit ####,##'";
}
}
else // Se não estiver logado...
{
response = "You are not logged in";
}
}
else // Comando inválido
{
response = "Invalid Request";
}
byte[] data = Encoding.ASCII.GetBytes(response);
socket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendCallBack), socket);
socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), socket);
}
private static User getUser(string username, string password)
{
foreach (User user in registeredUsers)
{
if (user.username == username && user.password == password)
return user;
}
return null;
}
private static User getUser(int id)
{
foreach (User user in registeredUsers)
{
if (user.ID == id)
return user;
}
return null;
}
private static bool userExists(string username, string password)
{
foreach (User user in registeredUsers)
{
if (user.username == username && user.password == password)
return true;
}
return false;
}
private static bool userExists(string username)
{
foreach (User user in registeredUsers)
{
if (user.username == username)
return true;
}
return false;
}
private static void newUser(string username, string password)
{
User user = new User(username, password);
registeredUsers.Add(user); // adiciona à lista de user's registados
int userID = user.ID;
byte[] dataToSend = Encoding.ASCII.GetBytes("register " + userID);
Stream stream = _cashierClient.GetStream();
stream.Write(dataToSend, 0, dataToSend.Length);
}
private static void SendCallBack(IAsyncResult AR)
{
Socket socket = (Socket)AR.AsyncState;
socket.EndSend(AR);
}
}
}
< /code>
Клиентский код: < /p>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
namespace Client
{
class Program
{
private static Socket _clientSocket = new Socket
(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
static void Main(string[] args)
{
Console.Title = "Client";
LoopConnect();
SendLoop();
Console.ReadLine();
}
private static void SendLoop()
{
while (true)
{
Console.WriteLine("Enter a request: ");
string req = Console.ReadLine();
byte[] buffer = Encoding.ASCII.GetBytes(req);
_clientSocket.Send(buffer);
byte[] receivedBuf = new byte[1024];
int rec = _clientSocket.Receive(receivedBuf);
byte[] data = new byte[rec];
Array.Copy(receivedBuf, data, rec);
Console.WriteLine("Received: " + Encoding.ASCII.GetString(data));
}
}
private static void LoopConnect()
{
int attempts = 0;
while (!_clientSocket.Connected)
{
try
{
attempts++;
_clientSocket.Connect(IPAddress.Loopback, 100);
}
catch (SocketException) {
Console.Clear();
Console.WriteLine("Connection attempts: " + attempts.ToString());
}
}
Console.Clear();
Console.WriteLine("Connected");
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/16841914/client-server-auction-system-console-mode[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия