[C#]多線程TcpListener自訂事件

來源:互聯網
上載者:User

目的:
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------------------------------

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.