cscの作法 その557

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題
Tcp Serverとclientをドッキングせよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/93f2aefe-5304-f09e-d95e-ce979b5b3fd7.png)

# サンプルコード

```

using System;
using System.Data;
using System.Linq;
using System.Windows.Forms;
using WeifenLuo.WinFormsUI.Docking;
using System.Drawing;
using System.Runtime.InteropServices;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace Dock
{
	public partial class Win1: WeifenLuo.WinFormsUI.Docking.DockContent {
		public TextBox bo1;
		public Win1() {
			bo1 = new TextBox();
			bo1.Text = "";
			bo1.Multiline = true;
			bo1.Font = new Font("ＭＳ Ｐゴシック", 12);
			bo1.Dock = DockStyle.Fill;
			Controls.AddRange(new Control[] {
				bo1
			});
		}
	}
	public partial class Win2: WeifenLuo.WinFormsUI.Docking.DockContent {
		public string msg = "";
		public Win2() {
			Button btn0 = new Button();
			btn0.Location = new Point(50, 50);
			btn0.Text = "send";
			btn0.Click += btn0_Click;
			Controls.AddRange(new Control[] {
				btn0
			});
		}
		void btn0_Click(object sender, System.EventArgs e) {
			string sendMsg = "send ore";
			string ipOrHost = "127.0.0.1";
			int port = 49152;
			System.Net.Sockets.TcpClient tcp = new System.Net.Sockets.TcpClient(ipOrHost, port);
			Console.WriteLine("cliant: サーバー({0}:{1})と接続しました({2}:{3})。", ((System.Net.IPEndPoint) tcp.Client.RemoteEndPoint).Address,
				((System.Net.IPEndPoint) tcp.Client.RemoteEndPoint).Port, ((System.Net.IPEndPoint) tcp.Client.LocalEndPoint).Address,
				((System.Net.IPEndPoint) tcp.Client.LocalEndPoint).Port);
			msg += "サーバーと接続しました" + Environment.NewLine;
			System.Net.Sockets.NetworkStream ns = tcp.GetStream();
			ns.ReadTimeout = 10000;
			ns.WriteTimeout = 10000;
			System.Text.Encoding enc = System.Text.Encoding.UTF8;
			byte[] sendBytes = enc.GetBytes(sendMsg + '\n');
			ns.Write(sendBytes, 0, sendBytes.Length);
			msg += "cliant: 送信しました。" + Environment.NewLine;
			ns.Close();
			tcp.Close();
			msg += "cliant: 切断しました。" + Environment.NewLine;
		}
	}
	public class DataReceivedEventArgs: EventArgs {
		public string Message;
	}
	public class ClassTcpServer
	{
		public string ipaddress {
			get;
			set;
		}
		public int port {
			get;
			set;
		}
		public int timerinterval {
			get;
	 		set;
		}
		private System.Net.Sockets.TcpListener listener;
		private System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
		public delegate void DataReceivedEventHandler(object sender, DataReceivedEventArgs e);
		public event DataReceivedEventHandler DataReceived;
		public ClassTcpServer() {
		}
		public void Start() {
			listener = new System.Net.Sockets.TcpListener(System.Net.IPAddress.Parse(ipaddress), port);
			listener.Start();
			timer.Interval = timerinterval;
			timer.Tick += new EventHandler(timer_Tick);
			timer.Start();
		}
		public void Stop() {
			timer.Stop();
			if (listener != null)
			{
				listener.Stop();
			}
			listener = null;
		}
		private void timer_Tick(object sender, EventArgs e) {
			//Console.WriteLine("server: mate");
			if (!listener.Pending())
			{
				return;
			}
			Console.WriteLine("server: kita");
			System.Net.Sockets.TcpClient client = listener.AcceptTcpClient();
			System.Net.Sockets.NetworkStream ns = client.GetStream();
			ns.ReadTimeout = 10000;
			ns.WriteTimeout = 10000;
			System.Text.Encoding enc = System.Text.Encoding.UTF8;
			bool disconnected = false;
			System.IO.MemoryStream ms = new System.IO.MemoryStream();
			byte[] resBytes = new byte[256];
			int resSize = 0;
			do
			{
				resSize = ns.Read(resBytes, 0, resBytes.Length);
				if (resSize == 0)
				{
					disconnected = true;
					break;
				}
				ms.Write(resBytes, 0, resSize);
			} while (ns.DataAvailable || resBytes[resSize - 1] != '\n');
			string resMsg = enc.GetString(ms.GetBuffer(), 0, (int) ms.Length);
			ms.Close();
			resMsg = resMsg.TrimEnd('\n');
			Console.WriteLine("server: " + resMsg);
			DataReceivedEventArgs ee = new DataReceivedEventArgs();
			ee.Message = resMsg;
			DataReceived(this, ee);
			if (!disconnected)
			{
				string sendMsg = resMsg.Length.ToString();
				byte[] sendBytes = enc.GetBytes(sendMsg + '\n');
				ns.Write(sendBytes, 0, sendBytes.Length);
				Console.WriteLine("server: send ok");
			}
			ns.Close();
			client.Close();
			Console.WriteLine("server: close");
		}
	}
	public partial class Win3: WeifenLuo.WinFormsUI.Docking.DockContent {
		public string msg = "";
		public Win3() {
			Button btn1 = new Button();
			btn1.Location = new Point(50, 50);
			btn1.Text = "start";
			btn1.Click += btn1_Click;
			Controls.AddRange(new Control[] {
				btn1
			});
		}
		void btn1_Click(object sender, System.EventArgs e) {
			ClassTcpServer classTcpServer = new ClassTcpServer();
			classTcpServer.ipaddress = "0.0.0.0";
			classTcpServer.port = 49152;
			classTcpServer.timerinterval = 100;
			classTcpServer.DataReceived += new ClassTcpServer.DataReceivedEventHandler(TcpServer_DataReceived);
			classTcpServer.Start();
			msg += "server: start" + Environment.NewLine;
		}
		private void TcpServer_DataReceived(object sender, DataReceivedEventArgs e) {
			msg += "server: recv" + Environment.NewLine;
			msg += e.Message + Environment.NewLine;
		}
	}
	public partial class Form1: Form {
		public Win3 left1;
		public Win2 right1;
		public Win1 bottom1;
		public Win1 center1;
		public Form1() {
			ClientSize = new Size(800, 600);
			Text = "dock";
			var dockPanel1 = new DockPanel();
			dockPanel1.ShowDocumentIcon = true;
			dockPanel1.Dock = DockStyle.Fill;
			dockPanel1.DocumentStyle = DocumentStyle.DockingWindow;
			Controls.Add(dockPanel1);
			left1 = new Win3();
			left1.TabText = "left1";
			left1.Show(dockPanel1, DockState.DockLeft);
			right1 = new Win2();
			right1.TabText = "right1";
			right1.Show(dockPanel1, DockState.DockRight);
			bottom1 = new Win1();
			bottom1.TabText = "bottom1";
			bottom1.Show(dockPanel1, DockState.DockBottom);
			center1 = new Win1();
			center1.TabText = "center1";
			center1.Show(dockPanel1, DockState.Document);
			dockPanel1.UpdateDockWindowZOrder(DockStyle.Left, true);
			Timer timer = new Timer {
				Interval = 200
			};
			timer.Tick += timer_Tick;
			timer.Start();
		}
		private void timer_Tick(object sender, EventArgs e) {
			//Console.WriteLine("timer");
			if (left1.msg != "")
			{
				bottom1.bo1.AppendText(left1.msg);
				left1.msg = "";
			}
			if (right1.msg != "")
			{
				bottom1.bo1.AppendText(right1.msg);
				right1.msg = "";
			}
		}
		[STAThread]
		public static void Main() {
			Application.Run(new Form1());
		}
	}
}






```

以上。