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();


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值