C#中的单个服务器/多个客户端#

C#中的单个服务器/多个客户端#

问题描述:

我是C#编程新手。到目前为止,我有一台服务器/单个客户端,但我需要将它变成一台服务器/多个客户端。这里是我的代码:C#中的单个服务器/多个客户端#

TankServer

 using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Threading.Tasks; 
    using System.Net; 
    using System.Net.Sockets; 
    using System.Threading; 

    namespace TankServer 
    { 
     class Program 
    { 
     static Socket sck; 
     static Socket acc; 
     static int port = 1700; 
     static IPAddress ip; 
     static Thread rec; 
     static string name; 

     static string GetIp() 
     { 
      string strHostName = System.Net.Dns.GetHostName(); 
      IPHostEntry ipEntry = System.Net.Dns.GetHostEntry(strHostName); 
      IPAddress[] addr = ipEntry.AddressList; 
      return addr[addr.Length - 1].ToString(); 
     } 


     static void recV() 
     { 
      while (true) 
      { 
       Thread.Sleep(500); 
       byte[] Buffer = new byte[255]; 
       int rec = acc.Receive(Buffer, 0, Buffer.Length, 0); 
       Array.Resize(ref Buffer, rec); 
       Console.WriteLine(Encoding.Default.GetString(Buffer)); 
      } 
     } 

     static void Main(string[] args) 
     { 
      rec = new Thread(recV); 
      Console.WriteLine("Your Local Ip is : " + GetIp()); 
      Console.WriteLine("Please enter yout name"); 
      name = Console.ReadLine(); 
      Console.WriteLine("Please Enter Your Host Port"); 
      string inputPort = Console.ReadLine(); 
      try { port = Convert.ToInt32(inputPort); } 
      catch { port = 1700; } 

      ip=IPAddress.Parse(GetIp()); 
      sck= new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); 
      sck.Bind(new IPEndPoint(ip, port)); 
      sck.Listen(0); 
      acc=sck.Accept(); 
      rec.Start(); 

      while(true){ 
       byte[] sdata=Encoding.ASCII.GetBytes("<"+name+">"+Console.ReadLine()); 
       acc.Send(sdata,0,sdata.Length,0); 
      } 
     } 
    } 
} 

TankClient

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Net; 
using System.Net.Sockets; 
using System.Threading; 

namespace TankClient 
{ 
    class Program 
    { 
    static string name = ""; 
    static int port = 1700; 
    static IPAddress ip; 
    static Socket sck; 
    static Thread rec; 

    static void recV() 
    { 
     while (true) 
     { 
      Thread.Sleep(500); 
      byte[] Buffer = new byte[255]; 
      int rec = sck.Receive(Buffer, 0, Buffer.Length, 0); 
      Array.Resize(ref Buffer, rec); 
      Console.WriteLine(Encoding.Default.GetString(Buffer)); 
     } 
    } 

    static void Main(string[] args) 
    { 

     rec = new Thread(recV); 
     while(true){ 
     Console.WriteLine("Please enter your name"); 
     name = Console.ReadLine(); 
     Console.WriteLine("Please enter the ip of the server"); 
     ip = IPAddress.Parse(Console.ReadLine()); 
     Console.WriteLine("Please Enter The Port"); 
     string inputPort = Console.ReadLine(); 
     try { port = Convert.ToInt32(inputPort); } 
     catch { port = 1700; } 

     sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     sck.Connect(new IPEndPoint(ip, port)); 
     rec.Start(); 
     byte[] conmsg = Encoding.Default.GetBytes("<" + name + ">" + "Connected"); 
     sck.Send(conmsg, 0, conmsg.Length, 0); 

     while (sck.Connected) 
     { 
      byte[] sdata = Encoding.Default.GetBytes("<" + name + ">"+Console.ReadLine()); 
      sck.Send(sdata, 0, sdata.Length, 0); 
     } 
    } 
    } 
} 
    } 

我在互联网上搜索,但我真的不知道如何去做。

+0

如果您打算使用自定义协议,请尝试[ZeroMQ](http://www.zeromq.org/)的一个端口[netmq](https://github.com/zeromq/netmq)到。净。尽管有这个名字,ZeroMQ更多的是关于[IPC](http://en.wikipedia.org/wiki/Inter-process_communication)而不是关于队列。 – 2013-04-08 11:55:23

您需要使用线程来处理服务器端的客户端。

在这里你可以找到教程如何使服务器上线

http://csharp.net-informations.com/communications/csharp-multi-threaded-server-socket.htm

这是非常好的。

基本上。服务器正在监听while(true)循环时连接Server创建新线程来处理与客户端的通信。

如果您是初学者,我的好习惯是使用异步函数接收/发送数据以防止UI停止响应。像BeginConnect,EndConnect,BeginRecieve,EndRecieve函数。等

+0

虽然您可以使用这种方式的线程,但对于少量客户端来说足够好,但它并不能很好地扩展。 – Matt 2014-11-23 21:03:58

连通的通插座 - 为例,您可以检查:

http://ludwigstuyck.wordpress.com/2012/09/21/communicating-through-sockets/

这就像一个快速启动的代码样本。

+0

它不起作用...... SocketPacket有一些错误 – 2013-04-08 12:28:15

+0

你在说什么错误? – 2013-04-08 12:30:22

+0

visual studio无法识别socketPacket变量...我默认创建了一个类,但它仍然不起作用 – 2013-04-08 13:57:14