📄 imessagereceiver.cs
字号:
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Threading;
using System.Net.Sockets;
using System.IO;
namespace mychat1
{
public delegate void MessageReceivedEventHandler(string msg);
public delegate void ClientConnectedEventHandler(IPEndPoint endPoint);
public delegate void ConnectionLostEventHandler(string info);
public delegate void PortNumberReadyEventHandler(int portNumber);
public interface IMessageReceiver
{
event MessageReceivedEventHandler MessageReceived; // 接收到发来的消息
event ConnectionLostEventHandler ClientLost; // 远程主动断开连接
event ClientConnectedEventHandler ClientConnected; // 远程连接到了本地
void StartListen(); // 开始侦听端口
void StopListen(); // 停止侦听端口
}
public class MessageReceiver : IMessageReceiver
{
public event MessageReceivedEventHandler MessageReceived;
public event ConnectionLostEventHandler ClientLost;
public event ClientConnectedEventHandler ClientConnected;
// 当端口号Ok的时候调用 -- 需要告诉用户界面使用了哪个端口号在侦听
// 这里是业务上体现不出来,在实现中才能体现出来的
// public event PortNumberReadyEventHandler PortNumberReady;
private Thread workerThread;
private TcpListener listener;
public MessageReceiver()
{
((IMessageReceiver)this).StartListen();
}
// 开始侦听:显示实现接口
void IMessageReceiver.StartListen()
{
ThreadStart start = new ThreadStart(ListenThreadMethod);
workerThread = new Thread(start);
workerThread.IsBackground = true;
workerThread.Start();
}
// 线程入口方法
private void ListenThreadMethod()
{
try
{
IPAddress localIp = IPAddress.Any;
listener = new TcpListener(localIp, 9053);
listener.Start();
}
catch
{
}
// 获取端口号
IPEndPoint endPoint = listener.LocalEndpoint as IPEndPoint;
/* int portNumber = endPoint.Port;
if (PortNumberReady != null)
{
PortNumberReady(portNumber); // 端口号已经OK,通知用户界面
}*/
while (true)
{
TcpClient remoteClient;
try
{
remoteClient = listener.AcceptTcpClient();
}
catch
{
break;
}
if (ClientConnected != null)
{
// 连接至本机的远程端口
endPoint = remoteClient.Client.RemoteEndPoint as IPEndPoint;
ClientConnected(endPoint); // 通知用户界面远程客户连接
}
Stream streamToClient = remoteClient.GetStream();
byte[] buffer = new byte[1024];
/* while (true)
{
try
{
int bytesRead = streamToClient.Read(buffer, 0, 1024);
if (bytesRead == 0)
{
throw new Exception("客户端已断开连接");
}
string msg = Encoding.Unicode.GetString(buffer, 0, bytesRead);
if (MessageReceived != null)
{
MessageReceived(msg); // 已经收到消息
}
}
catch (Exception ex)
{
if (ClientLost != null)
{
ClientLost(ex.Message); // 客户连接丢失
break; // 退出循环
}
}
} */
}
}
// 停止侦听端口
public void StopListen()
{
try
{
listener.Stop();
listener = null;
workerThread.Abort();
}
catch { }
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -