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

时间:2013-04-08 11:47:22

标签: 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);
        }
    }
  }
 }
  }

我在互联网上搜索,但我真的不明白该怎么做。

2 个答案:

答案 0 :(得分:2)

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

在这里,您可以找到如何在线程上创建服务器的教程

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

非常好。

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

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

答案 1 :(得分:0)

通过套接字进行通信 - 例如,您可以查看:

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

这就像代码示例的快速入门一样。