📄 clsp2p.cs
字号:
using System;
using System.Net.Sockets;
using System.IO;
using System.Threading ;
namespace P2PSvr
{
/// <summary>
/// clsP2P的摘要说明。
/// </summary>
public class P2P
{
public delegate void DelgMsgListened();
public event DelgMsgListened OnMsgListened;
//侦听到的消息
private string m_msgLisened;
//远程机是否正常连接
private bool isConnected=false;
//创建线程,用以侦听端口号,接收信息
private Thread lsThread;
//用以侦听端口号
private TcpListener lsClient;
//设定标识位,判断侦听状态
private bool isListenerNow = true;
//创建传送/接收的基本数据流实例
private NetworkStream tcpStream;
//用以实现向远程主机传送信息
private StreamWriter reqStreamW;
//用以创建对远程主机的连接
private TcpClient tcpClientPere;
//用以接收远程主机传送来的数据
private Socket skSocket;
public string MsgLisened
{
get
{
return m_msgLisened;
}
}
public bool Connected
{
get
{
return isConnected;
}
}
public void DisposeMe()
{
try
{
isListenerNow = false;
lsThread.Abort();
lsThread = null;
lsClient.Stop ();
skSocket.Close();
tcpClientPere.Close();
}
catch(Exception)
{
//Do nothing here
}
}
public void BeginLisen()
{
try
{
lsClient= new TcpListener (8877);
lsClient.Start();
//接受远程计算机的连接请求,并获得用以接收数据的Socket实例
skSocket = lsClient.AcceptSocket();
//循环侦听
while (isListenerNow)
{
//定义从远程计算机接收到数据存放的数据缓冲区
Byte[] stream = new Byte[80] ;
//接收数据,并存放到定义的缓冲区中
int i = skSocket.Receive(stream);
//以指定的编码,从缓冲区中读出内容
m_msgLisened = System.Text.Encoding.UTF8.GetString (stream);
isConnected=true;
OnMsgListened();
}
}
catch (System.Security.SecurityException )
{
isConnected=false;
}
}
public void ThreadToListen()
{
//初始化线程实例,单独以一个线程来进行侦听
lsThread = new Thread (new ThreadStart(this.BeginLisen));
//启动线程
lsThread.Start();
}
public bool ConnectToRemote(string svrName)
{
try
{
tcpClientPere = new TcpClient() ;
//向远程计算机提出连接申请
tcpClientPere.Connect(svrName,8877);
//如果连接申请建立,获得传送数据的数据流
tcpStream = tcpClientPere.GetStream();
return true;
}
catch (Exception)
{
return false;
}
}
public void DisConnectToRemote()
{
tcpClientPere.Close();
tcpClientPere = null;
}
public bool SendMsg(string msgToSend)
{
try
{
reqStreamW = new StreamWriter(tcpStream);
reqStreamW.Write (msgToSend);
//清理当前编写器的所有缓冲区,并使所有缓冲数据写入流
reqStreamW.Flush ( ) ;
return true;
}
//异常处理
catch (Exception)
{
return false;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -