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);
}
}
}
}
}
我在互联网上搜索,但我真的不知道如何去做。
您需要使用线程来处理服务器端的客户端。
在这里你可以找到教程如何使服务器上线
http://csharp.net-informations.com/communications/csharp-multi-threaded-server-socket.htm
这是非常好的。
基本上。服务器正在监听while(true)循环时连接Server创建新线程来处理与客户端的通信。
如果您是初学者,我的好习惯是使用异步函数接收/发送数据以防止UI停止响应。像BeginConnect,EndConnect,BeginRecieve,EndRecieve函数。等
虽然您可以使用这种方式的线程,但对于少量客户端来说足够好,但它并不能很好地扩展。 – Matt 2014-11-23 21:03:58
连通的通插座 - 为例,您可以检查:
http://ludwigstuyck.wordpress.com/2012/09/21/communicating-through-sockets/
这就像一个快速启动的代码样本。
它不起作用...... SocketPacket有一些错误 – 2013-04-08 12:28:15
你在说什么错误? – 2013-04-08 12:30:22
visual studio无法识别socketPacket变量...我默认创建了一个类,但它仍然不起作用 – 2013-04-08 13:57:14
如果您打算使用自定义协议,请尝试[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