C#中面向连接Socket编程(结合Encoding与线程池)

============================================
============================================
由于是尝试性的东西,客户端与服务端写在同一个类下 生成一个本机通信的exe
============================================
 
using System;//基础需要
using System.Net;//IPAddress,IPEndPoint需要
using System.Text;//Encoding需要
using System.Threading;//线程需要
using System.Net.Sockets;//Socket需要
class SocketTest
{
public static Socket server=null;
public static Socket client=null;
public static Socket user=null;
public static byte[] clientData=null;//服务端接收client的byte缓冲区
public static byte[] userData=null;//客户端发送数据byte缓冲区
public static void Main(){
clientData=new byte[128];
userData=new byte[128];//设置缓冲区大小为128
//IPAddress是C#中对IP的封装
IPAddress ip0=IPAddress.Parse("127.0.0.1");
//IPEndPoint是C#中对端口与IP的封装
IPEndPoint endPoint=new IPEndPoint(ip0,8080);
Console.WriteLine(endPoint.ToString());
Console.WriteLine(endPoint.Address);
Console.WriteLine(endPoint.Port);
//服务端ServerSocket,也是一个Socket,但是他要负责执行Accept进行等待
//参数列表为(网络类型,Socket数据传输方式,协议)
server=new Socket(endPoint.AddressFamily,SocketType.Stream,ProtocolType.Tcp);
//将服务端与端口绑定
server.Bind(endPoint);
//设定允许的排队队列大小
server.Listen(100);
//线程列表中加入包含Accept的线程
ThreadPool.QueueUserWorkItem(new WaitCallback(accepting));
//模拟用户加入的线程
ThreadPool.QueueUserWorkItem(new WaitCallback(userComing));
//模拟服务端接收到的用户端socket信息,负责接受与发送数据
ThreadPool.QueueUserWorkItem(new WaitCallback(clientWorking));
Console.WriteLine(server.ToString());
//主进程等待1秒,等待以上三个线程执行(unsafe)
Thread.Sleep(1000);
//模拟客户端发送数据
String tmp="";
while(true){
tmp=Console.ReadLine();
//将客户端输入的数据以UTF8的格式转换成byte
userData=Encoding.UTF8.GetBytes(tmp);
//发送数据(socket发送数据只能以byte数组方式发送)
user.Send(userData);
}
//Console.ReadLine();
}
//模拟服务端与连接到的客户端交接的管理型client
public static void clientWorking(Object stateInfo){
//实例一个length,存储接收到的消息长度
int length=0;
while(true){
if(client!=null){
//Receive返回接收到的数据大小
length=client.Receive(clientData,clientData.Length,0);
//将接收到的byte以UTF8格式转换回字符串,长度为length,否则转换后整个缓冲区的
//数据都会出现,干扰
Console.WriteLine(Encoding.UTF8.GetString(clientData,0,length));
}
}
}
//模拟服务端的对应用户管理socket(unsafe)
public static void accepting(Object stateInfo){
while(true){
client=server.Accept();
break;
}
}
//客户端(unsafe)
public static void userComing(Object stateInfo){
IPAddress ip1=IPAddress.Parse("127.0.0.1");
IPEndPoint userEndPoint=new IPEndPoint(ip1,8080);
user=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
user.Connect(userEndPoint);
 
}
 
 
 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章