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. Element is not currently visible and so may not be interacted with错误

    用selenium定位时,碰到这种错误的原因: 此种问题的关键是在于用className和id都不唯一所以找不到对象 所以,碰到这种问题就换一种定位方式

  2. python内置函数 3

    int( [x[, radix]])转换为字符串或数字为纯整数.如果参数是一个字符串,它必须包含一个可能有符号的十进制数作为一个 Python 整 数,可能嵌入空格.以 radix 参数给出的基数为基 ...

  3. vue学习笔记之v-for与-repeat

    今天看到一个v-repeat的例子 <body> <ul id="tags"> <li v-repeat="tags"> { ...

  4. 向JS对象添加和删除事件

    this.removeEventListener = function (obj, ename, func) { var store = obj[this.addEventListener.pre + ...

  5. React Native 文本输入

    TextInput是一个允许用户输入文本的基础组件.它有一个名为onChangeText的属性,此属性接受一个函数,而此函数会在文本变化时被调用.另外还有一个名为onSubmitEditing的属性, ...

  6. mysql 删除重复数据保留一条

    验证:mysql 5.6版本 方法一: delete a from table a left join( select (id) from table group by studentName,cla ...

  7. NetworkComms V3 之同时监听多端口

    NetworkComms网络通信框架序言 NetworkComms通信框架,是一款来自英国的c#语言编写的通信框架,历时6年研发,成熟稳定,性能可靠.   框架支持同时监听服务器上的多个端口,写法如下 ...

  8. Linux diable ipv6

    在RHEL 5下面测试成功     linux下面禁止ipv6的方法: 来自: 杨志刚 博客 (http://yangzhigang.cublog.cn)   这里我所做的是Redhat Linux, ...

  9. .htaccess的301重定向代码

    把不带www的域名301到带www的域名 RewriteEngine On RewriteCond %{http_host} ^example.com$ [NC] RewriteRule ^(.*)$ ...

  10. 关于oracle的rowid

    oracle数据库中表的每一行(元组)均有一个rowid,它是数据的详细地址,通过rowid,oracle可以快速的定位某行具体的数据的位置. ROWID可以分为物理rowid和逻辑rowid两种.普 ...