C#:網絡通信(TCP)

期末的時候寫課程設計和實驗,在谷歌上學的。近期空閒,貼上來幫助記憶。

服務端:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace CssServer
{
    public class Server{
        private byte[] _buffer = new byte[81920];
        private List<Socket> _clientSockets = new List<Socket>();
        private Socket _serverSocket =
            new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        /// <summary>
        /// BeginAccept 接受異步連接
        /// </summary>
        private void SetupServer()
        {
            Console.WriteLine("服務開啓,等待連接 ...");
            _serverSocket.Bind(new IPEndPoint(IPAddress.Any, 8888));
            _serverSocket.Listen(5);
            _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);

        }
        /// <summary>
        /// 接受異步傳輸
        /// </summary>
        /// <param name="AR"></param>
        private void AcceptCallback(IAsyncResult AR)
        {
            Socket clientSocket = _serverSocket.EndAccept(AR);

            _clientSockets.Add(clientSocket);
            System.Console.WriteLine("一個客戶端連接了!");
            System.Console.WriteLine("當前連接用戶個數:{0}", _clientSockets.Count);
            clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReciveCallback), clientSocket);
            _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
        }

        private void ReciveCallback(IAsyncResult AR)
        {
            Socket socket = (Socket)AR.AsyncState;
            int received = 0;
            try
            {
                received = socket.EndReceive(AR);
            }
            catch
            {
                for (int i = 0; i < _clientSockets.Count; i++)
                {
                    if (_clientSockets[i] == socket)
                    {
                        _clientSockets.Remove(socket);
                    }
                }
                System.Console.WriteLine("一個客戶端離開了!");
                System.Console.WriteLine("當前連接用戶個數:{0}", _clientSockets.Count);
                return;
            }

            byte[] dataBuf = new byte[received];

            Array.Copy(_buffer, dataBuf, received);
            string text = Encoding.UTF8.GetString(dataBuf);

            Console.WriteLine("服務器收到信息: " + text);
            //byte[] data = DatabaseSupport.ResponsePreseter.TRP.Select(text); //這是當時寫項目時的邏輯擴展層
            String sendString = "嗶哩嗶哩...";

            byte[] data = Encoding.UTF8.GetBytes(sendString);
            socket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendCallback), socket);
            socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReciveCallback), socket);
        }
        private void SendCallback(IAsyncResult AR)
        {
            Socket socket = (Socket)AR.AsyncState;
            socket.EndSend(AR);
        }
        public void start()
        {
            Console.Title = "Server";
            SetupServer();
            System.Console.Read();
        }

    }
    class Program
    {
        static void Main(string[] args)
        {
            new Server().start();
            System.Console.ReadLine();
        }
    }
}


客戶端:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace CssClient
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Title= "client" ;

            Socket _clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            int attempts = 0;
            while (!_clientSocket.Connected)
            {
                try
                {
                    attempts++;
                    _clientSocket.Connect(IPAddress.Loopback, 8888);//定義端口號

                }
                catch (SocketException)
                {
                    Console.Clear();
                    System.Console.WriteLine("連接次數: " + attempts.ToString());
                }
                Thread.Sleep(1000);
            }
            Console.Clear();
            System.Console.WriteLine("連接成功!輸入向發送的信息,輸入\"END\"退出:");

            string sendString = String.Empty;
            sendString = System.Console.ReadLine();
            while (sendString != "END")
            {
                byte[] buffer = Encoding.UTF8.GetBytes(sendString);
                _clientSocket.Send(buffer);

                byte[] receivedBuf = new byte[81920];
                int rec = _clientSocket.Receive(receivedBuf);
                byte[] data = new byte[rec];
                Array.Copy(receivedBuf, data, rec);
                System.Console.WriteLine("收到傳來的信息:{0}",Encoding.UTF8.GetString(data)); 
                sendString = System.Console.ReadLine();
            }

        }
    }
}

有關序列化與反序列化:

                DataTable dt;
                MemoryStream ms = new MemoryStream();
                BinaryFormatter bf = new BinaryFormatter();
                bf.Serialize(ms, dt);
                byte[] data = ms.ToArray(); ms.Close();

                //反序列化
                MemoryStream ms = new MemoryStream(data);
                BinaryFormatter bf = new BinaryFormatter();
                DataTable dt = bf.Deserialize(ms) as DataTable;
                ms.Close();


發佈了62 篇原創文章 · 獲贊 17 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章