using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Configuration; using System.Data.SqlClient; using System.IO; namespace ConsoleApplication1 { class Program { private static byte[] result = new byte[1024]; private static int myProt = 8885; //端口 private static Socket serverSocket; private static int ConnectCount = 0; private static int MaxConnectCount = 3; private static List<string> messageList = new List<string>(); static object objToLock = new object(); static void Main(string[] args) { //服务器IP地址 IPAddress ip = IPAddress.Parse("ip"); serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); serverSocket.Bind(new IPEndPoint(ip, myProt)); //绑定IP地址:端口 serverSocket.Listen(2); //设定最多10个排队连接请求 Console.WriteLine("启动监听{0}成功", serverSocket.LocalEndPoint.ToString()); new Thread(ListenClientConnect).Start(); Console.ReadLine(); } /// <summary> /// 监听客户端连接 /// </summary> private static void ListenClientConnect() { while (true) { Socket clientSocket = serverSocket.Accept(); //clientSocket.Send(Encoding.UTF8.GetBytes("string###又来个逗比!mdzz")); //Console.WriteLine("123"); //FileStream fs = new FileStream("D:/23.jpg", FileMode.Open); //BinaryReader br = new BinaryReader(fs); //Byte[] byData = br.ReadBytes((int)fs.Length); //fs.Close(); //Console.WriteLine("2"); //clientSocket.Send(byData); //Console.WriteLine("3"); if (ConnectCount < MaxConnectCount) { clientSocket.Send(Encoding.UTF8.GetBytes("又来个逗比!mdzz")); Thread receiveThread = new Thread(ReceiveMessage); receiveThread.Start(clientSocket); } else { clientSocket.Send(Encoding.UTF8.GetBytes("超过最大连接数")); clientSocket.Close(); } } } /// <summary> /// 接收消息 /// </summary> /// <param name="clientSocket"></param> private static void ReceiveMessage(object clientSocket) { if (ConnectCount < MaxConnectCount) { ConnectCount++; Socket myClientSocket = (Socket)clientSocket; int receiveNumber = -1; string userName = ""; while(userName.Equals("")) { Console.WriteLine("等待用户名"); receiveNumber = myClientSocket.Receive(result); if (receiveNumber > 0) { userName = Encoding.UTF8.GetString(result, 0, receiveNumber); Console.WriteLine("获取用户名:" + userName); //发送数据 myClientSocket.Send(Encoding.UTF8.GetBytes("接收账号:" + userName)); } } int count = 0; Boolean filestar = false; MemoryStream ms = new MemoryStream(); while (true) { try { if (myClientSocket.Poll(-1, SelectMode.SelectRead)) { //通过clientSocket接收数据 receiveNumber = myClientSocket.Receive(result); if (receiveNumber > 0) { if (Encoding.UTF8.GetString(result, 0, receiveNumber).IndexOf("filestar")==0) { Console.WriteLine("接收客户端{0}消息{1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.UTF8.GetString(result, 0, receiveNumber)); filestar = true; } if (filestar) { if (Encoding.UTF8.GetString(result, 0, receiveNumber).IndexOf("fileend") == 0) { Console.WriteLine("接收客户端{0}消息{1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.UTF8.GetString(result, 0, receiveNumber)); FileStream fs = new FileStream("D:\\test.jpg", FileMode.OpenOrCreate); BinaryWriter w = new BinaryWriter(fs); w.Write(ms.ToArray()); fs.Close(); myClientSocket.Send(Encoding.UTF8.GetBytes("fielLength:" + ms.Length)); ms.Dispose(); count = 0; } else if(count==1) { ms.Write(result, 0, receiveNumber); }else { count++; } } //发送数据 //myClientSocket.Send(Encoding.UTF8.GetBytes("接收完成,数据反馈端口:" + myClientSocket.RemoteEndPoint.ToString())); } else if (receiveNumber==0) { //socket连接已断开 Console.WriteLine("断开"); myClientSocket.Close(); ConnectCount--; break; } } else { //socket连接已断开 Console.WriteLine("断开123"); myClientSocket.Close(); ConnectCount--; break; } } catch (Exception ex) { Console.WriteLine(ex.Message); myClientSocket.Shutdown(SocketShutdown.Both); break; } } } else { Console.WriteLine("超过最大链接客户端"); } } } }
C#实现socket简单收发功能
因项目需求,需使用socket收发消息,故有以下代码,先行保存,免得日后实际开发完无法还原
猜你喜欢
转载自lin358.iteye.com/blog/2344603
今日推荐
周排行