2
クライアントからの接続を待つ単純なサーバーをC#で構築しようとしました。新しいクライアントが接続すると、新しいスレッドが作成され、そこからクライアントから読み込まれたメッセージがクライアントに送信され、そのサーバはクライアントからメッセージを受信しました。私の問題は、新しいクライアントがサーバーに接続したときにイベントを発生させようとしていることですが、私が購読しているものは得られません。私は問題があるC#新しいクライアントが接続されたときにシンプルなサーバーを構築する
namespace ChatServer
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Threading;
class Program
{
public static event EventHandler<NewClientConnectedEventArgs>NewClientConnected;
public static void Main(string[] args)
{
TcpListener listener = new TcpListener(IPAddress.Any, 80);
listener.Start();
while (true)
{
TcpClient client = listener.AcceptTcpClient();
//listener += NewClientConnected(null, new NewClientConnectedEventArgs(client));
//FireNewClientHasConnected(null, eventargs);
}
}
public static void MakeNewConnection(TcpClient client)
{
Thread thread = new Thread(new ParameterizedThreadStart(NewClient));
thread.Start(client);
}
public static void NewClient(object data)
{
TcpClient client = (TcpClient)data;
string adress = client.Client.AddressFamily.ToString();
Console.WriteLine("{0} has connected!", adress);
NetworkStream ns = client.GetStream();
while (true)
{
byte[] receivedbuffer = new byte[8192];
int receivedbytes;
receivedbytes = ns.Read(receivedbuffer, 0, receivedbuffer.Length);
string message = Encoding.UTF8.GetString(receivedbuffer, 0, receivedbytes);
string newmessage = "The server received: " + message;
byte[] sendBuffer = Encoding.UTF8.GetBytes(newmessage);
ns.Write(sendBuffer, 0, sendBuffer.Length);
}
}
protected static void FireNewClientHasConnected(object sender, NewClientConnectedEventArgs args)
{
if (NewClientConnected != null)
{
MakeNewConnection(args.Client);
}
}
}
部分は私がコメントアウト一部です:
は、ここに私のコードです。前もって感謝します!
イベントに登録する必要はありませんか?また、何も購読されていないので、イベントがnullかどうかを確認する必要はありませんか?私はちょっと混乱しています。 –
プログラム以外のクラスにクライアントを公開したくない場合は、イベントを離れたままにして、直接MakeNewConnection()を呼び出してください。 – Quergo
いいえ、ここではイベントは役に立たないと思います。どうも :) –