我做的是一个用Socket上传的功能,这边是服务端口的代码,文件上传完毕的时候,服务端的也会被关闭,但是第二次重新监听到的话就会报个错,图片在下面,求大神指教
public void burn()//服务器端
{
// 创建负责监听的套接字,注意其中的参数;
if (socketWatch != null)
{
socketWatch.Close();
}
socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 获得文本框中的IP对象;
IPAddress address = IPAddress.Parse(ServerIP);
// 创建包含ip和端口号的网络节点对象;
IPEndPoint endPoint = new IPEndPoint(address, 9777);
try
{
// 将负责监听的套接字绑定到唯一的ip和端口上;
socketWatch.Bind(endPoint);
}
catch (SocketException se)
{
}
// 设置监听队列的长度;
socketWatch.Listen(11);
// 创建负责监听的线程;
Thread.Sleep(5000);
threadWatch = new Thread(WatchConnecting);
threadWatch.IsBackground = true;
threadWatch.Start();
}
/// <summary>
/// 监听客户端请求的方法;
/// </summary>
public void WatchConnecting()
{
while (true) // 持续不断的监听客户端的连接请求;
{
try
{
// 开始监听客户端连接请求,Accept方法会阻断当前的线程;
Socket sokConnection = socketWatch.Accept(); // 一旦监听到一个客户端的请求,就返回一个与该客户端通信的 套接字;
if (sokConnection.Available <= 0) continue;
// 将与客户端连接的 套接字 对象添加到集合中;
socketip = sokConnection.RemoteEndPoint.ToString();
dict.Add(sokConnection.RemoteEndPoint.ToString(), sokConnection);
RecMsg();
}
catch (SocketException ex)
{
socketWatch.Close();
}
}
}
public void RecMsg()
{
//while (true)
//{
int length = -1;
byte[] arrMsgRec = new byte[1024];
try
{
length = dict[socketip].Receive(arrMsgRec); // 接收数据,并返回数据的长度;
int le = Convert.ToInt16(arrMsgRec[1]);
string[] msg = Encoding.UTF8.GetString(arrMsgRec, 2, le).Split(',');
count = Convert.ToInt64(msg[1]);
statername = msg[0];
fs = new FileStream(FileFolder + StrFileName, FileMode.Append, FileAccess.Write);
byte[] arrtext = new byte[8192];
Getfileszie = 0;
while (Getfileszie < count)
{
try
{
length = dict[socketip].Receive(arrtext); // 接收数据,并返回数据的长度;
Getfileszie = length + Getfileszie;
try
{
fs.Write(arrtext, 0, length);
}
catch (Exception x)
{
//Function.WriteLog(0, "********************************异常xxx:" + x.Message + "********************************");
}
}
catch (Exception x)
{
//Function.WriteLog("********************************异常接收数据:" + x.Message + "********************************");
}
}
}
catch (SocketException se)
{
return;
}
finally
{
dict[socketip].Close();
if (dict.ContainsKey(socketip))
{
dict.Remove(socketip);
}
}
//}
}
Socket 上传功能 单例的话应该怎么实例化 --------------------编程问答-------------------- 代码不是这么写的, 上MSDN找一个完整的例子看看吧。 --------------------编程问答-------------------- 程序里面的socketip变量是全局变量吧
--------------------编程问答-------------------- 你最好将RecMsg()
放在一个新的线程里执行,并将套接字传递给它,而不是把套接字放在集合里 --------------------编程问答-------------------- socketip变量是全局变量的 --------------------编程问答-------------------- 为了实现功能,最直接就是重新new一个 --------------------编程问答-------------------- 应该这样才对,上代码吧
/// <summary>
/// 监听客户端请求的方法;
/// </summary>
public void WatchConnecting()
{
while (true) // 持续不断的监听客户端的连接请求;
{
try
{
Socket socket = _tcpListener.Accept();//接收客户端的连接
int receiveCount = 0;
while (receiveCount < byteLength)
{
int iTemp = socket.Receive(buff, receiveCount, byteLength - receiveCount, SocketFlags.None);//接收数据
if (iTemp == 0) break;
receiveCount += iTemp;
}
Thread receiveThread = new Thread(new ParameterizedThreadStart(ReceiveWorkThread));
receiveThread.IsBackground = true;
receiveThread.Start(buff);
try
{
//关闭连接
socket.Shutdown(SocketShutdown.Both);
if (socket.Connected)
{
socket.Close();
}
}
catch { }
}
catch{}
}
}
ReceiveWorkThread中再去处理你收到的内容。
补充:.NET技术 , C#