Demo
不讲细节了,直接上代码, 如果要实现比较复杂的socket功能,最好不要像下面自己写,使用fastsocket等框架。
Socket服务端口的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
//点击开始监听时 在服务端创建一个负责监听IP和端口号的Socket
Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse("127.0.0.1") ;
//创建对象端口
IPEndPoint point = new IPEndPoint(ip, 8087);
socketWatch.Bind(point);//绑定端口号
Console.WriteLine("listen success!");
socketWatch.Listen(10);//设置监听
//创建监听线程
Thread thread = new Thread(Listen);
thread.IsBackground = true;
thread.Start(socketWatch);
while (true)
{
Console.WriteLine("please send information to client:");
Send(Console.ReadLine());
}
//Console.ReadLine();
}
static Socket socketSend;
static void Listen(object o)
{
try
{
Socket socketWatch = o as Socket;
while (true)
{
socketSend = socketWatch.Accept();//等待接收客户端连接
Console.WriteLine(socketSend.RemoteEndPoint.ToString() + ":" + "connect success!");
//开启一个新线程,执行接收消息方法
Thread r_thread = new Thread(Received);
r_thread.IsBackground = true;
r_thread.Start(socketSend);
}
}
catch { }
}
static void Received(object o)
{
try
{
Socket socketSend = o as Socket;
while (true)
{
//客户端连接服务器成功后,服务器接收客户端发送的消息
byte[] buffer = new byte[1024 * 10];
//实际接收到的有效字节数
int len = socketSend.Receive(buffer);
if (len == 0)
{
break;
}
string str = Encoding.UTF8.GetString(buffer, 0, len);
Console.WriteLine(socketSend.RemoteEndPoint + ":" + str);
}
}
catch { }
}
static void Send(string str)
{
byte[] buffer = Encoding.UTF8.GetBytes(str);
socketSend.Send(buffer);
}
}
}
Socket客户端的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp2
{
class Program
{
static Socket socketSend;
static void Main(string[] args)
{
//创建客户端Socket,获得远程ip和端口号
socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse("127.0.0.1");
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32("8087"));
socketSend.Connect(point);
Console.WriteLine("connect success!");
//开启新的线程,不停的接收服务器发来的消息
Thread c_thread = new Thread(Received);
c_thread.IsBackground = true;
c_thread.Start();
Console.WriteLine("please send information to server:");
string msg = Console.ReadLine();
byte[] buffer = new byte[1024 * 1024 * 3];
buffer = Encoding.UTF8.GetBytes(msg);
socketSend.Send(buffer);
Console.ReadLine();
}
static void Received()
{
while (true)
{
try
{
byte[] buffer = new byte[1024 * 1024 * 3];
//实际接收到的有效字节数
int len = socketSend.Receive(buffer);
if (len == 0)
{
break;
}
string str = Encoding.UTF8.GetString(buffer, 0, len);
Console.WriteLine(socketSend.RemoteEndPoint + ":" + str);
}
catch { }
}
}
}
}
如果想更牛X的话,可以写成异步。
参考文档
https://www.cnblogs.com/wangkaining/p/6089627.html
下面两篇可以看socket原理
https://www.cnblogs.com/ysyn/p/3399351.html
http://www.cnblogs.com/dotnet261010/p/6211900.html