社区
C#
帖子详情
初学c#网络编程,多个客户端连接一个服务端的问题
newlju
2004-10-26 10:00:24
看到不少p2p的例子。但同时只能一个客户端连接到一个服务端,如果想要多个客户端能同时连接到一个服务端同时收发信息并且服务端能主动的向所有以连接的客户端发送信息要怎么作?就像那些c/s结构的聊天室一样。使用多线程?还是其它的什么技术?
...全文
331
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
服务端
+
客户端
源码
通过该项目,开发者可以深入地了解和掌握FTP
服务端
和
客户端
的开发流程,同时提升自己在
C#
编程和网络通信方面的能力。此外,该项目的存在也促进了技术社区的交流和合作,推动了开源文化的发展,对于整个软件开发行业...
C#
socket通信(
客户端
和
服务端
)
服务器端可以使用异步编程模型,如BeginAccept()和EndAccept()方法,来处理
多个
客户端
同时
连接
的情况。这样,服务器可以在不阻塞主线程的情况下,接受新的
连接
并处理数据。
C#
的Socket通信还涉及异常处理,因为网络...
c#
局域网聊天室
客户端
与
服务端
源代码
通常会创建
一个
新的线程来处理每个
客户端
连接
,以确保
服务端
能同时处理
多个
客户端
。 - **数据收发**:
服务端
通过`Receive()`和`Send()`方法与
客户端
交换数据。需要注意的是,由于网络的异步特性,需要适当处理数据...
C#
Socket编程 实现
客户端
与
服务端
通信
在IT行业中,网络通信是不可或缺的一部分,而
C#
语言提供了强大的Socket编程能力,使得开发者能够构建
客户端
和
服务端
应用,实现高效、稳定的数据交换。本文将深入探讨如何利用
C#
进行Socket编程,实现
客户端
与
服务端
的...
C#
socket 发送
服务端
和
客户端
本示例“
C#
socket 发送
服务端
和
客户端
”旨在帮助
初学
者理解如何使用
C#
进行基于TCP协议的Socket编程,搭建
一个
简单的
服务端
和
客户端
应用。以下是关于这个主题的详细知识点: 1. **Socket基本概念**: Socket,通常...
C#
111,112
社区成员
642,554
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章