1、首先要确定好,Socket连接需要的参数
public class NetworkPortBaseDal
{
///
/// ip
///
public string ip { get; set; }
///
/// 端口
///
public int port { get; set; }
///
/// 返回结果
///
public string Res { get; set; }
///
/// 发送的指令
///
public byte[] Cmd { get; set; }
///
/// 接收的超时时间
///
public int ReceiveTimeout { get; set; }
///
/// 发送的超时时间
///
public int SendTimeout { get; set; }
}
确定好参数后,就需要构思如何进行连接,这里我们可以申明一个abstract(抽象类),便于后续类继承,所有的Socket都需要连接,我们把它直接写到抽象类中,其中NetworkPortParam是上面的参数,通过构造函数进行赋值,Conn进行连接,ReadData是一个抽象函数,后续继承的类需要对其完善。
public abstract class NetworkPortBase
{
public NetworkPortBaseDal NetworkPortParam;
///
/// socket对象
///
protected Socket socket { get; set; }
///
/// 构造函数
///
///
///
///
protected NetworkPortBase(NetworkPortBaseDal NetworkParam)
{
try
{
NetworkPortParam = new NetworkPortBaseDal()
{
ip = NetworkParam.ip,
port = NetworkParam.port,
Cmd = NetworkParam.Cmd,
ReceiveTimeout = NetworkParam.ReceiveTimeout,
SendTimeout = NetworkParam.SendTimeout
};
}
catch
{
}
}
///
/// 连接tcp
///
///
///
protected bool Conn(ref string exceptionMessage)
{
try
{
if (this.socket != null)
{
this.socket.Close();
this.socket.Dispose();
}
this.socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipPort = new IPEndPoint(IPAddress.Parse(NetworkPortParam.ip), NetworkPortParam.port);
this.socket.ReceiveTimeout = NetworkPortParam.ReceiveTimeout;
this.socket.SendTimeout = NetworkPortParam.SendTimeout;
this.socket.Connect(ipPort);
return true;
}
catch (Exception ex)
{
exceptionMessage = ex.Message;
return false;
}
}
///
/// 读取数据2
///
///
///
public abstract bool ReadData(string msg, ref string exceptionMessage);
}
接着我们构造派生类 这里使用的例子是扫码枪,大家可根据自己实际需要发送的指令进行更改。
其中对ReadData进行了重写,NetworkPortParam.Res获得返回的数据
public class SRScan : NetworkPortBase
{
///
/// 构造函数
///
///
///
protected internal SRScan(NetworkPortBaseDal SRNetworkParam):base(SRNetworkParam)
{
}
public override bool ReadData(string msg,ref string exceptionMessage)
{
try
{
NetworkPortParam.Res = "ERROR";
if (socket == null || socket.Connected == false)
{
if (this.Conn(ref exceptionMessage))
{
exceptionMessage = "扫码枪重连成功";
}
else
{
exceptionMessage = "扫码枪重连失败请检查:" + exceptionMessage;
return false;
}
}
socket.Send(msg);
byte[] buffer = new byte[1024];
int bufferLenght =socket.Receive(buffer);
string temp_Res_Sn = Encoding.Default.GetString(buffer, 0, bufferLenght).Replace("r", "");
NetworkPortParam.Res = temp_Res_Sn.Replace("n", "");
socket.Close();
return true;
}
catch (Exception ex)
{
exceptionMessage = ex.Message;
Logging.NetworkLog("扫码失败rn" + ex.Message);
try
{
if (socket != null && socket.Connected)
{
socket.Send(NetworkPortParam.Cmd2);
byte[] buffer = new byte[1024];
int bufferLenght = socket.Receive(buffer);
NetworkPortParam.Res = "ERROR";
exceptionMessage += "扫码超时";
}
}
catch
{
}
return false;
}
}
///
/// 不使用,只实现抽象函数的重构
///
///
///
public override bool ReadData(string msg, ref string errMsg)
{
return false;
}
///
/// 设计着玩,不使用
///
public void Destroy()
{
socket.Close();
NetworkPortBaseFactory.Destroy(this);
}
}
到这里基本就算完成了,不过为了以后方便,我们可以再建立一个工厂,首先申明一个枚举
public enum NetworkPortBaseEnum
{
SRScan,
PrinterEquipment,
GT2Object
}
接着创建工厂
public static NetworkPortBase Greate(NetworkPortBaseEnum networkEnum,NetworkPortBaseDal NetworkParam)
{
NetworkPortBase objectr;
switch (networkEnum)
{
case NetworkPortBaseEnum.SRScan:
objectr = new SRScan(NetworkParam);
break;
case NetworkPortBaseEnum.PrinterEquipment:
objectr = new PrinterEquipment(NetworkParam);
break;
case NetworkPortBaseEnum.GT2Object:
objectr = new GT2Object(NetworkParam);
break;
default:
objectr = new ObjectNetwork(NetworkParam);
break;
}
return objectr;
}



