Tôi đã viết mã này cho máy chủ của tôi:Làm thế nào để sử dụng TCP client/listener trong đa luồng C#?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Threading;
using System.Net.Sockets;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
private static bool terminate;
public static bool Terminate
{
get { return terminate; }
}
private static int clientNumber = 0;
private static TcpListener tcpListener;
static void Main(string[] args)
{
StartServer();
Console.Read();
}
private static void StartServer()
{
try
{
Console.WriteLine("Server starting...");
tcpListener = new TcpListener(IPAddress.Parse("127.0.0.1"), 8000);
terminate = false;
tcpListener.Start();
tcpListener.BeginAcceptTcpClient(ConnectionHandler, null);
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
Console.WriteLine("Server stopping...");
terminate = true;
if (tcpListener != null)
{
tcpListener.Stop();
}
}
}
private static void ConnectionHandler(IAsyncResult result)
{
TcpClient client = null;
try
{
client = tcpListener.EndAcceptTcpClient(result);
}
catch (Exception)
{
return;
}
tcpListener.BeginAcceptTcpClient(ConnectionHandler, null);
if (client!=null)
{
Interlocked.Increment(ref clientNumber);
string clientName = clientNumber.ToString();
new ClientHandler(client, clientName);
}
}
}
}
class ClientHandler
{
private TcpClient client;
private string ID;
internal ClientHandler(TcpClient client, string ID)
{
this.client = client;
this.ID = ID;
Thread thread = new Thread(ProcessConnection);
thread.IsBackground = true;
thread.Start();
}
private void ProcessConnection()
{
using (client)
{
using (BinaryReader reader=new BinaryReader(client.GetStream()))
{
if (reader.ReadString()==Responses.RequestConnect)
{
using (BinaryWriter writer=new BinaryWriter(client.GetStream()))
{
writer.Write(Responses.AcknowledgeOK);
Console.WriteLine("Client: "+ID);
string message = string.Empty;
while (message!=Responses.Disconnect)
{
try
{
message = reader.ReadString();
}
catch
{
continue;
}
if (message==Responses.RequestData)
{
writer.Write("Data Command Received");
}
else if (message==Responses.Disconnect)
{
Console.WriteLine("Client disconnected: "+ID);
}
else
{
Console.WriteLine("Unknown Command");
}
}
}
}
else
{
Console.WriteLine("Unable to connect client: "+ID);
}
}
}
}
}
class Responses
{
public const string AcknowledgeOK = "OK";
public const string AcknowledgeCancel = "Cancel";
public const string Disconnect = "Bye";
public const string RequestConnect = "Hello";
public const string RequestData = "Data";
}
mã này lắng nghe yêu cầu của khách hàng một cách đa luồng. Tôi không thể hiểu làm thế nào tôi có thể phân biệt giữa các máy khách khác nhau được kết nối với máy chủ này của tôi và máy khách nào đang ngắt kết nối và yêu cầu các lệnh khác nhau.
mã khách hàng của tôi là:
private static void clietnRequest(string message,ref string response)
{
using (TcpClient client = new TcpClient())
{
if (!client.Connected)
{
client.Connect(IPAddress.Parse("127.0.0.1"), 8000);
using (NetworkStream networkStream = client.GetStream())
{
using (BinaryWriter writer = new BinaryWriter(networkStream))
{
writer.Write(Responses.RequestConnect);
using (BinaryReader reader = new BinaryReader(networkStream))
{
if (reader.ReadString() == Responses.AcknowledgeOK)
{
response = Responses.AcknowledgeOK;
}
}
}
}
}
}
}
đoạn mã này kết nối khách hàng đến máy chủ, nhưng tôi không thể gửi tin nhắn nữa. Tôi muốn trong ứng dụng của tôi nếu khách hàng được kết nối sau đó ông có thể gửi lệnh đến máy chủ. thay vì làm điều này mỗi khi hành động như một khách hàng mới đến máy chủ. Tôi đang thiếu một số điều ở đây, Vui lòng hướng dẫn tôi đi đúng hướng. Tôi hoàn toàn mới để lập trình mạng C#. Vui lòng giúp tôi cải thiện mã của mình. Trình nghe Tcp và Trình khách Tcp hợp lệ cho kịch bản này hoặc tôi có cần sử dụng Ổ cắm không?
Bạn không nên chỉ nuốt các ngoại lệ của mình với 'trả lại' mà bạn sẽ không biết nếu có điều gì đó sai, ít nhất hãy đưa vào một số hình thức ghi nhật ký. –
của nó chỉ cho mục đích demo, – user1941098
Nó vẫn là một thói quen xấu đó là tốt để phá vỡ sớm. Trên một lưu ý riêng biệt tại sao bạn sử dụng 'ref' thay vì chỉ chuyển trả lời dưới dạng giá trị trả về? –