Socket套接字

同步方式:

Server-服务器端:

using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace Socket套接字
{
    internal class Program
    {
        private const ushort Port = 50000;

        private static void Main()
        {
            var ipAddress = new IPAddress(new byte[] {127, 0, 0, 1}); //IP地址
            var tcpListener = new TcpListener(ipAddress, Port);
            tcpListener.Start();

            while (true)
            {
                try
                {
                    Console.WriteLine("开始侦听[{0}]端口,等待客户端调用:", Port);
                    TcpClient tcpClient = tcpListener.AcceptTcpClient(); //产生阻塞,等待请求
                    Console.WriteLine("客户端已连接");
                    ProcessClientRequest(tcpClient.GetStream());
                    Console.WriteLine("客户端已断开");
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    throw;
                }
            }
        }

        private static void ProcessClientRequest(NetworkStream networkStream)
        {
            var streamWriter = new StreamWriter(networkStream);
            const string testFilePath = "C:/text/file.txt";
            if (File.Exists(testFilePath))
            {
                File.Delete(testFilePath);
            }
            WriteFile(testFilePath, "测试测试");
            var streamReader = new StreamReader(testFilePath, Encoding.Default);
            string stmp = streamReader.ReadLine();
            try
            {
                while (stmp != null)
                {
                    Console.WriteLine("Sending:{0}", stmp);
                    streamWriter.WriteLine(stmp);
                    streamWriter.Flush();
                    stmp = streamReader.ReadLine();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                throw;
            }
            finally
            {
                streamReader.Close();
                streamWriter.Close();
                networkStream.Close();
            }
        }

        public static void WriteFile(string filePath, string content)
        {
            try
            {
                var fs = new FileStream(filePath, FileMode.Create);
                Encoding encode = Encoding.Default;
                //获得字节数组
                byte[] data = encode.GetBytes(content);
                //开始写入
                fs.Write(data, 0, data.Length);
                //清空缓冲区、关闭流
                fs.Flush();
                fs.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}

Client-客户端:

using System;
using System.IO;
using System.Net.Sockets;

namespace Socket套接字_同步__客户端
{
    internal class Program
    {
        private const string Host = "localhost";
        private const ushort Port = 50000;

        private static void Main()
        {
            try
            {
                TcpClient tcpClient = new TcpClient(Host, Port);
                Console.WriteLine("连接主机:{0}端口:{1}", Host, Port);
                NetworkStream networkStream = tcpClient.GetStream();
                var streamReader = new StreamReader(networkStream);
                try
                {
                    string stmp = streamReader.ReadLine();
                    while (stmp != null)
                    {
                        Console.WriteLine("收到数据:{0}", stmp);
                        stmp = streamReader.ReadLine();
                    }
                    Console.Read();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                finally
                {
                    streamReader.Close();
                    networkStream.Close();
                }
                Console.WriteLine("断开链接");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}

运行效果:


异步方式:

Sever-服务器端:

using System;
using System.Net;
using System.Net.Sockets;

namespace Socket套接字_异步__服务器端
{
    internal class Program
    {
        private const ushort Port = 50000;

        private static void Main()
        {
            var ipAddress = new IPAddress(new byte[] { 127, 0, 0, 1 }); //IP地址
            var tcpListener = new TcpListener(ipAddress, Port);
            tcpListener.Start();

            while (true)
            {
                try
                {
                    Console.WriteLine("开始侦听[{0}]端口,等待客户端调用:", Port);
                    TcpClient tcpClient = tcpListener.AcceptTcpClient(); //产生阻塞,等待请求
                    // Console.WriteLine("客户端已连接");
                    var clientRequestProcessing = new ClientRequestProcessing(tcpClient.GetStream());
                    clientRequestProcessing.Go();
                    //Console.WriteLine("客户端已断开");
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    throw;
                }
            }
        }
    }
}
using System;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace Socket套接字_异步__服务器端
{
    public class ClientRequestProcessing
    {
        private const int BufferSize = 512;
        private readonly byte[] _buffer;
        private NetworkStream _networkStream;

        public ClientRequestProcessing(NetworkStream networkStream)
        {
            _networkStream = networkStream;
            _buffer = new byte[BufferSize];
        }

        public void Go()
        {
            _networkStream.BeginRead(_buffer, 0, _buffer.Length, OnReadDone, null);
        }

        private void OnReadDone(IAsyncResult asyncResult)
        {
            int nBytes = _networkStream.EndRead(asyncResult);
            if (nBytes > 0)
            {
                #region 接收数据

                string sReceived = Encoding.Default.GetString(_buffer, 0, nBytes);
                Console.WriteLine("异步方式:收到客户端传递数据:{0},共:{1}bytes", sReceived, nBytes);

                #endregion

                Thread.Sleep(2000); //模拟处理数据时间

                #region 返回处理数据

                byte[] sendByte =
                    Encoding.Default.GetBytes("服务器返回收到的数据:" + sReceived + "[" + DateTime.Now.ToString("HH:mm:ss") + "]");
                _networkStream.BeginWrite(sendByte, 0, sendByte.Length, OnWriteDone, null);

                #endregion
            }
            else
            {
                Console.WriteLine("异步方式:Client request processed.");
                _networkStream.Close();
                _networkStream = null;
            }
        }

        private void OnWriteDone(IAsyncResult asyncResult)
        {
            _networkStream.EndWrite(asyncResult);
            Console.WriteLine("异步方式:回传数据给客户端结束.");
            _networkStream.BeginRead(_buffer, 0, _buffer.Length, OnReadDone, null);
        }
    }
}
Client-客户端:

using System;
using System.IO;
using System.Net.Sockets;
using System.Text;

namespace Socket套接字_异步__客户端
{
    internal class Program
    {
        private const string Host = "localhost";
        private const ushort Port = 50000;

        private static void Main()
        {
            try
            {
                var tcpClient = new TcpClient(Host, Port);
                Console.WriteLine("连接主机:{0}端口:{1}", Host, Port);
                NetworkStream networkStream = tcpClient.GetStream();
                var streamReader = new StreamReader(networkStream, Encoding.Default);
                var streamWriter = new StreamWriter(networkStream, Encoding.Default);
                try
                {
                    const string sSend = "Hi from the Client!";
                    for (int i = 0; i < 3; i++)
                    {
                        #region 发送数据

                        Console.WriteLine("客户端->服务器:" + sSend + "[" + DateTime.Now.ToString("HH:mm:ss") + "]");
                        streamWriter.WriteLine(sSend);
                        streamWriter.Flush();

                        #endregion

                        #region 接收数据

                        string sReceived = streamReader.ReadLine();
                        Console.WriteLine("服务器->客户端:" + sReceived + "[" + DateTime.Now.ToString("HH:mm:ss") + "]");

                        #endregion
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("异常:" + ex.Message);
                }
                finally
                {
                    streamReader.Close();
                    streamWriter.Close();
                    networkStream.Close();
                }
                Console.WriteLine("断开链接");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.Read();
        }
    }
}

运行效果:




posted @ 2013-03-02 10:41  清山博客  阅读(260)  评论(0编辑  收藏  举报