C#中面向连接Socket编程(结合Encoding与线程池)
原创
©著作权归作者所有:来自51CTO博客作者sunzongbao2007的原创作品,请联系作者获取转载授权,否则将追究法律责任
============================================
============================================
由于是尝试性的东西,客户端与服务端写在同一个类下 生成一个本机通信的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);
}
}
下一篇:C#中λ表达式
![](https://ucenter.51cto.com/images/noavatar_middle.gif)
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
socket编程与线程的结合
socket编程与线程之间结合实现多个客户端访问服务器将小写字母转换为大写
客户端 服务器 线程 套接字 socket编程 -
网络编程C#篇(二):Socket面向连接简单实例
基于Windows套接字Socket,简单的面向连接的TCP服务器和客户机,实例: 简单的TCP服务器:  
职场 C# Socket 休闲 网络编程 -
C#中面向连接的客户端与服务端编程
1. 简介1) 流程2) 服务端程序特点Ø 一般启动后就
C# 休闲 服务端编程 客户端编程 面向连接