• TCP 同步传输:客户端发送,服务器段接收


    1、服务器端程序

      可以在TcpClient上调用GetStream()方法来获的链接到远程计算机的网络流NetworkStream。当在客户端调用时,他获的链接服务器端的流;当在服务器端调用时,他获得链接客户端的流。

      

    class Program
        {
            static void Main(string[] args)
            {
                const int BufferSize = 8192;//缓存大小
    
                Console.WriteLine("server is running ...");
                IPAddress ip = new IPAddress(new byte[] { 192, 168, 1, 102 });//IP
                TcpListener listener = new TcpListener(ip, 8500);
                listener.Start();//开始侦听
    
                Console.WriteLine("start listener ...");
            
                //获取一个链接中断方法
                TcpClient remoteclient = listener.AcceptTcpClient();
                //打印链接到客户端的信息
                Console.WriteLine("client connected ! Local:{0}<-- Client:{1}", remoteclient.Client.LocalEndPoint, remoteclient.Client.RemoteEndPoint);
           
                //获取流,并写入Buffer中
                NetworkStream streamToClient = remoteclient.GetStream();
                byte[] buffer = new byte[BufferSize];
                int bytesRead = streamToClient.Read(buffer, 0, BufferSize);
    
                //获得请求字符串
                string msg = Encoding.Unicode.GetString(buffer, 0, bytesRead);
                Console.WriteLine("Received:{0}[{1}bytes]", msg, bytesRead);
    
                Console.WriteLine("
    
    输入"Q"键退出。");
                ConsoleKey key;
                do
                {
                    key = Console.ReadKey(true).Key;
    
                } while (key != ConsoleKey.Q);
            }
        }
    View Code

      如果传递的数据字节比较大,如图片、音频等,则采用“分次读取然后转存”的方式,代码如下:

    //获取字符串
    byte [] buffer = new byte[BufferSize];
    
    int bytesRead; //读取的字节数
    
    MemoryStream ms =new  MemoryStream();
    do{
         bytesRead = streamToClient.Read(buffer,0,BufferSize);
         ms.Write(buffer,0,bytesRead);       
    }while(bytesRead > 0);
    
    buffer = msStream.GetBuffer();
    string msg = Encoding.Unicode.GetString(buffer);
    View Code

    2、客户端程序

      客户端向服务器发送字符串的代码与服务器端类似,先获取链接服务器端的流,将字符串保存到buffer缓存中,再写入流,写入流的过程就相当于将消息发送到服务器端。

    class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("client is running ...");
                TcpClient clint;
                try
                {
                    clint = new TcpClient();
                //与服务器建立连接
                    clint.Connect(IPAddress.Parse("192.168.1.102"), 8500);
    
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    return;
                }
     
            //打印连接到服务器端的信息
                Console.WriteLine("client connected ! Local:{0}<-- Client:{1}", clint.Client.LocalEndPoint, clint.Client.RemoteEndPoint);
    
            //要发送的信息
                string msg = "hello";
                NetworkStream streamToServer = clint.GetStream();
    
                //获取缓存
                byte[] buffer = Encoding.Unicode.GetBytes(msg);
                //发送
                streamToServer.Write(buffer, 0, buffer.Length);
                Console.WriteLine("Sent:{0}", msg);
    
                Console.WriteLine("
    
    输入"Q"键退出。");
                ConsoleKey key;
                do
                {
                    key = Console.ReadKey(true).Key;
    
                } while (key != ConsoleKey.Q);
    
            }
        }
    View Code

     这样就可以成功的发送和接收一个字符串了,如果想完成一些复杂的不间断的交互就需要自己做一些调整了。

  • 相关阅读:
    java 的 线程池应用和实践
    拦截信息短信息并转发到指定手机
    分享 UC优视 的android程序员面试题
    解释通讯协议中的xml
    设计模式工厂模式
    MongoDB基础教程系列第一篇 进入MongoDB世界
    Docx组件读写Word文档介绍
    [转]Oracle数据库逻辑增量备份之exp/imp
    JSON文件读取
    JAVA综合--如何掌握JDK1.5枚举类型[转]
  • 原文地址:https://www.cnblogs.com/shuaichao/p/3788087.html
Copyright © 2020-2023  润新知