初学socket,socket不能接收多个客户端,怎么解决?

niit_zc 2009-12-20 02:03:37
服务器端与一个客户端交互没有问题,但再运行一个实例后,第二个实例与服务器没有反应
如果只运行一个实例,把客户端关掉以后再重新运行,服务端也没有反应
server端:

public class Server
{
static string data = "";
static void Main(string[] args)
{
ThreadStart ts = new ThreadStart(Listen);
Thread t = new Thread(ts);
t.Start();
}
public static void Listen()
{
IPEndPoint localpoint = new IPEndPoint(IPAddress.Any, 90);
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
listener.Bind(localpoint);
listener.Listen(100);

byte[] bytes;
Socket handler;
int bytesRec;

while (true)
{
Console.WriteLine("waiting for a connection ****");
handler = listener.Accept();
data = "";
while (true)
{
bytes = new byte[1024];

bytesRec = handler.Receive(bytes);
Console.WriteLine("数据是:" + bytesRec.ToString());
data = Encoding.Unicode.GetString(bytes, 0, bytesRec);
Console.WriteLine(data);
}
handler.Shutdown(SocketShutdown.Both);
handler.Close();
}
}
}

client端:

class Client
{
static void Main(string[] args)
{
IPAddress address = IPAddress.Parse("127.0.0.1");
IPEndPoint point = new IPEndPoint(address, 90);
Socket sc;
string data;
int bsent;
byte[] b;

sc = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.IP);
sc.Connect(point);
Console.Write("输入:");
while (true)
{
data = Console.ReadLine();
if (data == "exit")
{
sc.Shutdown(SocketShutdown.Both);
sc.Close();
return;
}
b = Encoding.Unicode.GetBytes(data);
bsent = sc.Send(b);
Console.WriteLine(Encoding.Unicode.GetString(b, 0, b.Length) + " has senden");
Console.Write("输入:");
}

}
}
...全文
309 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
supawei 2009-12-26
  • 打赏
  • 举报
回复
首先你的线程已经在处理一个客户端,所以无法在处理其他的连接请求了。除非你启动多个侦听线程。不过服务段一般是异步的。同步只适用于对性能要求不高的情况下。因为你不可能弄上几十上百的线程去运行,再牛的服务器也禁不住那样的开销。
不过,.net的异步有一个缺陷,就是在EndXXX (EndReceive, EndInvoke etc.)在被叫前,给出的缓存区是被钉死的,.net不可以回收那段内存。所以要预定出一块较大的内存用来作为缓存。否则内存很快就被分割成一小条一小条的。系统会在还有许多内存的情况下爆出内促不足的错误来。其次要设立一些机制已使得服务端能够及时释放被钉死缓存。这样才能保障服务健康运行。
TCP/IP并不是很容易,当然如果你只是写个小东西看似很轻松。但如果真作大家伙,真得把它的潜在机理摸清(简单套用msdn的例子是行不通的,那只不过是抛砖引玉的个小例子),否则出来的服务会漏洞百出的,搞不好一个月的启动好几次。所以如果能用Remoting,WCF等上层技术来解决问题,还是用上层的。毕竟底下的工作人家都给做好了。
cicigl 2009-12-26
  • 打赏
  • 举报
回复
多线程
zenjj 2009-12-25
  • 打赏
  • 举报
回复
帮顶
niit_zc 2009-12-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yangglemu 的回复:]
引用 1 楼 qldsrx 的回复:
我想知道你这代码哪里找来的,好糟糕啊。

你应该学会自己看MSDN,使用异步Socket操作是非常容易的,虽然微软提供了同步操作,但是服务器端就不应该使用同步方法来接受新连接,只有用异步方法才是稳中取稳的最可靠做法。


有谁学Socket是一上来就异步呢?

[/Quote]
哪有一上来就学异步的?呵呵!
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 qldsrx 的回复:]
我想知道你这代码哪里找来的,好糟糕啊。

你应该学会自己看MSDN,使用异步Socket操作是非常容易的,虽然微软提供了同步操作,但是服务器端就不应该使用同步方法来接受新连接,只有用异步方法才是稳中取稳的最可靠做法。
[/Quote]

有谁学Socket是一上来就异步呢?
周药师 2009-12-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 niit_zc 的回复:]
引用 6 楼 wushaokai 的回复:
服务端用多线程吧,这样肯定行,我做过的

具体在服务端怎么操作?
[/Quote]
我在4楼 的连接里 有你要的
niit_zc 2009-12-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wushaokai 的回复:]
服务端用多线程吧,这样肯定行,我做过的
[/Quote]
具体在服务端怎么操作?
wushaokai 2009-12-20
  • 打赏
  • 举报
回复
服务端用多线程吧,这样肯定行,我做过的
niit_zc 2009-12-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 qldsrx 的回复:]
我想知道你这代码哪里找来的,好糟糕啊。

你应该学会自己看MSDN,使用异步Socket操作是非常容易的,虽然微软提供了同步操作,但是服务器端就不应该使用同步方法来接受新连接,只有用异步方法才是稳中取稳的最可靠做法。
[/Quote]
我自己写的,呵呵,
我刚学socket,写的不好,但代码只要能运行就可以了
与多客户端通信只能用异步吗?同步多线程应该也可以吧
周药师 2009-12-20
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20080623/08/4bbd2475-45f1-42e3-a613-16b094759ade.html
hhc123 2009-12-20
  • 打赏
  • 举报
回复
不知道要说什么,去MSDN那看例子去吧
http://www.cnblogs.com/JimmyZhang/category/101698.html
这个里面写得很清楚
周药师 2009-12-20
  • 打赏
  • 举报
回复
在服务端做个多线程的
每次监听到客户端请求的时候
就开启一个线程来处理客户端的业务
qldsrx 2009-12-20
  • 打赏
  • 举报
回复
我想知道你这代码哪里找来的,好糟糕啊。

你应该学会自己看MSDN,使用异步Socket操作是非常容易的,虽然微软提供了同步操作,但是服务器端就不应该使用同步方法来接受新连接,只有用异步方法才是稳中取稳的最可靠做法。

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