public class SocketTcpClient
{
public static string ErrorMsg = string.Empty;
private static Socket _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
private static string _serverIp = string.Empty;
private static int _port = ;
private static int _state = ;
private static readonly int _timeout = ; private static void ClearSocket()
{
if (_socket != null)
{
_socket.Close();
}
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
} private static bool Connect()
{
try
{
if (!_socket.Connected)
{
IPEndPoint ep = new IPEndPoint(IPAddress.Parse(_serverIp), _port);
_socket.Connect(ep);
Thread.Sleep();
}
return true; }
catch (System.Exception ex)
{
ClearSocket();
ErrorMsg = "网络错误!原因:" + ex.Message;
return false;
}
} private static bool Send(byte[] byteArray)
{
bool bConnect = _socket.Connected;
if (!bConnect)
bConnect = Connect(); if (bConnect)
{
try
{
var numberOfBytesSent = _socket.Send(byteArray);
if (numberOfBytesSent == )
{
ClearSocket();
ErrorMsg = "网络错误!原因:发送时对方关闭socket连接";
return false;
}
return true;
}
catch (System.Exception ex)
{
ClearSocket();
ErrorMsg = "网络错误!原因:" + ex.Message;
return false;
}
}
return false;
} private static bool Receive(ref byte[] byteArray)
{
bool bConnect = _socket.Connected;
if (!bConnect)
bConnect = Connect(); if (bConnect)
{
MemoryStream ms = new MemoryStream();
byte[] readBuffer = new byte[*]; do
{
var numberOfBytesRead = ;
try
{
numberOfBytesRead = _socket.Receive(readBuffer);
}
catch (System.Exception ex)
{
ClearSocket();
ErrorMsg = "网络错误!原因:" + ex.Message;
return false;
} //对方关闭socket连接,上面的Read函数据阻塞取消,收到数据为0
if (numberOfBytesRead == )
{
ClearSocket();
ErrorMsg = "网络错误!原因:接收时对方关闭socket连接";
return false;
} //增加接收到的数据,并转化为MemoryStream
ms.Write(readBuffer, , numberOfBytesRead); } while (_socket.Connected && _socket.Available > ); byteArray = ms.ToArray();
return true;
}
return false;
} private static void RunWorkThread(object stateInfo)
{
DateTime dt = (DateTime) stateInfo;
while (true)
{
Thread.Sleep();
TimeSpan ts = DateTime.Now - dt;
if (_state == )
{
if (ts.Seconds > _timeout)
{
ClearSocket();
_state = ;
break;
}
}
else
{
break;
}
}
} private static bool SysCall(byte[] dataRequest, ref byte[] dataResponse)
{
_state = ;
ThreadPool.QueueUserWorkItem(RunWorkThread, DateTime.Now); bool bResult = false;
if (Send(dataRequest))
{
bResult = Receive(ref dataResponse);
} if (_state == )
{
ErrorMsg = "超时错误!";
}
else
{
_state = ;
}
return bResult;
} /// <summary>
/// 同步传输
/// </summary>
/// <param name="controller"></param>
/// <param name="action"></param>
/// <param name="msg">utf-8</param>
/// <returns></returns>
public static string SyncCallMessage(string controller, string action, string msg)
{
byte[] msgRequest = Encoding.UTF8.GetBytes(controller + " " + action + " " + msg + Environment.NewLine);
byte[] result = null;
string msgResult = null; //同步调用远程方法
bool bSuccess = SysCall(msgRequest, ref result);
if (bSuccess)
{
msgResult = Encoding.UTF8.GetString(result);
}
return msgResult;
} public static void SetServerIp(string serverIp, int port)
{
_serverIp = serverIp;
_port = port;
ClearSocket();
}
}
     public static class JsonConvert
{
public static string ToJsonEx(this object dto)
{
return Newtonsoft.Json.JsonConvert.SerializeObject(dto);
} public static T FromJsonEx<T>(this string json)
{
return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(json);
}
}

