社区
C#
帖子详情
初学c#网络编程,多个客户端连接一个服务端的问题
newlju
2004-10-26 10:00:24
看到不少p2p的例子。但同时只能一个客户端连接到一个服务端,如果想要多个客户端能同时连接到一个服务端同时收发信息并且服务端能主动的向所有以连接的客户端发送信息要怎么作?就像那些c/s结构的聊天室一样。使用多线程?还是其它的什么技术?
...全文
370
5
打赏
收藏
初学c#网络编程,多个客户端连接一个服务端的问题
看到不少p2p的例子。但同时只能一个客户端连接到一个服务端,如果想要多个客户端能同时连接到一个服务端同时收发信息并且服务端能主动的向所有以连接的客户端发送信息要怎么作?就像那些c/s结构的聊天室一样。使用多线程?还是其它的什么技术?
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用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#
网络编程
我是
一个
初学
者,只是兴趣,由于工作上需要,要写一点
C#
网络通信的东西,以前从来没有用
C#
写过网络的东西, 写过一点简单的应用 。只写过DELPHI网络通信,而且还是用的INDY控件。所以才开始有一些不习惯,在网上搜索了一些资料,参看了MSDN,最后终于弄出一点,给
初学
者一点参考。我只是
初学
,代码有很多不规范之处,请见谅。
C#
网络通信需要两个引用,由于是WINFORM所以加上了线程引用
C#
基于WinForm的Socket通讯完整实现:
服务端
与
客户端
设计
Socket编程允许程序在网络中进行通信,是一种通过网络传输数据的有效手段。它属于操作系统内核的一部分,主要负责进程间通信(IPC),以及不同主机之间的数据交换。在
C#
中,Socket类库是通过.NET Framework提供的System.Net.Sockets命名空间进行访问的,可以实现TCP/IP和UDP/IP协议的数据交换。它广泛用于构建
客户端
-服务器应用程序,如聊天应用、文件共享服务以及远程过程调用等。
Socket
服务端
接受
多个
客户端
的
连接
(.NET)
本文模拟
一个
判断数据是否大于100的服务器端接受
多个
客户端
的
连接
,为
多个
客户端
提供服务的演示,例子比较简单,只为模拟一种场景,起到为入门读者踏入
网络编程
的指引 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Threading; using System.Net.Sockets; namespace Net.Dale.T
C#
实现局域网聊天室
客户端
与
服务端
源代码解析
C#
网络编程
是使用
C#
语言进行网络应用开发的重要环节。开发者利用.NET框架提供的丰富类库,能够实现网络数据的发送和接收,进而开发出支持
客户端
-服务器架构的应用程序。
C#
通过System.Net和System.Net.Sockets命名空间中的类来简化网络通信的实现。Socket,通常被称作“套接字”,在计算机
网络编程
中,是一种在计算机之间进行双向通信的端点。它是应用程序与网络协议之间的
一个
抽象层,允许应用之间进行数据交换。
C Socket通信
客户端
与
服务端
完整代码:掌握C
网络编程
的核心技巧
C#
Socket通信
客户端
与
服务端
完整代码:掌握
C#
网络编程
的核心技巧 去发现同类优质开源项目:https://gitcode.com/ 项目介绍
C#
Socket通信
客户端
与
服务端
完整代码项目,是
一个
基于
C#
语言的网络通信示例。该项目提供了从零开始的Socket编程实践,涵盖了
客户端
和
服务端
的全部代码,是学习
C#
网络编程
的绝佳资源。通过该项目,开发者能够深入理解Socket通信的原理,并在实...
C#
111,128
社区成员
642,534
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章