简单Socket
以下代码来自SIKI学院:
服务器端:
using System;
usingSystem.Net.Sockets;
usingSystem.Net;
namespace tcpconnect
{
class MainClass
{
public static void Main (string[] args)
{
Socket serverSocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 172.18.32.163 172.0.0.1
//绑定IP
//不推荐,注意数字之间为逗号
//IPAddress ipadress = new IPAddress (new byte[]{172,18,32,163});
IPAddress ipadress = IPAddress.Parse("172.18.32.163");
//创建端口号
IPEndPoint ipEndPoint = new IPEndPoint (ipadress,88);
//绑定端口号
serverSocket.Bind(ipEndPoint);
//开始监听(对列为50个,参数为0是无数个,考虑性能50个)
serverSocket.Listen(50);
//为当前客户端建立服务器连接
Socket clientSocket = serverSocket.Accept();
//测试消息
string msg = "hello你好";
//中文处理(byte传输)
byte[] data = System.Text.Encoding.UTF8.GetBytes(msg);
//向客户端发消息
clientSocket.Send (data);
//接收客户端消息
byte[] databuffer = new byte[1024] ;
//数据byte个数
int count = clientSocket.Receive(databuffer);
//将数据从0到count转为字符串
string msgReceive = System.Text.Encoding.UTF8.GetString(databuffer,0,count);
//打印
Console.WriteLine (msgReceive);
//关闭与当前客户端的连接
clientSocket.Close();
//关闭服务器连接
serverSocket.Close ();
客户端:
using System;
usingSystem.Net.Sockets;
usingSystem.Net;
using System.Text;
namespace TCPClient
{
class MainClass
{
public static void Main (string[] args)
{
//创建一个socket接口
Socket clientSocket = new Socket (AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
//与服务器进行连接(注意不要写错)
clientSocket.Connect(new IPEndPoint (IPAddress.Parse("172.18.32.163"),88));
//创建一个数组用于接收来自服务器的消息
byte[] data = new byte[1024] ;
//接收来自服务器的消息(接收不到程序会一直停在这里接收,指导接收到为止)
int count = clientSocket.Receive (data);
//字节转字符串
string msg = Encoding.UTF8.GetString (data,0,count);
Console.WriteLine (msg);
//发送消息(发送则不会停止)
string s = Console.ReadLine();
clientSocket.Send (Encoding.UTF8.GetBytes(s));
//关掉与服务器的连接
clientSocket.Close();
同步接收:只能一条一条的接收和发送
异步接收:多条连续发送接收
服务器端:
//异步传输
static void StartServerAsync(){
Socket serverSocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 172.18.32.163 172.0.0.1
//绑定IP
//不推荐,注意数字之间为逗号
//IPAddress ipadress = new IPAddress (new byte[]{172,18,32,163});
IPAddress ipadress = IPAddress.Parse("172.18.32.163");
//创建端口号
IPEndPoint ipEndPoint = new IPEndPoint (ipadress,88);
//绑定端口号
serverSocket.Bind(ipEndPoint);
//开始监听(对列为50个,参数为0是无数个,考虑性能50个)
serverSocket.Listen(50);
Console.WriteLine ("服务器开启成功!");
//为当前客户端建立服务器连接
Socket clientSocket = serverSocket.Accept();
//测试消息
string msg = "hello你好";
//中文处理(byte传输)
byte[] data = System.Text.Encoding.UTF8.GetBytes(msg);
//向客户端发消息
clientSocket.Send (data);
//开始接收消息(异步)
//将接收来的消息从第0位存到1024位,存进databuffer中,并且在接收到每条消息后,用ReceiveCallBack方法进行处理,方法参数为clientSocket
clientSocket.BeginReceive (databuffer,0,1024,SocketFlags.None,ReceiveCallBack,clientSocket);
#region 关掉单条接收功能 并且不关闭服务器端
// //接收客户端消息
// byte[] databuffer = new byte[1024] ;
// //数据byte个数
// int count = clientSocket.Receive(databuffer);
// //将数据从0到count转为字符串
// string msgReceive = System.Text.Encoding.UTF8.GetString(databuffer,0,count);
// //打印
// Console.WriteLine (msgReceive);
//
// //暂停一下
// Console.ReadKey();
// //关闭与当前客户端的连接
// clientSocket.Close();
// //关闭服务器连接
// serverSocket.Close ();
#endregion
}
//回调函数(自带参数,方法名随便起)
static void ReceiveCallBack(IAsyncResult ar){
Socket clientSocket = ar.AsyncState as Socket;
//完成数据接收(和BeginReceive对应)
int count = clientSocket.EndReceive(ar);
string msg = Encoding.UTF8.GetString (databuffer,0,count);
Console.WriteLine ("从客户端接收到数据"+msg);
//接收完一条再接收一条
clientSocket.BeginReceive (databuffer,0,1024,SocketFlags.None,ReceiveCallBack,client
Socket);
客户端:
while (true) {
//发送消息(发送则不会停止)
string s = Console.ReadLine ();
clientSocket.Send (Encoding.UTF8.GetBytes (s));
}
}
}
}
}
接受多个客户端连接
//异步传输
static void StartServerAsync(){
//建立服务器
Socket serverSocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 172.18.32.163 172.0.0.1
//绑定IP
//不推荐,注意数字之间为逗号
//IPAddress ipadress = new IPAddress (new byte[]{172,18,32,163});
IPAddress ipadress = IPAddress.Parse("172.18.32.163");
//创建端口号
IPEndPoint ipEndPoint = new IPEndPoint (ipadress,88);
//绑定端口号
serverSocket.Bind(ipEndPoint);
try {
//开始监听(对列为50个,参数为0是无数个,考虑性能50个)
serverSocket.Listen(50);
Console.WriteLine ("服务器开启成功!");
} catch (Exception ex) {
Console.WriteLine (ex);
}
//为当前客户端建立服务器连接(当与一个客户端建立连接后,执行AcceptCallBack函数,参数为serverSocket)
//Socket clientSocket = serverSocket.Accept();
serverSocket.BeginAccept(AcceptCallBack,serverSocket);
#region 关掉单条接收功能 并且不关闭服务器端
// //接收客户端消息
// byte[] databuffer = new byte[1024] ;
// //数据byte个数
// int count = clientSocket.Receive(databuffer);
// //将数据从0到count转为字符串
// string msgReceive = System.Text.Encoding.UTF8.GetString(databuffer,0,count);
// //打印
// Console.WriteLine (msgReceive);
//
// //暂停一下
// Console.ReadKey();
// //关闭与当前客户端的连接
// clientSocket.Close();
// //关闭服务器连接
// serverSocket.Close ();
#endregion
}
//回调函数(自带参数,方法名随便起) IAsyncResult:异步操作接口 AsyncState:异步操作返回的信息
static void ReceiveCallBack(IAsyncResult ar){
//每有一个客户端连接就与它建立一个socket连接
Socket clientSocket = ar.AsyncState as Socket;
//完成单条数据接收(和BeginReceive对应)
int count = clientSocket.EndReceive(ar);
string msg = Encoding.UTF8.GetString (databuffer,0,count);
Console.WriteLine ("从客户端接收到数据"+msg);
//接收完一条再接收一条
clientSocket.BeginReceive (databuffer,0,1024,SocketFlags.None,ReceiveCallBack,clientSocket);
}
static void AcceptCallBack(IAsyncResult ar){
//serverSocket是需要异步操作的对象
Socket serverSocket = ar.AsyncState as Socket;
//返回一个与客户端的连接
Socket clientSocket = serverSocket.EndAccept (ar);
//测试消息
string msg = "hello你好";
//中文处理(byte传输)
byte[] data = System.Text.Encoding.UTF8.GetBytes(msg);
//向客户端发消息
clientSocket.Send (data);
//开始接收消息(异步)
//将接收来的消息从第0位存到1024位,存进databuffer中,并且在接收到每条消息后,用ReceiveCallBack方法进行处理,方法参数为clientSocket
clientSocket.BeginReceive (databuffer,0,1024,SocketFlags.None,ReceiveCallBack,clientSocket);
//处理完一个客户端再处理另一个客户端
serverSocket.BeginAccept(AcceptCallBack,serverSocket);
}
}
}