サーバ1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
using System; using System.Windows.Forms; namespace tcp_listen_client { public partial class Form1 : Form { public Form1() { InitializeComponent(); Control.CheckForIllegalCrossThreadCalls = false; //スレッドからテキストボックスにアクセスすることを許可 //スレッドセーフとはアプリをマルチスレッドで走らせても問題ないこと。 //Formはスレッドセーフではない。 //通常、Control はメンバの参照時にUIスレッド(Application.Run したスレッド)で操作することを強制。 //CheckForIllegalCrossThreadCallsをfalseにすると、これを回避できる。 } private System.Net.Sockets.TcpListener server;//リスナー接続待ちや受信等を行うオブジェクト private System.Threading.Thread ListeningCallbackThred;//接続待ちスレッド private volatile bool SLTAlive;//接続待ちスレッド終了指示フラグ //volatile //複数のスレッドによって変更される可能性がある場合指定。 //シングルスレット前提の最適化をしない private void Form1_Load(object sender, EventArgs e) { this.Text = "サーバー"; button1.Text = "サーバー開始"; button2.Text = "サーバー終了"; label1.Text = ""; SLTAlive = false; //スレッド終了指示フラグを終了に初期化 } private void Form1_FormClosed(object sender, FormClosedEventArgs e) { //サーバーを終了するのに、接続待ちスレッドが終了していない場合 if (SLTAlive) { SLTAlive = false; server.Stop(); ListeningCallbackThred = null; //スレッドをnull設定 } } private void button1_Click(object sender, EventArgs e) { //接続待ちスレッドが生成されていない場合 if (!SLTAlive) { ListeningCallbackThred = new System.Threading.Thread(ListeningCallback); //ListeningCallbackはメソッド ListeningCallbackThred.Start(); SLTAlive = true; //未終了に設定 } } private void button2_Click(object sender, EventArgs e) { if (SLTAlive) { if (server != null) { server.Stop(); } } SLTAlive = false;//終了に設定 label1.Text = "サーバー終了"; } private void ListeningCallback() { //リスナーを生成 server = new System.Net.Sockets.TcpListener(System.Net.IPAddress.Parse("192.168.102.9"),9000); server.Start(); label1.Text = "サーバー開始"; try { //受信は無限ループ。終了指示があればループ終了 while (SLTAlive) { //受信接続キューに接続待ちがあるかどうか if(server.Pending() == true) { //クライアントからの接続を受け付ける。 //通信ストリームの取得 System.Net.Sockets.TcpClient ClientSocket = server.AcceptTcpClient(); System.Net.Sockets.NetworkStream stream = ClientSocket.GetStream(); byte[] ReceiveData = new byte[2000]; int DataLength = stream.Read(ReceiveData,0,ReceiveData.Length); // textBox1.Text = ReceiveData.ToString(); こうすると // System.Byte[]と表示される。つまりバイト型の配列になっているということか。 //string str = System.Text.Encoding.ASCII.GetString(ReceiveData, 0, DataLength); string str = System.Text.Encoding.GetEncoding("shift_jis").GetString(ReceiveData,0,DataLength); //GETのパラメータに日本語を入れてリクエストした場合、 //ASCIIだと??となる。 //UTF-8だと文字化けする。 //shift_jisでちゃんと表示された。 //str = Uri.UnescapeDataString(str); // String <- byte[] GetString // String -> byte[] GetByte textBox1.Text = str; //返信 string html = "<a href=\"http://yahoo.co.jp\">hello</a>"; byte[] SendBuffer = System.Text.Encoding.ASCII.GetBytes(html); //ASCIの部分をUnicodeにするとブラウザでダウロードしてしまう。 stream.Write(SendBuffer, 0, SendBuffer.Length); //stream.Flush(); ClientSocket.Close(); } //短時間だけ待機 System.Threading.Thread.Sleep(100); } } catch(Exception e) { label1.Text = "サーバー終了"; } } } } |
サーバ2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
using System; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Net; using System.Net.Sockets; using System.IO; using System.Text.RegularExpressions; namespace SimpSrv { public partial class Form1 : Form { bool chk; TcpListener listener = null; public Form1() { InitializeComponent(); } private async void button1_Click(object sender, EventArgs e) { if (listener != null) return; MessageBox.Show("起動しました。"); this.Text = "起動中"; IPAddress ip = IPAddress.Parse("192.168.102.9"); listener = new TcpListener(ip, 80); listener.Start(); TcpClient client = null; chk = true; while(true) { await Task.Run(() => { try { client = listener.AcceptTcpClient(); } catch (SocketException ex) { System.Diagnostics.Debug.Print(ex.Message.ToString()); } }); if (!chk) break; Encoding enc = Encoding.GetEncoding("shift_jis"); string resMsg = ""; string sendMsg = ""; using (NetworkStream ns = client.GetStream()) { ns.WriteTimeout = 10000; ns.ReadTimeout = 10000; using (MemoryStream ms = new MemoryStream()) { byte[] resByte = new byte[1024]; int resSize = 0; do { try { resSize = ns.Read(resByte, 0, resByte.Length); } catch (IOException ex) { System.Diagnostics.Debug.Print(ex.Message.ToString()); break; } if (resSize == 0) break; ms.Write(resByte, 0, resSize); } while (ns.DataAvailable); resMsg = enc.GetString(ms.GetBuffer(), 0, (int)ms.Length); ms.Close(); } Regex reg = new Regex(@"\/\?name=([a-z]+)&id=([0-9]{6})&p=([0-9]{2})\s"); Match match = reg.Match(resMsg); if (match.Success) { sendMsg = "\n\n" + Html.MakeHtml(match.Groups[1].ToString(),match.Groups[2].ToString(),match.Groups[3].ToString()); } else { sendMsg = "\n\n" + "false"; } byte[] sendBytes = enc.GetBytes(sendMsg); try { ns.Write(sendBytes, 0, sendBytes.Length); } catch (IOException ex) { System.Diagnostics.Debug.Print(ex.Message.ToString()); } ns.Close(); } client.Close(); } } private void button2_Click(object sender, EventArgs e) { if (listener == null) return; MessageBox.Show("終了しました。"); this.Text = "停止中"; listener.Stop(); listener = null; chk = false; } } } |