私はネットワーキングの初心者ですが、何かを始めなければならないので、Visual Studio 2010 で C# 言語 (winform) を使用してチャット アプリを作成することにしました。
私はそれについて多くのことをグーグルで検索し、必要なものをほぼ正確に見つけました. 次のコード サンプルを見つけました (C# - コンソール):
http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.aspx
http://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener(v=VS.71).aspx
TCP プロトコルを使用してそのアプリケーションを作成したい (もっと簡単な方法があるかどうかはわかりませんが、C# でそのチャットを作成しようとしたときに TCP の基本を理解しました。
上記のリンクのコード サンプルを実行すると、機能しました。そこで、これらのサンプルをチャット アプリケーションに適応させようとしました。
私のチャット アプリケーションは、実際にはサーバーとクライアントの 2 つのアプリで構成されています。どちらも同じ GUI (2 つのテキスト ボックス、1 つのボタン、およびクライアントがサーバーに接続されているかどうかを表示するための 2 つのラベル) を備えています。
サーバー/クライアント アプリの textBox1 は、クライアント/サーバー アプリから送信されたメッセージを表示するものです。サーバー/クライアント アプリの textBox2 で、ユーザーはメッセージを入力し、ボタンを押してメッセージをクライアント/サーバー アプリに送信します。
これまでに試したことをお見せしましょう。これはサーバー アプリケーション コードです。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
namespace Server_TCP_WINFORMS
{
public partial class Form1 : Form
{
//Int32 port = 13000;
IPAddress localAddr = IPAddress.Parse("127.0.0.1");
TcpListener server = new TcpListener(IPAddress.Parse("127.0.0.1"), 13000);
public Form1()
{
InitializeComponent();
server.Start();
}
byte[] bytes = new byte[256];
String data = null;
TcpClient client = new TcpClient();
bool sw = true;
int data_at_byte_level = 0;
private void Form1_Load(object sender, EventArgs e)
{
try
{
label2.Text = "Waiting for an incoming connection...";
if (!server.Pending())
{
label2.Text = "For moment, there are no connections requests!";
}
else
{
client = server.AcceptTcpClient();
label2.Text = "Connected!";
sw = false;
}
}
catch (SocketException xyz)
{
MessageBox.Show("Exception occured!");
}
if (sw == false)
{
NetworkStream stream = client.GetStream();
while ((data_at_byte_level = stream.Read(bytes, 0, bytes.Length)) != 0)
{
data = System.Text.Encoding.ASCII.GetString(bytes);
textBox1.Text += data;
data = null;
bytes = null;
}
}
}
private void button1_Click(object sender, EventArgs e)
{
String dataT;
if (textBox2.Text!=null && sw == false)
{
NetworkStream stream = client.GetStream();
dataT = textBox2.Text;
byte[] msg = System.Text.Encoding.ASCII.GetBytes(dataT);
stream.Write(msg, 0, msg.Length);
}
}
}
}
そして、これはクライアント アプリケーション コードです。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
namespace Client_TCP_WINFORMS
{
public partial class Form1 : Form
{
TcpClient client = new TcpClient("127.0.0.1", 13000);
public Form1()
{
InitializeComponent();
label2.Text = "Conected to the server!";
}
private void button1_Click(object sender, EventArgs e)
{
NetworkStream stream = client.GetStream();
if (textBox2.Text != null)
{
String data_str = textBox2.Text;
Byte[] data_byte = System.Text.Encoding.ASCII.GetBytes(data_str);
stream.Write(data_byte, 0, data_byte.Length);
}
}
private void Form1_Load(object sender, EventArgs e)
{
Byte[] data_byte = new Byte[290];
int bytes;
string Data;
NetworkStream stream = client.GetStream();
bytes = stream.Read(data_byte, 0, data_byte.Length);
Data = System.Text.Encoding.ASCII.GetString(data_byte, 0, bytes);
textBox1.Text += Data;
}
}
}
これら 2 つのアプリが次のように動作するようにします。サーバー アプリケーションを起動してから、クライアント アプリケーションを起動します。両方が開いているときは、すでに接続されている必要があります(その方が簡単だと思います)。
次に、サーバーが(たとえば)クライアントにメッセージを送信するときに、クライアントがメッセージを受信して表示する必要があることを意味します。サーバーが別のメッセージを送信した場合、クライアントもそれを受信して表示する必要があります。ユーザー (クライアントまたはサーバーのユーザー) が送信ボタンを押すと、アプリケーションは textBox2 から他のアプリケーションにメッセージを送信する必要があります。Windowsフォームでこれらのことを行うにはどうすればよいですか?
コンソールのコード サンプルを見ると、サーバーがクライアントからメッセージを読み取るメイン ループがあることがわかります。しかし、サーバーもメッセージを送信したい場合はどうなるでしょうか? 送信ボタンが押された場合、button_pressed のイベントが発生してメッセージを送信しますが、メッセージの送信が完了すると、メイン ループに戻りますか?
私の英語を許してください。私はネイティブスピーカーではありません。
心より感謝申し上げます。