简单的Socket通信
Socket-TcpClient,TcpListener,UdpClient
应用程序可以通过TcpClient、TcpListener和UdpClient类使用传输控制协议(Tcp)和用户数据报协议(Udp)服务。这些协议类建立在System.Net.Sockets.Socket类的基础之上,负责数据传送的细节。(也就是说TcpClient、TcpListener和UdpClient类是用来简化Socket)
TcpClient和TcpListener使用NetWork类表示网络。使用GetStream方法返回网络流,然后调用该流的Read和Write方法。NetWorkStream不拥有协议类的基础套接字,因此关闭它并不影响套接字。
UdpClient类使用字节数组保存Udp数据文报,使用send方法网络发送数据,使用Receive方法接收传入的数据文报。
ClientSocket
class ClientTest
{
private Socket clientsocket;
public ClientTest()
{
//可启动多个客户端与服务器建立连接
clientsocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}
public void Connect(string ip,int port)
{
clientsocket.Connect(ip,port);
Console.WriteLine("客户端连接成功!");
Thread threadReceive = new Thread(Receive);
threadReceive.IsBackground = true;
threadReceive.Start();
}
public void send(string msg)
{
//客户端向服务器发送数据
clientsocket.Send(Encoding.UTF8.GetBytes(msg));
}
//接收服务器发送的数据
public void Receive()
{
while (true)
{
try
{
byte[] msg = new byte[1024];
int msgLength = clientsocket.Receive(msg);
Console.WriteLine("服务器说:"+Encoding.UTF8.GetString(msg,0,msgLength));
}
catch (Exception)
{
Console.WriteLine("服务器已断开!");
break;
}
}
}
}
class Program
{
static void Main(string[] args)
{
ClientTest clientsocket = new ClientTest();
//连接服务器设置的ip地址和端口号
clientsocket.Connect("169.254.83.38", 12321);
Console.WriteLine("请输入向服务器发送的消息,输入quit表示退出!");
string msg = Console.ReadLine();
while (msg != "quit")
{
clientsocket.send(msg);
msg = Console.ReadLine();
}
Console.ReadKey();
}
}
ServerTest
class ServerTest
{
private Socket serversocket;
//客户端列表
private List<Socket> clientList;
public ServerTest()
{
serversocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
clientList = new List<Socket>();
}
public void start()
{
serversocket.Bind(new IPEndPoint(IPAddress.Any, 12321));
serversocket.Listen(10);
Console.WriteLine("服务器启动成功");
Thread threadaccept = new Thread(Accept);
threadaccept.IsBackground = true;
threadaccept.Start();
}
private void Accept()
{
//服务器监听到的客户端Socket
Socket client = serversocket.Accept();
IPEndPoint ip = client.RemoteEndPoint as IPEndPoint;
Console.WriteLine(ip.Address+"["+ip.Port+"]:客户端连接成功!");
//将连接成功的客户端添加到客户端列表中
clientList.Add(client);
Thread threadreceive = new Thread(Receive);
threadreceive.IsBackground = true;
threadreceive.Start(client);
Accept();
}
private void Receive(object obj)
{
Socket client = obj as Socket;
IPEndPoint point = client.RemoteEndPoint as IPEndPoint;
try
{
byte[] msg = new byte[1024];
int msgLength = client.Receive(msg);
//服务器界面显示客户端发送过来的数据
string msgBroad = point.Address + "[" + point.Port + "]" + Encoding.UTF8.GetString(msg, 0, msgLength);
Console.WriteLine(msgBroad);
//服务器将接收到的数据广播到其他的客户端
BroadCast(client, msgBroad);
Receive(client);
}
catch (Exception)
{
Console.WriteLine(point.Address + "[" + point.Port + "]:已断开!");
clientList.Remove(client);
throw;
}
}
//将数据发送给其他的客户端
private void BroadCast(Socket clientOther, string msg)
{
foreach (var client in clientList)
{
if (client != clientOther)
{
client.Send(Encoding.UTF8.GetBytes(msg));
}
}
}
}
class Program
{
static void Main(string[] args)
{
ServerTest server = new ServerTest();
server.start();
//Console.WriteLine("本地端口号:" + GetLocalIp());
Console.ReadKey();
}
public static string GetLocalIp()
{
//用于获取本地端口号
IPAddress local_ip;
try
{
IPAddress[] ips;
ips = Dns.GetHostAddresses(Dns.GetHostName());
local_ip = ips.First(ip => ip.AddressFamily == AddressFamily.InterNetwork);
return local_ip.ToString();
}
catch (Exception)
{
Console.WriteLine("====本地ip获取失败!====");
return null; ;
}
}
}