C# Socket 的简易使用方法
1.服务端
-
新建一个Socket对象
Socket Server = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
AddressFamily.InterNetwork,代表的是IPV4 类型
SocketType.Stream 代表的是用的Stream 这种字节流模式
ProtocolType.TCP 表示通信模式为TCP
-
设置Socket的IP及端口
IPAddress ip = IpAddress.Phare("127.0.0.1");//或者IPAddress ip = IPAddress.Any; int port = 8888;//端口号 IPEndPoint iPEndPoint = new IPEndPoint(ip, port);//含有Ip与端口号的网络终结点
-
设置监听
Server.Bind(ipEndPoint);//将IP、端口与Socket绑定 Server.Listen(10);//设置此服务端可连接的客户端数量
-
开始监听
Socket Listen = Server.Accept();//Server.Accept();方法会返回一个新的与客户端连接的Socket,代码运行到这里的时候会卡住等待客户端连接,若不想卡住可新开一个线程。
-
收集监听的信息
byte[] buffer = new byte[1024*1024*2] //设置能够接受数据的字节大小 int r = Listen.Receiver(buffer);//收到客户端发的信息为int类型的数字流 string str = Encoding.UTF8.GetString(buffer,0,r);//将接受到的int 类型buffer解码为string,步长为从0到r;
-
给客户端发消息
string str = "Hello,World"; byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);//将要发送的string 类型文字转换成 byte Listen.Send(buffer);//注意此处发送信息的Socket是Listen而不是Server,因为与客户端进行连接的Socket为Listen(Server设置了可监听10个客户端,Listen只是其中一个)
-
包含多线程的完整服务端
private void button1_Click(object sender, EventArgs e) //假定一个button点击事件触发Socket { Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress ip = IPAddress.Parse("127.0.0.1"); IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(textBox3.Text)); server.Bind(point);//将IP、端口与Socket绑定 server.Listen(10); Thread th = new Thread(Listen);//新建一个线程用于后台监听,避免主程序卡死 th.IsBackground = true; th.Start(server);//线程调用的方法的参数要在start里面传入,而不能 //Thread th = new Thread(Listen(server)) } Socket Server_Listen;//发送消息的时候也要用到此Socket,故设置为全局变量; void Listen(object o)/*因为线程不能重载除object类型外的其他类型, 故定义此方法传入的参数为object,再通过as的方式改回Socket 此线程用于与客户端通信*/ { Socket server = o as Socket; while(true) { Server_Listen = Server.Accept();//发送消息的时候也要用到此Socket,故设置为全局变量; Thread th2 = new Thread(receive); th2.IsBackground = true; th2.Start(Server_Listen); } } void receive(object s) //此线程用来与持续接受客户端的消息 { Socket Server_Listen = s as Socket; while(true) { byte[] buffer = new byte[1024*1024*2]; int r = Server_Listen.Receive(buffer); string str = Encoding.UTF8.GetString(buffer,0,r); } } void Send()//此方法用于个给客户端发消息 { string str = "Hello,world"; byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str); Server_Listen.Send(buffer); }
2.客户端
- 原理与服务端相同
Socket Client;
private void button1_Click(object sender, EventArgs e) //假定一个button点击事件触发Socket
{
Client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse("127.0.0.1");
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(textBox3.Text));
client.Connect(iPEndPoint);
Thread th = new Thread(receive);//新建一个线程用于后台通信,避免主程序卡死
th.IsBackground = true;
th.Start();
}
void receive()
{
while(true)
{
byte[] buffer = new byte[1024*1024*2];
int r = Client.Receive(buffer);
string str = Encoding.UTF8.GetString(buffer,0,r);
}
}
void Send()//此方法用于个给客户端发消息
{
string str = "Hello,world";
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
Client.Send(buffer);
}