c sharp socket编程简单例子
Socket programming simple example in c sharp
我在套接字编程中创建了一个简单的应用程序。我认为这是实现这一目标的简单方法。所以这就是我分享这个的原因。
在这个程序中你可以创建服务器程序和客户端程序。您还可以从客户端和服务器发送和接收消息。
这是我的代码
服务器程序:-
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();
}
}
嗯,这并不完全正确。
注意Encoding.ASCII.GetBytes
每次都会给你一个新的数组,所以new byte[1024]
初始化是没有价值的,如果字符串更大,数组可能更大。
如果服务器发送超过 1024 的负载会怎样?如果您使用 XML 或 JSON 等结构化数据格式,客户端将截断消息,这将导致序列化错误。在 TCP 通信中,您需要定义一个协议来构建数据,以一种您的代码可以确定消息何时开始或结束的方式,例如每行一条消息或更复杂的东西,如 WebSocket 框架。
请注意,服务器将只接受一个客户端,发送欢迎并卡在 Console.Read
。它应该在一个循环中监听更多的客户端,并为每个连接的客户端启动一个新线程或使用异步操作。客户端也一样,它应该循环监听消息。
考虑 async/await 进一步扩展您的示例。生产就绪的 TCP 服务器需要多线程才能适当扩展。
看看这个 asynchronous TCP server and client 的示例,尚未准备好生产,但足以证明缓冲区读取和异步操作的概念。
我在套接字编程中创建了一个简单的应用程序。我认为这是实现这一目标的简单方法。所以这就是我分享这个的原因。 在这个程序中你可以创建服务器程序和客户端程序。您还可以从客户端和服务器发送和接收消息。 这是我的代码
服务器程序:-
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();
}
}
嗯,这并不完全正确。
注意Encoding.ASCII.GetBytes
每次都会给你一个新的数组,所以new byte[1024]
初始化是没有价值的,如果字符串更大,数组可能更大。
如果服务器发送超过 1024 的负载会怎样?如果您使用 XML 或 JSON 等结构化数据格式,客户端将截断消息,这将导致序列化错误。在 TCP 通信中,您需要定义一个协议来构建数据,以一种您的代码可以确定消息何时开始或结束的方式,例如每行一条消息或更复杂的东西,如 WebSocket 框架。
请注意,服务器将只接受一个客户端,发送欢迎并卡在 Console.Read
。它应该在一个循环中监听更多的客户端,并为每个连接的客户端启动一个新线程或使用异步操作。客户端也一样,它应该循环监听消息。
考虑 async/await 进一步扩展您的示例。生产就绪的 TCP 服务器需要多线程才能适当扩展。
看看这个 asynchronous TCP server and client 的示例,尚未准备好生产,但足以证明缓冲区读取和异步操作的概念。