社区
C#
帖子详情
初学c#网络编程,多个客户端连接一个服务端的问题
newlju
2004-10-26 10:00:24
看到不少p2p的例子。但同时只能一个客户端连接到一个服务端,如果想要多个客户端能同时连接到一个服务端同时收发信息并且服务端能主动的向所有以连接的客户端发送信息要怎么作?就像那些c/s结构的聊天室一样。使用多线程?还是其它的什么技术?
...全文
328
5
打赏
收藏
初学c#网络编程,多个客户端连接一个服务端的问题
看到不少p2p的例子。但同时只能一个客户端连接到一个服务端,如果想要多个客户端能同时连接到一个服务端同时收发信息并且服务端能主动的向所有以连接的客户端发送信息要怎么作?就像那些c/s结构的聊天室一样。使用多线程?还是其它的什么技术?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
newlju
2004-10-26
打赏
举报
回复
看了daguzhang(MoonWell)的代码。好像是为每个socket事先创建一个实例和线程
便如果我有很多客户端连接呢。比如500、1000这样会不会消耗太多资源?
池化技术不太了解。能不能说清楚些?
xxdneu
2004-10-26
打赏
举报
回复
线程,和池化的线程技术
daguzhang
2004-10-26
打赏
举报
回复
看看下面的过程
public void Configuration()
{
try
{
Int32 port = 8088;
IPAddress localAddr =Dns.GetHostByName(Dns.GetHostName()).AddressList[0];//IPAddress.Parse("127.0.0.1");
ep = new IPEndPoint(localAddr,port);
serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
serverSocket.Bind(ep);
serverSocket.Listen(4);
MessageBox.Show("配制服务器成功!");
UsersName = new ArrayList(4);
serverExist = true;
this.menuItem2.Enabled = false;
this.menuItem3.Enabled = true;
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
SocketList = new ArrayList(4);
flag = 0;
for(int i=0;i<4;i++)
{
Socket ClientSocket = serverSocket.Accept();
SocketList.Add(ClientSocket);
ThreadStart myThreadDelegate = new ThreadStart(setListener);
Thread myThread = new Thread(myThreadDelegate);
myThread.Start();
}
}
public void setListener()
{
int CurrentSocketNo = flag;
flag++;
try
{
Socket ClientSocket = (Socket)SocketList[CurrentSocketNo];
IPEndPoint epClient = (IPEndPoint)ClientSocket.RemoteEndPoint;
string ClientIP = epClient.Address.ToString();
string ClientPort = epClient.Port.ToString();
String ClientInfo = "#NE->!";
byte[] NameData = new byte[1024];
int length = ClientSocket.Receive(NameData);
string ClientName = string.Empty;
ClientName = Encoding.Default.GetString(NameData,0,length);
UsersName.Add(ClientName);
for(int i=0; i<SocketList.Count;i++)
ClientInfo += "?#"+ (string)UsersName[i];
ClientInfo += "!" + (string)UsersName[CurrentSocketNo]+"! from "+ ClientIP + ":" + ClientPort + " entered!" + playerCounter.ToString();
NameData = new byte[1024];
NameData = Encoding.Default.GetBytes(ClientInfo);
foreach (Socket TempSocket in SocketList)
{
TempSocket.Send(NameData,0,NameData.Length,SocketFlags.None);
}
playerCounter++;
byte[] data;
while(true)
{
data = new byte[1024];
int count = ClientSocket.Receive(data);
string getString = Encoding.Default.GetString(data,0,count);
string[] dataInfo = getString.Split("&".ToCharArray());
if(count!=0)
{
if(dataInfo[0] != "#accept")
{
string revString = Encoding.Default.GetString(data,0,count);
revString = "a#" + revString;
data = new byte[1024];
data = Encoding.Default.GetBytes(revString);
foreach (Socket TempSocket in SocketList)
{
TempSocket.Send(data,0,data.Length,SocketFlags.None);
}
}
else
{
player.Add(dataInfo[1]);
string serverInfo = dataInfo[1] + "#is ready#" + playerCounter.ToString() + "#" + ClientIP + ClientPort ;
byte[] playInfo = new byte[1024];
playInfo = Encoding.Default.GetBytes(serverInfo);
foreach (Socket TempSocket in SocketList)
{
TempSocket.Send(playInfo,0,playInfo.Length,SocketFlags.None);
}
}
}
else
{
ClientInfo = "#NE->!";
UsersName.Remove(ClientName);
for(int i=0; i<UsersName.Count;i++)
ClientInfo += "?#"+ (string)UsersName[i];
ClientInfo += "!" + ClientName +"! from "+ ClientIP + ":" + ClientPort + " quit";
NameData = new byte[1024];
NameData = Encoding.Default.GetBytes(ClientInfo);
foreach (Socket TempSocket in SocketList)
{
if(TempSocket != ClientSocket)
TempSocket.Send(NameData,0,NameData.Length,SocketFlags.None);
}
ClientSocket.Shutdown(SocketShutdown.Both);
ClientSocket.Close();
SocketList.Remove(ClientSocket);
flag--;
break;
}
}
}
catch(SocketException ex)
{
MessageBox.Show(ex.ToString());
}
return;
}
private void menuItem2_Click(object sender, System.EventArgs e)
{
ThreadStart BeginListen = new ThreadStart(Configuration);
Thread myThread = new Thread(BeginListen);
myThread.Start();
}
wudixiaocaoren
2004-10-26
打赏
举报
回复
我看还是使用webservice吧,思路简单一点,哈哈,不知对不对。
eradium
2004-10-26
打赏
举报
回复
每一次,服务端accept客户端的连接之后,都会获取一个新的socket,这个socket就是对应这个客户和服务端的连接的,而原来Listen的那个socket继续listen。把这个socket,放到一个列表里面也可以,交给一个新的线程处理也可以。服务端对这些客户端对应的socket发消息就是对客户端发消息。调用所有的已连接的socket发消息,就是对所有已连接的客户端发消息。接收也一样。不过接收最好每个客户用单独的线程处理。
C#
的Ftp
服务端
+
客户端
源码
开源项目
C#
的Ftp
服务端
+
客户端
源码
C#
socket通信(
客户端
和
服务端
)
C#
socket通信(
客户端
和
服务端
),采用VS2013开发,打开既可以使用运行,每行代码都有注释讲解,对于想要快速掌握socket编程的学者很实用
c#
局域网聊天室
客户端
与
服务端
源代码
c#
网络编程
基础,对
初学
编写聊天软件很有用 其中包括
客户端
和服务器端的源代码。
C#
Socket编程 实现
客户端
与
服务端
通信
C#
Socket编程 实现
客户端
与
服务端
通信
C#
socket 发送
服务端
和
客户端
C#
socket 发送
服务端
和
客户端
一个
简单的socket
服务端
客户端
,学习下可以
C#
111,097
社区成员
642,554
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章