一、基本语法
服务器端示例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace Socket服务器端
{
class Program
{
static void Main(string[] args)
{
Socket TcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ipaddress = new IPAddress(new byte[]{ 192,168,0,113});
EndPoint endPoint = new IPEndPoint(ipaddress, 230);
TcpServer.Bind(endPoint);//向操作系统申请一个可用的ip和端口号 用来通信
TcpServer.Listen(100);//参数是最大连接数
Socket clientSocket = TcpServer.Accept();//暂停当前线程,直到有一个客户端连接进来,之后进行下面的代码
//下面使用返回的Socket做通信。
Console.WriteLine( clientSocket.RemoteEndPoint.ToString());//输出客户端ip和端口
byte[] sendbyte = new byte[1024];
byte[] recebyte = new byte[1024];
string sendString = "你好啊";
sendbyte = Encoding.UTF8.GetBytes(sendString);//对字符串做编码,得到一个字符串的字节数组。
clientSocket.Send(sendbyte);
int length = clientSocket.Receive(recebyte);
Console.WriteLine(Encoding.UTF8.GetString(recebyte, 0, length));
Console.ReadKey();
}
}
}
客户端示例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace Socket客户端
{
class Program
{
static void Main(string[] args)
{
Socket TcpClient = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
IPAddress ipAddress = IPAddress.Parse("192.168.0.113");
EndPoint EP = new IPEndPoint(ipAddress, 230);
TcpClient.Connect(EP);
byte[] data = new byte[1024];
int length = TcpClient.Receive(data);
string message = Encoding.UTF8.GetString(data, 0, length);
Console.WriteLine(message);
message = Console.ReadLine();
data = Encoding.UTF8.GetBytes(message);
TcpClient.Send(data);
Console.ReadKey();
}
}
}
二、一主多从,接受多个客户端信息示例
class Program
{
static List<Client> ClientMange = new List<Client>();
public static void BordCastMessage(string message)
{
var UnConntct = new List<Client>();
foreach(var i in ClientMange)
{
if(i.isConnect == true)
{
i.SendMassage(message);
}
else
{
UnConntct.Add(i);
}
}
foreach(var i in UnConntct)
{
ClientMange.Remove(i);
}
}
static void Main(string[] args)
{
Socket TcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
TcpServer.Bind(new IPEndPoint(IPAddress.Parse("192.168.0.113"), 2233));
TcpServer.Listen(100);
Console.WriteLine("连接监听开始");
while (true)
{
Socket Client_Socket = TcpServer.Accept();
Console.WriteLine("有一个客户端进入");
Client client = new Client(Client_Socket);
ClientMange.Add(client);
}
Console.ReadKey();
Console.ReadKey();
}
}
class Client
{
Socket Client_Socket;
Thread T;
byte[] ReceData;
byte[] SendData;
public bool isConnect;
int length;
public Client(Socket s)
{
ReceData = new byte[1024];
SendData = new byte[1024];
Client_Socket = s;
isConnect = true;
T = new Thread(Message_Dispose);
T.Start();
}
void Message_Dispose()
{
while (true)
{
try
{
length = Client_Socket.Receive(ReceData);
}
catch(System.Net.Sockets.SocketException e)
{
Console.WriteLine(e.ToString());
break;
}
//if (Client_Socket.Poll(10,SelectMode.SelectRead)) break;
if (length != 0)
{
Console.WriteLine("有消息" + "|" + Encoding.UTF8.GetString(ReceData, 0, length) + "|" + length.ToString());
Program.BordCastMessage(Encoding.UTF8.GetString(ReceData));
}
else
{
isConnect = false;
break;
}
}
}
public void SendMassage(string message)
{
SendData = Encoding.UTF8.GetBytes(message);
Client_Socket.Send(SendData);
}
}
重点在于死循环接受客户端连接,使用客户端类包装sokect,再用集合管理客户端实列。
将客户端的消息分发给每个客户端,使用交叉调用的方式。(在客户端类的函数中调用->program类的函数,而这个program类的函数本身又调用客户端的函数).
三、TcpListener TcpClient UdpClient
TcpListener
static void Main(string[] args)
{
TcpListener Listener = new TcpListener(new IPEndPoint(IPAddress.Parse("192.168.0.113"), 2333));
Listener.Start();
TcpClient tcpClient = Listener.AcceptTcpClient();
Console.WriteLine("有一个客户端连接");
NetworkStream stream = tcpClient.GetStream();
byte[] data = new byte[1024];
int length;
while (true)
{
try
{
length = stream.Read(data, 0, 1024);
}
catch
{
Console.WriteLine("客户中断了连接");
break;
}
Console.WriteLine(Encoding.UTF8.GetString(data,0 ,length));
}
stream.Close();
tcpClient.Close();
Listener.Stop();
Console.WriteLine("资源释放完成");
Console.ReadKey();
}
}
TcpClient
class Program
{
static void Main(string[] args)
{
string message;
byte[] data = new byte[1024];
TcpClient tcpClient = new TcpClient();
tcpClient.Connect(new IPEndPoint(IPAddress.Parse("192.168.0.113"), 2333));
NetworkStream stream = tcpClient.GetStream();
while (true)
{
message = Console.ReadLine();
data = Encoding.UTF8.GetBytes(message);
stream.Write(data, 0, data.Length);
}
tcpClient.Close();
stream.Close();
}
}
UdpClient
UdpClient server = new UdpClient(new IPEndPoint(IPAddress.Parse("192.168.0.113"), 2333));
IPEndPoint client = new IPEndPoint(IPAddress.Any, 0);
byte[] data = server.Receive(ref client);
Console.WriteLine(Encoding.UTF8.GetString(data));
UdpClient client = new UdpClient();
IPEndPoint server = new IPEndPoint(IPAddress.Parse("192.168.0.113"), 2333);
byte[] data = Encoding.UTF8.GetBytes(Console.ReadLine());
client.Send(data, data.Length, server);