服务器端与一个客户端交互没有问题,但再运行一个实例后,第二个实例与服务器没有反应
如果只运行一个实例,把客户端关掉以后再重新运行,服务端也没有反应
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("输入:");
}
}
}
如果只运行一个实例,把客户端关掉以后再重新运行,服务端也没有反应
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("输入:");
}
}
}
http://www.cnblogs.com/JimmyZhang/category/101698.html
这个里面写得很清楚
我刚学socket,写的不好,但代码只要能运行就可以了
与多客户端通信只能用异步吗?同步多线程应该也可以吧
有谁学Socket是一上来就异步呢?
不过,.net的异步有一个缺陷,就是在EndXXX (EndReceive, EndInvoke etc.)在被叫前,给出的缓存区是被钉死的,.net不可以回收那段内存。所以要预定出一块较大的内存用来作为缓存。否则内存很快就被分割成一小条一小条的。系统会在还有许多内存的情况下爆出内促不足的错误来。其次要设立一些机制已使得服务端能够及时释放被钉死缓存。这样才能保障服务健康运行。
TCP/IP并不是很容易,当然如果你只是写个小东西看似很轻松。但如果真作大家伙,真得把它的潜在机理摸清(简单套用msdn的例子是行不通的,那只不过是抛砖引玉的个小例子),否则出来的服务会漏洞百出的,搞不好一个月的启动好几次。所以如果能用Remoting,WCF等上层技术来解决问题,还是用上层的。毕竟底下的工作人家都给做好了。