教育訓練第二彈,下午的課程就是在教如何使用 .NET 架構寫一個 Socket 的程式。此範例是使用 C#。
所有程式碼可從
這邊取得。
(不過程式碼有點亂…而且沒有加註解,請斟酌使用。)
Server 端
using System;
using System.Collections.Generic;
using System.Text;
// include Socket library
using System.Net;
using System.Net.Sockets;
namespace tcpServerStarter
{
class Program
{
static void Main(string[] args)
{
// 建立 tcpServer 物件並啟動 server
tcpServer server = new tcpServer(IPAddress.Any, 520);
server.startServer();
}
}
// tcpServer Class
public class tcpServer
{
IPAddress _ip; // 要 listen 的 ip
int _port; // 要 listen 的 port
bool _serverAlive = false; // 檢查 server 是否還存活
// tcpServer construtor
public tcpServer(IPAddress ip, int port)
{
this._ip = ip;
this._port = port;
}
// 啟動 server 的 method
public void startServer()
{
將 _serverAlive 的 flag 設為 true
_serverAlive = true;
try
{
// 建立一個 TcpListener 的物件,並且 listen 在 _ip 與 _port
TcpListener listen = new TcpListener(this._ip, this._port);
// 開始 listen
listen.Start();
// 如果 Server 還活著
while (_serverAlive)
{
// 取得由 TcpListener 得到的 TcpClient
TcpClient tcpClient = listen.AcceptTcpClient();
// 由 TcpClient 建立一個 NetworkStream
NetworkStream netStream = tcpClient.GetStream();
// 建立一個大小為 1024 的 byte 陣列來放收到的資料
byte[] reciBuffer = new byte[1024];
int count = 0;
// 將經由 Stream 讀取道的資料放入 readBuffer 中
// 並且將長度存到 count
while ((count = netStream.Read(readBuffer, 0, readBuffer.Length)) != 0)
{
// 將 byte 陣列轉成 string
string reciStr = System.Text.Encoding.UTF8.GetString(reciBuffer, 0, count);
Console.WriteLine("recieve data:" + reciStr);
// 傳出的字串 = 收到的字串
string sendStr = reciStr;
// 將 string 轉成 byte 陣列
byte[] sendBuffer = System.Text.Encoding.UTF8.GetBytes(sendStr);
// 將資料送出
netStream.Write(sendbuffer, 0, sendBuffer.Length);
Console.WriteLine("send data:" + sendstr);
}
}
}
catch { }
}
}
}
Client 端
建立 TextBox1、TextBox2、TextBox3、Button1
TextBox1 為要連接的 server ip
TextBox2 為要連接的 port
TextBox3 為從 server 收到的資料
Button1 為連接 server 的按鈕
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
// include Socket Library
using System.Net;
using System.Net.Sockets;
namespace tcpClient
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// 建立一個 TcpClient 物件連接到 ip, port
TcpClient client = new TcpClient(textBox1.Text, int.Parse(textBox2.Text));
// 由 TcpClient 建立一個 Stream
NetworkStream netStream = client.GetStream();
// 自訂要送出的資料為 123456
string sendMsg = "123456";
// 將字串轉為 byte 陣列
byte[] sendBuffer = System.Text.Encoding.UTF8.GetBytes(sendMsg);
// 送出給 server
netStream.Write(sendBuffer, 0, sendBuffer.Length );
// 建立一個大小為 1024 的 byte 陣列來放收到的資料
byte[] readBuffer = new byte[1024];
// 讀取從 server 來的資料並放到 readBuffer 中
netStream.Read(readBuffer, 0, readBuffer.Length);
// 將 byte 陣列轉為 string
string readStr = System.Text.Encoding.UTF8.GetString(readBuffer, 0, readBuffer.Length);
// 將讀取到的字串顯示在 textBox3
textBox3.Text = readStr;
}
}
}
沒有留言:
張貼留言