.Net下客户端与远端服务器网络通信与文件传送的实例
2013-04-20 23:20
274 查看
以前做的简单实现了一个客户机与远端服务器通信和发送文件功能,封装成服务通信类,方便上层业务逻辑调用,亦增强复用性。
///<summary>
///远端服务实体类
///</summary>
public
partial class
Service
{
public Service()
{}
private
int _serviceid;
private
string _servicename;
private
string _ipaddr;
private
int _portno;
///<summary>
///
///</summary>
public
int ServiceId
{
set{ _serviceid=value;}
get{return _serviceid;}
}
///<summary>
///
///</summary>
public
string ServiceName
{
set{ _servicename=value;}
get{return _servicename;}
}
///<summary>
///
///</summary>
public
string IpAddr
{
set{ _ipaddr=value;}
get{return _ipaddr;}
}
///<summary>
///
///</summary>
public
int PortNo
{
set{ _portno=value;}
get{return _portno;}
}
…………
///远端服务器及类成员方法等
}
///<summary>
///通信类
///</summary>
public
class ServiceOperation :
Service
{
private
TcpClient _client;
private
int _timeOut = 25;
public ServiceOperation():base()
{
}
public ServiceOperation(int serviceId)
:
base(serviceId)
{
}
///<summary>
///超时时间(秒),不设置超时时间时,超时时间为30分钟。
///</summary>
public
int TimeOut
{
set
{
_timeOut =
value;
if (_timeOut == 0)
_timeOut = 1800;
//30分钟
}
}
#region 与远程服务通信方法
///<summary>
///打开连接
///</summary>
public
void Connect()
{
try
{
_client =
new TcpClient(IpAddr,PortNo);
}
catch (Exception exp)
{
throw new Exception("在建立与服务端" + IpAddr +
":" + PortNo.ToString() +
"连接时出错:\n" + exp.Message);
}
}
///<summary>
///关闭连接
///</summary>
public
void Close()
{
if (_client != null && _client.Connected)
{
_client.Client.Shutdown(SocketShutdown.Both);
_client.Close();
}
}
///<summary>
///向远端发送信息
///</summary>
///<param name="buffer"></param>
public
void transmitBuffer(string buffer)
{
byte[] sendBuffer = Encoding.Default.GetBytes(buffer);
NetworkStream stream;
stream = _client.GetStream();
try
{
stream.WriteTimeout = 10000;
stream.Write(sendBuffer, 0, sendBuffer.Length);
}
catch (Exception exp)
{
throw new Exception("向服务器端发送数据时出错\n" + exp.Message);
}
}
///<summary>
///从远端读取信息
///</summary>
///<returns></returns>
public
string receiveBuffer()
{
StringBuilder buffer;
int rcvNums;
int ind;
byte[] recvBuffer = new
byte[163840];
NetworkStream stream;
stream = _client.GetStream();
stream.ReadTimeout = (_timeOut + 5) * 1000;
//延迟5秒
buffer =
new StringBuilder();
do
{
rcvNums = stream.Read(recvBuffer, 0, recvBuffer.Length);
if (rcvNums == 0)
break;
for (ind = 0; ind < rcvNums; ind++)
if (recvBuffer[ind] == (byte)0)
break;
rcvNums = ind;
buffer.AppendFormat("{0}",
Encoding.Default.GetString(recvBuffer, 0, rcvNums));
}
while (stream.CanRead);
return buffer.ToString();
}
///<summary>
///接收报文,一直到报文结束标签,用于分发程序的握手
///</summary>
///<returns></returns>
public
string ReceiveDistributeBuffer()
{
StringBuilder buffer;
int rcvNums;
int ind;
byte[] recvBuffer = new
byte[163840];
NetworkStream stream;
stream = _client.GetStream();
stream.ReadTimeout = (_timeOut + 5) * 1000;
//延迟5秒
buffer =
new StringBuilder();
do
{
rcvNums = stream.Read(recvBuffer, 0, recvBuffer.Length);
if (rcvNums == 0)
break;
for (ind = 0; ind < rcvNums; ind++)
if (recvBuffer[ind] == (byte)0)
break;
rcvNums = ind;
buffer.AppendFormat("{0}",
Encoding.Default.GetString(recvBuffer, 0, rcvNums));
if (buffer.ToString().ToLower().Contains("</sqlresult>"))
break;
}
while (stream.CanRead);
return buffer.ToString();
}
///<summary>
///分发文件
///</summary>
///<param name="fileName"></param>
public
void SendFile(string fileName)
{
//int rcvNums;
byte[] sendBuffer = new
byte[1024];
NetworkStream stream;
BinaryReader reader;
try
{
reader =
new BinaryReader(File.Open(fileName,
FileMode.Open));
}
catch (Exception exp)
{
throw new Exception("打开文件" + fileName +
"读时出错:\n" + exp.Message);
}
try
{
stream = _client.GetStream();
stream.WriteTimeout = (_timeOut + 5) * 1000;
long total = reader.BaseStream.Length;
int rdby = 0;
int len = 0;
while (rdby < total && stream.CanWrite)
{
//从要传输的文件读取指定长度的数据
len = reader.Read(sendBuffer, 0, sendBuffer.Length);
//将读取的数据发送到对应的计算机
stream.Write(sendBuffer, 0, len);
//增加已经发送的长度
rdby = rdby + len;
}
}
catch (Exception exp)
{
throw new Exception("发送文件" + fileName +
"时出错:\n" + exp.Message);
}
finally
{
reader.Close();
}
}
#endregion 与远程服务通信方法
}
}
相关文章推荐
- 【Linux网络编程实例】实例二:利用TCP协议进行客户端与服务器通信
- 客户端程序通过TCP通信传送"小文件"到服务器
- [c#源码分享]客户端程序通过TCP通信传送"小文件"到服务器
- linux c之网络编程之TCP(服务器和和客户端基础通信)
- JAVA_ 网络编程,写一个可以上传文件的服务器和客户端
- [Android实例] Android ListView从网络获取图片及文字显示 + 自己搭建的服务器的xml文件
- 网络编程-客户端读取文件_服务器写入文件
- 网络编程之客户端之间的通信实例
- TCP/IP通信 客户端、服务器 实例
- 网络通信_UDP客户端以及服务器
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- Linux基于TCP/IP简单的客户端、服务器通信程序实例
- TCP/IP通信 客户端、服务器 实例
- python网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
- Windows网络编程入门:简单的客户端和服务器通信程序调试
- 【Netty4.X】Unity客户端与Netty服务器的网络通信(一)
- 【redhat5.5】linux的LDAP认证服务器的配置及客户端pam网络验证实例
- 网络通信_TCP客户端与服务器
- 基于TCP网络通信的自动升级程序源码分析-客户端请求服务器上的升级信息