using System;
using System.Net;
using System.Net.Sockets;
using System.ComponentModel;
using System.Windows.Forms;
using System.Configuration;
using System.Text;
using System.IO;
namespace test
{
/// <summary>
/// TCP服务类
/// </summary>
public class TcpListen
{
//监听IP
private static string ip = ConfigurationManager.AppSettings["tcpIps"] == null ? "127.0.0.1" : ConfigurationManager.AppSettings["tcpIp"].Trim();
// 监听端口
private static int port = ConfigurationManager.AppSettings["tcpPort"] == null ? 9999 : int.Parse(ConfigurationManager.AppSettings["tcpPort"]);
//单例对象
private static TcpListen tcpListen = null;
// 后台工作线程对象
private BackgroundWorker backWork = null;
private TcpListen()
{
//创建后台工作对象(线程)
backWork = new BackgroundWorker();
//报告进度更新
backWork.WorkerReportsProgress = true;
//支持异步取消
backWork.WorkerSupportsCancellation = true;
//绑定DoWork事件程序
backWork.DoWork += new DoWorkEventHandler(startListen);
//绑定ProgressChanged事件程序
backWork.ProgressChanged += new ProgressChangedEventHandler(BackWork_ProgressChanged);
//开始执行后台操作
backWork.RunWorkerAsync();
}
/// <summary>
/// 单例实现
/// </summary>
/// <returns></returns>
public static TcpListen getInstance()
{
if (tcpListen == null)
tcpListen = new TcpListen();
return tcpListen;
}
/// <summary>
/// 线程内部调用ReportProgress触发,用来在主线程处理具体工作
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void BackWork_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// do something
//常用参数
//e.ProgressPercentage;获取异步进度任务的百分比
//e.UserState;//获取唯一的用户状态,可传意参数
}
// 启动监听
private void startListen(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
TcpListener tcpListener; // 声明网络监听对象
try
{
tcpListener = new TcpListener(IPAddress.Parse(ip), port);
//开始监听
tcpListener.Start();
MessageBox.Show("s");
while (true)
{
// 获取TcpClient
TcpClient tcpClient = tcpListener.AcceptTcpClient();
NetworkStream networkStream = tcpClient.GetStream();
//以下为示例,未严格处理
//获取数据
byte[] myBytes = new byte[1024];
int myBytesLength = networkStream.Read(myBytes, 0, myBytes.Length);
string acceptMsg = Encoding.Default.GetString(myBytes, 0, myBytesLength);
if (!acceptMsg.Trim().Equals(""))
{
//报告收到的数据,用于主线程操作
worker.ReportProgress(1, acceptMsg);
//将收到的数据返回客户端
StreamWriter sw = new StreamWriter(networkStream, Encoding.Default);
sw.Write(acceptMsg);
sw.Flush();
}
networkStream.Close();
}
}
catch(Exception e1)
{
MessageBox.Show("监听器启动失败:" + e1.Message);
}
}
/// <summary>
/// 取消后台操作
/// </summary>
public void stopListen(){
try
{
backWork.CancelAsync();
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
}
/// <summary>
/// 调用类
/// </summary>
public class EEyeFun
{
//目标IP
private static string ip = ConfigurationManager.AppSettings["tcpClientIp"] == null ? "127.0.0.1" : ConfigurationManager.AppSettings["tcpClientIp"].Trim();
// 端口
private static int port = ConfigurationManager.AppSettings["tcpClientPort"] == null ? 9999 : int.Parse(ConfigurationManager.AppSettings["tcpClientPort"]);
// 超时时间(秒)
private static int timeout = ConfigurationManager.AppSettings["tcpClientTimeout"] == null ? 10 : int.Parse(ConfigurationManager.AppSettings["tcpClientTimeout"]);
/// <summary>
/// 获取数据
/// </summary>
/// <param name="msg"></param>
/// <returns></returns>
public string getData(string msg)
{
string result = null;
TcpClient tcpClient = null;
try
{
// 根据目标计算机地址建立连接
tcpClient = new TcpClient(ip, port);
tcpClient.ReceiveBufferSize = 1024;
// 获得用于网络访问的数据流
NetworkStream networkStream = tcpClient.GetStream();
// 发送请求命令串
StreamWriter sw = new StreamWriter(networkStream, Encoding.Default);
sw.Write(msg);
sw.Flush();
// 等候并读取回应信息
if (networkStream.CanRead)
{
// 设置读取超时
networkStream.ReadTimeout = timeout * 1000;
//以下为示例,未严格处理
byte[] bytes = new byte[tcpClient.ReceiveBufferSize];
networkStream.Read(bytes, 0, tcpClient.ReceiveBufferSize);
result = Encoding.Default.GetString(bytes);
}
networkStream.Close();
}
catch (Exception e)
{
MessageBox.Show(e.Message);
return null;
}
finally
{
// 关闭连接
if (tcpClient != null) tcpClient.Close();
}
return result;
}
}
}
如果给你带来帮助,欢迎微信或支付宝扫一扫,赞一下。

