目的:
1:Server:可以接受多個串連
建立一個等待連接線程,處理新的客戶TCP串連請求。
為每一個TCP串連建立一個服務線程。
在接受到請求後,觸發外部的一個方法。所以具有onRequest事件
發布一個serverPort的屬性,供外部串連。
2:Client:可以串連多個Server
需要知道遠程Server的remoteHostName和remotePort屬性
具有ProcessRequest方法,供外部調用
--------------server code---------------------
///
/// 為程式安裝一個Server,偵聽所有串連請求
///
public class Server
{
public event RequestEventHandler OnRequest;
private IPEndPoint localEndPoint;
public Server(int serverPort)
{
string localName=Dns.GetHostName();
IPHostEntry ipEntry=Dns.GetHostByName(localName);
IPAddress ip=ipEntry.AddressList[0];
localEndPoint=new IPEndPoint (ip,serverPort);
}
public void Start()
{
//建立新的TCP串連需要一個線程,他一直在運行。
//這裡只需要把這個線程啟動起來
Thread createServer=new Thread(new ThreadStart(CreateServer));
createServer.Name="createServer";
createServer.Start();
}
private void CreateServer()
{
//為每一個新的用戶端串連請求建立TCP串連
TcpListener listener;
listener = new TcpListener(localEndPoint);
listener.Start();
//Log.Write("Start to Listen at :"+_localEndPoint.ToString());
while (true)
{
Socket connection;
connection = listener.AcceptSocket();//接受到請求
Connection conHandler=new Connection();
conHandler.connection=connection;
conHandler.OnRequest+=new RequestEventHandler(connectionHandler_OnRequest);//一個串連的每個請求都會執行一個Server的方法
Thread clientThread =new Thread(new ThreadStart(conHandler.HandleConnection));
clientThread.Start();
}
}
public void Stop()
{
}
private string connectionHandler_OnRequest(string request)
{
//這個方法用於觸發使用該server的一個事件。
string response;
if(this.OnRequest!=null)
response=OnRequest(request);
else
response="SERVER ERROR : NOT DISPATCH THE SERVER METHODE";
return response;
}
}
public delegate string RequestEventHandler(string request);
///
/// 處理一個串連的每個請求
/// 通過事件OnRequest向外發布事件
///
internal class Connection
{
private NetworkStream socketStream;
private BinaryWriter writer;
private BinaryReader reader;
public event RequestEventHandler OnRequest;
private Socket _connection;
public Socket connection
{
set{this._connection=value;}
}
public void HandleConnection()
{
//處理一個TCP串連的每個請求
while (true)
{
socketStream = new NetworkStream(_connection);
writer = new BinaryWriter(socketStream);
reader = new BinaryReader(socketStream);
string request = "";
do
{
try
{
request = reader.ReadString();
string response=OnRequest(request);//引發處理事件
writer.Write(response);
}
catch (Exception)
{
break;
}
} while (request != "CLIENT>>>EXIT" && _connection.Connected);
writer.Close();
reader.Close();
socketStream.Close();
_connection.Close();
}
}
}
--------------------end server code----------------------------
--------------------client code--------------------------------
///
/// 用戶端,發行就緒請求
///
public class Client
{
private NetworkStream output;
private BinaryWriter writer;
private BinaryReader reader;
TcpClient client ;
public Client(string remoteHostName,int remoteHostPort)
{
IPHostEntry ipEntry=Dns.GetHostByName(remoteHostName);
IPAddress remoteIP=ipEntry.AddressList[0];
client = new TcpClient();
client.Connect(remoteIP,remoteHostPort);
output = client.GetStream();
writer = new BinaryWriter(output);
reader = new BinaryReader(output);
//writer.Write("this is the client to connect");
}
public string ProcessRequest(string request)
{
writer.Write(request);
//這裡是同步訊息,需要加入一個非同步處理
string response=reader.ReadString();
return response;
}
public void Close()
{
writer.Close();
reader.Close();
output.Close();
client.Close();
}
}
------------------------end client code------------------------------