主要用在Pda开发数据通信方式,当然在Pda上用webrequest,拿到json解析也可以,以上Socket请求服务是同步的,如果需要稍微改善下,异步接收数据,那么服务器可以做到推送消息。

SocketTcpClient的更多相关文章

  1. Unity C# 自定义TCP传输协议以及封包拆包、解决粘包问题

    本文只是初步实现了一个简单的TCP自定协议,更为复杂的协议可以根据这种方式去扩展. TCP协议,通俗一点的讲,它是一种基于socket传输的由发送方和接收方事先协商好的一种消息包组成结构,主要由消息头 ...

  2. QT创建TCP Socket通信

    最近在学习QT,了解到QT可以进行SOCKET网络通信,进行学习,并建立一个简单的聊天DEMO.为了测试是否能与VS2012下的程序进行通信,在VS2012下建立一个客户端程序,进行通信测试,发现可以 ...

  3. Android之socket服务端

    import java.io.DataInputStream; import java.io.IOException; import java.io.PrintWriter; import java. ...

  4. 8.9.网络编程_Socket 远程调用机制

    1.网络编程 1.1.网络编程概述: 通过通信线路(有线或无线)可以把不同地理位置且相互独立的计算机连同其外部设备连接起来,组成计算机网络.在操作系统.网络管理软件及网络 通信协议的管理和协调下,可以 ...

  5. 1、Socket通信

    [TCP] 服务器端:无目标插座升级为有目标插座后,就可以通过有目标的插座收发数据 客户端: 实战:此案例有利于理解Socket的工作流程. 缺点:服务器只能接收1个客户端的连接,因为只写了一个Acc ...

随机推荐

  1. 【java基础】方法2

    让形参可变的方法 jdk1.5之后,java允许定义形参长度可变的参数,允许为方法指定数量不确定的形参. package object; public class VariableParam { // ...

  2. CBUUID UUIDString unrecognized selector sent to instance 错误

    CBUUID UUIDString unrecognized selector sent to instance 错误 ios7.0,4s 蓝牙出现上述错误! 查看api可知,错误原因,由于CBUUI ...

  3. linux 下mysql的安装,并设置必要的密码

    首先,我使用的是redhat linux ,版本号为: [root@localhost init.d]# cat /proc/version Linux version - (bhcompile@po ...

  4. 51nod 1027大数乘法

    题目链接:51nod 1027大数乘法 直接模板了. #include<cstdio> #include<cstring> using namespace std; ; ; ; ...

  5. 动态规划(一)——最长公共子序列和最长公共子串

    注: 最长公共子序列采用动态规划解决,由于子问题重叠,故采用数组缓存结果,保存最佳取值方向.输出结果时,则自顶向下建立二叉树,自底向上输出,则这过程中没有分叉路,结果唯一. 最长公共子串采用参考串方式 ...

  6. WCF事务应用[转]

    在B2B的项目中,一般用户注册后,就有一个属于自己的店铺,此时,我们就要插入两张表, User和Shop表. 当然,要么插入成功,要么全失败. 第一步: 首先看一下项目的结构图: 第二步: 准备工作, ...

  7. Hibernate createCriteria查询详解

    本文转载自 : http://penghao122.javaeye.com/blog/80794 1.创建一个Criteria实例 net.sf.hibernate.Criteria这个接口代表对一个 ...

  8. transform scale

  9. hdu 1041 (OO approach, private constructor to prevent instantiation, sprintf) 分类: hdoj 2015-06-17 15:57 25人阅读 评论(0) 收藏

    a problem where OO seems more natural to me, implementing a utility class not instantiable. how to p ...

  10. 判断CAD图纸版本

    判断CAD图纸版本Dwg文件版本 使用记事本打开DWG图纸文件,在最开始有6个字母和数字组合,即为图纸的版本号 AC1015:CAD2000版本: AC1018:CAD2004版本: AC1021:C ...