socket 的高手们,闲暇时来帮个忙。就30分了,不时我不道义啊。 我现在有个需求,其实很简单,就是把客户端的10M文件传到服务端,我看了下网上的列子都是发送字符串,不知道文件这样分批怎么上传,望给点代码。如果能给个进度条就万分感谢。我用webservice做,老是超时,麻烦帮个忙,给点代码,感谢。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 long count = 0;long mlength = 0;long bytelength = 0;FileStream fs = new FileStream(@"C:\demo.jpg", FileMode.Open, FileAccess.Read, FileShare.Read); byte[] buffers = Encoding.Default.GetBytes("File-Length:" + fs.Length.ToString()); m_socket.Send(buffers);Thread.Sleep(1000); while(fs.Position < fs.Length){ if(fs.Length - mlength >= 1024) { bytelength = 1024; } else { bytelength = fs.Length - mlength; } byte[] buffer = new byte[bytelength]; fs.Read(buffer, 0, buffer.Length); m_socket.Send(buffer); m_socket.Send(buffer, 0, buffer.Length, SocketFlags.None); Thread.Sleep(1000); count++; mlength += buffer.Length; if(fs.Position == fs.Length) { break; }}fs.Close(); 进度条的最大值就是文件的长度,每次发送完一个包,进度条就增加buffer.Length stonegoldaustin(特醇中南海) 非常感谢,能贴个接受方的代码吗?后台怎么把两个byte合并啊? 后台合并byte[]byte[][] s = new byte[3][];s[0] = new byte[1024];s[1] = new byte[2048];s[2] = new byte[4096];...byte[] u = unite(s);public byte[] unite(byte[][] source ){ int rank = source.GetLength(0); int sumlen=0; for(int i=0;i<rank;i++) { sumlen+=s[i].length; } byte[] sum= new byte[sumlen]; int place = 0; for(int i=0;i<rank;i++) { s[i].CopyTo(sum,place); place+=s[i].length; } return sum;}================================================================此帖通过csdn小助手回复。 CSDN小助手是使用vb.net编写的CSDN论坛脱机“外挂”,她能够在脱离IE的情况下使用Csdn论坛。程序只加载最核心的数据,所以显示更快,产生的流量更小。 下载地址:http://qqwwee.com/csdn.rar================================================================ FileStream recfs = new FileStream(clientList,FileMode.OpenOrCreate,FileAccess.Write);BinaryWriter newfilestr = new BinaryWriter(recfs);byte[] tmpbyte1 = new byte[1028];while(true){hostsocket.Receive(tmpbyte1);try{ byte[] sub = new byte[4];sub[0] = tmpbyte1[1024];sub[1] = tmpbyte1[1025];sub[2] = tmpbyte1[1026];sub[3] = tmpbyte1[1027];int sub1 = sub[0]*1000+sub[1]*100+sub[2]*10+sub[3];if(sub1 == 1024){newfilestr.Write(tmpbyte1,0,1024);tmpbyte1 = new byte[1028];}else{ newfilestr.Write(tmpbyte1,0,sub1);tmpbyte1 = new byte[1028];newfilestr.Flush();newfilestr.Close();recfs.Close();break;}} public delegate void SocketAccepted(Socket socket);public delegate void SocketInfoArrival(Socket socket, string infomation);public class cls_SocketServer{ public Socket sktMain; //主套接字 public Socket u_socket; private Thread trdMain; //主线程 private ManualResetEvent allDone = new ManualResetEvent(false); private const int bufSize = 1024; //缓冲大小 private byte[] received = new byte[bufSize]; //Byte缓冲 public event SocketAccepted socketaccepted; //接受连接事件 public event SocketInfoArrival socketinfoarrival; //文本数据到达事件 public cls_SocketServer(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType) { sktMain = new Socket(addressFamily, socketType, protocolType); } public void socketListen(int port) { //套接字进行监听 //参数表:port:进行监听的端口号 try { IPHostEntry m_local = Dns.Resolve(Dns.GetHostName()); IPEndPoint ipendPoint = new IPEndPoint(IPAddress.Parse(m_local.AddressList[0].ToString()), port); sktMain.Bind(ipendPoint); sktMain.Listen(20); trdMain = new Thread(new ThreadStart(MainThread)); trdMain.Start(); } catch(Exception ex) { Console.WriteLine(ex.ToString()); } } private void AsyncAccept(IAsyncResult ar) { //异步回调接受连接请求 try { allDone.Set(); Socket a_socket = (Socket)ar.AsyncState; Socket handle = a_socket.EndAccept(ar); u_socket = handle; Console.WriteLine(u_socket.Handle.ToString()); socketaccepted(handle); //进行异步接收数据 handle.BeginReceive(received, 0, bufSize, SocketFlags.None, new AsyncCallback(AsyncReceive), handle); } catch(Exception ex) { Console.WriteLine(ex.ToString()); } } private void AsyncReceive(IAsyncResult ar) { //异步回调接收数据 try { Socket r_socket = (Socket) ar.AsyncState; int read = r_socket.EndReceive(ar); if(read > 0) { string result = Encoding.Default.GetString(received); socketinfoarrival(r_socket, result); r_socket.BeginReceive(received, 0, received.Length, SocketFlags.None, new AsyncCallback(AsyncReceive), r_socket); } } catch(Exception ex) { Console.WriteLine(ex.ToString()); } } private void MainThread() { try { while(true) { allDone.Reset(); Console.WriteLine("Waiting For Connection. . ."); sktMain.BeginAccept(new AsyncCallback(AsyncAccept), sktMain); //进入监听状态 allDone.WaitOne(3000, true); } } catch(Exception ex) { Console.WriteLine(ex.ToString()); } } public void CloseSocket() { trdMain.Abort(); if(sktMain != null) { sktMain.Close(); } }} 如果发送的是文本的话,直接用AsyncReceive就可以了如果发送的二进制数据,改一下AsyncReceive,不用转string了,直接用byte数组存文件 控件拖动问题 C#链接多种数据库 VS2010 Database Project问题 datagrid分页导航 C#里面的数组排序函数 c#类型转换问题 图片定时转换功能如何实现?在线及等!!! 请各位大侠帮助解答下面的三个问题 c#中调用API函数MessageBox的问题 GDI绘图和多线程的问题 C#中的web的问题,显示数量的问题? 向SQL数据库中保存图片的问题。
long mlength = 0;
long bytelength = 0;FileStream fs = new FileStream(@"C:\demo.jpg", FileMode.Open, FileAccess.Read, FileShare.Read);
byte[] buffers = Encoding.Default.GetBytes("File-Length:" + fs.Length.ToString());
m_socket.Send(buffers);
Thread.Sleep(1000);
while(fs.Position < fs.Length)
{
if(fs.Length - mlength >= 1024)
{
bytelength = 1024;
}
else
{
bytelength = fs.Length - mlength;
}
byte[] buffer = new byte[bytelength];
fs.Read(buffer, 0, buffer.Length);
m_socket.Send(buffer);
m_socket.Send(buffer, 0, buffer.Length, SocketFlags.None);
Thread.Sleep(1000);
count++;
mlength += buffer.Length;
if(fs.Position == fs.Length)
{
break;
}
}
fs.Close();
byte[][] s = new byte[3][];
s[0] = new byte[1024];
s[1] = new byte[2048];
s[2] = new byte[4096];
...
byte[] u = unite(s);public byte[] unite(byte[][] source )
{
int rank = source.GetLength(0);
int sumlen=0;
for(int i=0;i<rank;i++)
{
sumlen+=s[i].length;
}
byte[] sum= new byte[sumlen];
int place = 0;
for(int i=0;i<rank;i++)
{
s[i].CopyTo(sum,place);
place+=s[i].length;
}
return sum;
}
================================================================
此帖通过csdn小助手回复。
CSDN小助手是使用vb.net编写的CSDN论坛脱机“外挂”,她能够在
脱离IE的情况下使用Csdn论坛。程序只加载最核心的数据,所以显示更
快,产生的流量更小。 下载地址:http://qqwwee.com/csdn.rar
================================================================
BinaryWriter newfilestr = new BinaryWriter(recfs);
byte[] tmpbyte1 = new byte[1028];
while(true)
{
hostsocket.Receive(tmpbyte1);
try
{
byte[] sub = new byte[4];
sub[0] = tmpbyte1[1024];
sub[1] = tmpbyte1[1025];
sub[2] = tmpbyte1[1026];
sub[3] = tmpbyte1[1027];
int sub1 = sub[0]*1000+sub[1]*100+sub[2]*10+sub[3];
if(sub1 == 1024)
{
newfilestr.Write(tmpbyte1,0,1024);
tmpbyte1 = new byte[1028];
}
else
{
newfilestr.Write(tmpbyte1,0,sub1);
tmpbyte1 = new byte[1028];
newfilestr.Flush();
newfilestr.Close();
recfs.Close();
break;
}
}
public delegate void SocketInfoArrival(Socket socket, string infomation);
public class cls_SocketServer
{
public Socket sktMain; //主套接字
public Socket u_socket; private Thread trdMain; //主线程
private ManualResetEvent allDone = new ManualResetEvent(false);
private const int bufSize = 1024; //缓冲大小
private byte[] received = new byte[bufSize]; //Byte缓冲 public event SocketAccepted socketaccepted; //接受连接事件
public event SocketInfoArrival socketinfoarrival; //文本数据到达事件
public cls_SocketServer(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType)
{
sktMain = new Socket(addressFamily, socketType, protocolType);
} public void socketListen(int port)
{
//套接字进行监听
//参数表:port:进行监听的端口号
try
{
IPHostEntry m_local = Dns.Resolve(Dns.GetHostName());
IPEndPoint ipendPoint = new IPEndPoint(IPAddress.Parse(m_local.AddressList[0].ToString()), port);
sktMain.Bind(ipendPoint);
sktMain.Listen(20);
trdMain = new Thread(new ThreadStart(MainThread));
trdMain.Start();
}
catch(Exception ex)
{
Console.WriteLine(ex.ToString());
}
} private void AsyncAccept(IAsyncResult ar)
{
//异步回调接受连接请求
try
{
allDone.Set();
Socket a_socket = (Socket)ar.AsyncState;
Socket handle = a_socket.EndAccept(ar);
u_socket = handle;
Console.WriteLine(u_socket.Handle.ToString());
socketaccepted(handle);
//进行异步接收数据
handle.BeginReceive(received, 0, bufSize, SocketFlags.None, new AsyncCallback(AsyncReceive), handle);
}
catch(Exception ex)
{
Console.WriteLine(ex.ToString());
}
} private void AsyncReceive(IAsyncResult ar)
{
//异步回调接收数据
try
{
Socket r_socket = (Socket) ar.AsyncState;
int read = r_socket.EndReceive(ar);
if(read > 0)
{ string result = Encoding.Default.GetString(received);
socketinfoarrival(r_socket, result);
r_socket.BeginReceive(received, 0, received.Length, SocketFlags.None, new AsyncCallback(AsyncReceive), r_socket);
}
}
catch(Exception ex)
{
Console.WriteLine(ex.ToString());
}
} private void MainThread()
{
try
{
while(true)
{
allDone.Reset();
Console.WriteLine("Waiting For Connection. . .");
sktMain.BeginAccept(new AsyncCallback(AsyncAccept), sktMain); //进入监听状态
allDone.WaitOne(3000, true);
}
}
catch(Exception ex)
{
Console.WriteLine(ex.ToString());
}
} public void CloseSocket()
{
trdMain.Abort();
if(sktMain != null)
{
sktMain.Close();
}
}
}