服务器
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Text;
using System.Net.NetworkInformation;
using System.Collections.Generic;
namespace TCPServer
{
class Program
{
static void Main(string[] args)
{
Server server = new Server();
server.ServerSetUp();
while (true)
{
string str = Console.ReadLine();
server.SendALL(str);
}
}
}
public class Server
{
//配置相关
private string _ip ="192.168.30.28";
private int _port = 10000;
//服务器套接字
private Socket _server;
//接收客户端连接的线程,因为Accept是一个阻塞现成的方法,而且此方法还需要循环执行
private Thread _acceptServerClientThread;
//所有已经连接的客户端
private List<Socket> _clientList = new List<Socket>();
//启动服务器=建立流式套接字+配置本地地址
public void ServerSetUp()
{
try
{
//建立套接字,
_server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//配置本地地址
EndPoint endpooint = new IPEndPoint(IPAddress.Parse(_ip), _port);
_server.Bind(endpooint);
//监听和接受客户端请求
_server.Listen(30);
//开启一个接受连接的线程
_acceptServerClientThread = new Thread(AcceptClientConnect);
_acceptServerClientThread.Start();
Console.WriteLine("{0}:{1} ServerSetUp...", _ip, _port);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
//接受客户端连接
public void AcceptClientConnect()
{
while (true)
{
try
{
//接受客户端连接
Socket clientSocket = _server.Accept();
//维护一个客户端在线列表
_clientList.Add(clientSocket);
//获取客户端的网络标识
IPEndPoint clientEndPoint = clientSocket.RemoteEndPoint as IPEndPoint;
//输出一下地址和端口
Console.WriteLine("{0}:{1} Connect....", clientEndPoint.Address.ToString(), clientEndPoint.Port);
//接受客户端消息的线程
Thread acceptClientMsg = new Thread(AcceptMsg);
acceptClientMsg.Start(clientSocket);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
//接收消息
public void AcceptMsg(object obj)
{
//强转为Socket类型
Socket client = obj as Socket;
//字节数组 接受传来的的信息 1024*64
byte[] buffer = new byte[client.ReceiveBufferSize];
//获取客户端的网络地址标识
IPEndPoint clientEndPoint = client.RemoteEndPoint as IPEndPoint;
try
{
while (true)
{
//接收消息存储
int len = client.Receive(buffer);
string str = Encoding.UTF8.GetString(buffer, 0, len);
Console.WriteLine("{0}:{1}:{2}", clientEndPoint.Address, _port, str);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
_clientList.Remove(client);
}
}
//给某个客户端发消息
public void Send(string str,Socket client)
{
try
{
//string=>byte[]
byte[] strBytes = Encoding.UTF8.GetBytes(str);
client.Send(strBytes);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
//发给所有人
public void SendALL(string str)
{
for (int i = 0; i < _clientList.Count; i++)
{
Send(str, _clientList[i]);
}
}
//获取IP地址
public IPAddress GetTpv4(NetworkInterfaceType type)
{
NetworkInterface[] networkinterface= NetworkInterface.GetAllNetworkInterfaces();
for (int i = 0; i < networkinterface.Length; i++)
{
Console.WriteLine(networkinterface[i].Name + "------" + networkinterface[i].ToString());
//无线网操作
if (type == networkinterface[i].NetworkInterfaceType && networkinterface[i].OperationalStatus == OperationalStatus.Up)
{
UnicastIPAddressInformationCollection ips = networkinterface[i].GetIPProperties().UnicastAddresses;
foreach (UnicastIPAddressInformation item in ips)
{
if (item.Address.AddressFamily == AddressFamily.InterNetwork)
{
return item.Address;
}
}
}
}
return null;
}
//关闭套接字
public void Close()
{
if (_clientList.Count > 0)
{
for (int i = 0; i < _clientList.Count; i++)
{
_clientList[i].Close();
}
_clientList.Clear();
_server.Close();
_acceptServerClientThread.Abort();
}
}
}
}
客户端
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 TCPClient
{
class Program
{
static void Main(string[] args)
{
Client client = new Client();
client.ClientConnect();
while (true)
{
string str = Console.ReadLine();
client.Send(str);
}
}
}
public class Client
{
private Socket clientsocket;
private Thread _acceptServerMsg;
public void ClientConnect()
{
try
{
clientsocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
clientsocket.Connect("192.168.30.28", 10000);
//接受消息的 线程
_acceptServerMsg = new Thread(AcceptServerMsg);
_acceptServerMsg.Start();
}
catch (Exception e )
{
Console.WriteLine(e.Message);
}
}
public void AcceptServerMsg()
{
byte[] buffer = new byte[1024 * 64];
while (true)
{
try
{
int len = clientsocket.Receive(buffer);
string str = Encoding.UTF8.GetString(buffer,0,len);
Console.WriteLine("Reveice Msg From Server:{0}",str);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
//发送消息
public void Send( string str)
{
try
{
//string=>byte[]
byte[] strBytes = Encoding.UTF8.GetBytes(str);
clientsocket.Send(strBytes);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
//关闭套接字
public void Close()
{
if (clientsocket.Connected)
{
clientsocket.Close();
}
_acceptServerMsg.Abort();
}
}
}