我在套接字编程中创建了一个简单的应用程序我认为这是实现这一目标的简单方法。所以这就是我分享这个的原因。 在此程序中,您可以创建服务器程序和客户端程序。您还可以从客户端和服务器发送和接收消息。 这是我的代码
服务器程序: -
class Program
{
private const int port = 4532;
static void Main(string[] args)
{
IPEndPoint ip = new IPEndPoint(IPAddress.Any, 4532);
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Bind(ip);
socket.Listen(10);
Console.WriteLine("Waiting for client");
Socket client = socket.Accept();
IPEndPoint clientIP = (IPEndPoint)client.RemoteEndPoint;
Console.WriteLine(" >> Connected with" + clientIP.Address + "at port" + clientIP.Port);
Console.WriteLine(" >> Accept connection from client");
string welcome = "Welcome";
byte[] data = new byte[1024];
data = Encoding.ASCII.GetBytes(welcome);
client.Send(data, data.Length, SocketFlags.None);
Console.WriteLine("......");
Console.Read();
}
}
客户计划:
class Program
{
static void Main(string[] args)
{
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 4532);
Console.WriteLine("Client Started");
try
{
socket.Connect(ip);
}
catch(SocketException e)
{
Console.WriteLine("Enable to connect");
}
Console.WriteLine("Conneted to server");
byte[] data = new byte[1024];
int receivedata = socket.Receive(data);
string stringdata = Encoding.ASCII.GetString(data, 0, receivedata);
Console.WriteLine(stringdata);
Console.Read();
}
}
答案 0 :(得分:1)
嗯,这不完全正确。
请注意,Encoding.ASCII.GetBytes
每次都会为您提供一个新数组,因此new byte[1024]
初始化毫无价值,如果字符串较大,数组可能会更大。
如果服务器发送的有效负载超过1024,会发生什么?客户端将截断消息,如果您使用XML或JSON等结构化数据格式,则会导致序列化错误。在TCP通信中,您需要定义一个协议来构建数据,以便您的代码可以确定消息何时开始或结束,例如每行一条消息或更复杂的消息,如WebSocket框架。
请注意,服务器只接受一个客户端,发送欢迎信息并卡在Console.Read
中。它应该在循环中侦听更多客户端,并为每个连接的客户端启动新线程或使用异步操作。对于客户端来说,它应该循环监听消息。
考虑使用async / await来进一步扩展您的示例。生产就绪的TCP服务器需要多线程才能正确扩展。
看看这个asynchronous TCP server and client的例子,不是生产就绪,但足以用于缓冲区读取和异步操作的概念验证。