这个是我根据别人的代码得到的http://www.cnblogs.com/jeriffe/articles/1407603.html foreach (DictionaryEntry de in hashTable)
{
client.Send(e.Buffer, e.BytesTransferred, SocketFlags.None); //发送数据
////**** ///这里该怎么写 能给所有连接发信息
/////*******
}
这里该怎么写 把得到的连接 群发信息,这个地方该怎么写,谢谢各位了,这个部分没有接触过,请高人指点
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.Collections;
namespace ConsoleApplication1
{
class Program
{//http://www.cnblogs.com/jeriffe/articles/1407603.html
static void Main(string[] args)
{
EchoServer server = new EchoServer(new IPEndPoint(IPAddress.Any, 8888));
//EchoServer server = new EchoServer(new IPEndPoint(IPAddress.Any, 8888));
Console.ReadKey(); }
}
public class EchoServer
{
Socket server;
public Hashtable hashTable;
public EchoServer(IPEndPoint localPoint)
{
server = new Socket(localPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); server.Bind(localPoint);
server.Listen(5);
Console.WriteLine("Server is bind on {0}", server.LocalEndPoint);
accept_async();
} private void accept_async()
{
var accept = new SocketAsyncEventArgs();
accept.Completed += accept_Completed;
server.AcceptAsync(accept);
} void accept_Completed(object sender, SocketAsyncEventArgs e)
{
accept_async(); var client = e.AcceptSocket;
Console.WriteLine("Socket:{0} connection:{1}", e.AcceptSocket.RemoteEndPoint, "服务器");
Hashtable hashTable = new Hashtable();
hashTable.Add("1" + e.AcceptSocket.RemoteEndPoint, e.AcceptSocket);
e.Completed -= accept_Completed;
e.Completed += receive_Completed; var buffer = new byte[1024];
e.SetBuffer(buffer, 0, buffer.Length); client.ReceiveAsync(e); foreach (DictionaryEntry de in hashTable)
{
Console.WriteLine(de.Key);//de.Key对应于key/value键值对key
Console.WriteLine(de.Value);//de.Key对应于key/value键值对value
}
//Client.
Console.WriteLine("*********" + e.AcceptSocket.RemoteEndPoint);
} void receive_Completed(object sender, SocketAsyncEventArgs e)
{
var client = sender as Socket;
if (e.BytesTransferred == 0)
{
Console.WriteLine("socket is closed");
client.Close();
}
else
{
client.ReceiveAsync(e);//接到数据
string message = Encoding.GetEncoding("gb2312").GetString(e.Buffer, 0, e.BytesTransferred);//获取接收到的数据
// string message = Encoding.Unicode.GetString(e.Buffer, 0, e.BytesTransferred);//获取接收到的数据
Console.WriteLine("Socket:{0} send message:{1}", client.Handle, message);
// string sent=string.Format("{0} bytes has been received",e.BytesTransferred); string sent = string.Format("{0} bytes has been received", message);
client.Send(e.Buffer, e.BytesTransferred, SocketFlags.None); //发送数据
Console.WriteLine("Sent {0} bytes data to socket:{1}", e.BytesTransferred, client.Handle);
} foreach (DictionaryEntry de in hashTable)
{
client.Send(e.Buffer, e.BytesTransferred, SocketFlags.None); //发送数据
////**** ///这里该怎么写 能给所有连接发信息
/////*******
}
}
}
}
{
client.Send(e.Buffer, e.BytesTransferred, SocketFlags.None); //发送数据
////**** ///这里该怎么写 能给所有连接发信息
/////*******
}
这里该怎么写 把得到的连接 群发信息,这个地方该怎么写,谢谢各位了,这个部分没有接触过,请高人指点
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.Collections;
namespace ConsoleApplication1
{
class Program
{//http://www.cnblogs.com/jeriffe/articles/1407603.html
static void Main(string[] args)
{
EchoServer server = new EchoServer(new IPEndPoint(IPAddress.Any, 8888));
//EchoServer server = new EchoServer(new IPEndPoint(IPAddress.Any, 8888));
Console.ReadKey(); }
}
public class EchoServer
{
Socket server;
public Hashtable hashTable;
public EchoServer(IPEndPoint localPoint)
{
server = new Socket(localPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); server.Bind(localPoint);
server.Listen(5);
Console.WriteLine("Server is bind on {0}", server.LocalEndPoint);
accept_async();
} private void accept_async()
{
var accept = new SocketAsyncEventArgs();
accept.Completed += accept_Completed;
server.AcceptAsync(accept);
} void accept_Completed(object sender, SocketAsyncEventArgs e)
{
accept_async(); var client = e.AcceptSocket;
Console.WriteLine("Socket:{0} connection:{1}", e.AcceptSocket.RemoteEndPoint, "服务器");
Hashtable hashTable = new Hashtable();
hashTable.Add("1" + e.AcceptSocket.RemoteEndPoint, e.AcceptSocket);
e.Completed -= accept_Completed;
e.Completed += receive_Completed; var buffer = new byte[1024];
e.SetBuffer(buffer, 0, buffer.Length); client.ReceiveAsync(e); foreach (DictionaryEntry de in hashTable)
{
Console.WriteLine(de.Key);//de.Key对应于key/value键值对key
Console.WriteLine(de.Value);//de.Key对应于key/value键值对value
}
//Client.
Console.WriteLine("*********" + e.AcceptSocket.RemoteEndPoint);
} void receive_Completed(object sender, SocketAsyncEventArgs e)
{
var client = sender as Socket;
if (e.BytesTransferred == 0)
{
Console.WriteLine("socket is closed");
client.Close();
}
else
{
client.ReceiveAsync(e);//接到数据
string message = Encoding.GetEncoding("gb2312").GetString(e.Buffer, 0, e.BytesTransferred);//获取接收到的数据
// string message = Encoding.Unicode.GetString(e.Buffer, 0, e.BytesTransferred);//获取接收到的数据
Console.WriteLine("Socket:{0} send message:{1}", client.Handle, message);
// string sent=string.Format("{0} bytes has been received",e.BytesTransferred); string sent = string.Format("{0} bytes has been received", message);
client.Send(e.Buffer, e.BytesTransferred, SocketFlags.None); //发送数据
Console.WriteLine("Sent {0} bytes data to socket:{1}", e.BytesTransferred, client.Handle);
} foreach (DictionaryEntry de in hashTable)
{
client.Send(e.Buffer, e.BytesTransferred, SocketFlags.None); //发送数据
////**** ///这里该怎么写 能给所有连接发信息
/////*******
}
}
}
}
这个不都发过了嘛这个只是发送给该连接的客户端若是你想发送给所有客户端消息,那么你需要在服务器做一个列表,用来存放这些连接这样你就对任意个客户端发送消息了。
foreach (DictionaryEntry de in hashTable)
{
client.Send(e.Buffer, e.BytesTransferred, SocketFlags.None); //发送数据
////**** ///这里该怎么写 能给所有连接发信息
/////*******
} 上面只能给当前连接发 , 该怎么写给所有连接发
client.Send(e.Buffer, e.BytesTransferred, SocketFlags.None); //发送数据 这里不知道怎么写
在这个事件处理函数写发送,是当收到客户端来的消息后,被动发送的不知你什么时候需要发送消息到所有客户端。
若是需要主动发送,
那么再写一个发送方法。(简单的示例)
bool SendAll(byte[] msg){
foreach (DictionaryEntry de in hashTable)
{
client.Send(msg, msg.Length, SocketFlags.None); //发送数据
} }
不然找不到的哦。
foreach (DictionaryEntry de in hashTable)
{
client.Send(msg, msg.Length, SocketFlags.None); //发送数据
} }msg 传字符吗” 如消息这样的吗。 哪个套接字 ,我那样保存没有问题吧 ,一会测试下
List<SocketAsyncEventArgs> asyncArgs = new List<SocketAsyncEventArgs>()
然后当连接进来时,修改accept_async() 函数如下:
private void accept_async()
{
var accept = new SocketAsyncEventArgs();
asyncArgs.Add(accept);//记录新建的连接。
accept.Completed += accept_Completed;
server.AcceptAsync(accept);
}
最后在SocketAsyncEventArgs中断时,从asyncArgs列表中将其移出。不过现在有个问题,就单从你参照的那个例子来说,是不完善的,因为只有receive_Completed而没有send_Completed,显然你这里要发送数据,没有设置send_Completed将不知道是否发送成功。连接中断可以从是否发送成功来判别,但是这里没有给那个余地,是不对的。此外这代码还有一个最大的问题,使用SocketAsyncEventArgs并不保证当前操作是同步或者是异步的,这个看实际情况,所以代码中需要分别对待,对两种情况分别处理,这在MSDN上有详细例子可参照的。
居然把同步和异步方法混用,接收用ReceiveAsync,发送却用Send,这显然是半吊子做法,既然要用新的SocketAsyncEventArgs,那发送就应该使用SendAsync来发送才对。