zoukankan      html  css  js  c++  java
  • 关于字符编码、对象传递、文件传递、字符串传递、 TcpClient、TcpListener的又一个应用

    点击此处下载源代码
    客户端向服务器传递字符串格式1:
    //send a header to show it will be followed by a binary file
    byte[] header = System.Text.Encoding.UTF8.GetBytes("FILE\r\n");  //换行符的书写格式
    ns.Write(header, 0, header.Length);

    客户端向服务器传递字符串格式2:
    TcpClient tc = new TcpClient();
     tc.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), port));

     NetworkStream ns = tc.GetStream();
     StreamWriter sw = new StreamWriter(ns);
     sw.AutoFlush = true;
     StreamReader sr = new StreamReader(ns);

    sw.WriteLine("PROSPECT"); //第二种传递格式,默认为utf8编码
    sw.WriteLine(p.ToString());

    string response = sr.ReadLine(); //获得服务器端回应
     switch (response)
    {
       case "PROSPECT_OK":
          MessageBox.Show("数据写入成功!");
          break;
       case "PROSPECT_ERROR":
         MessageBox.Show("数据写入失败!");
         break;
     }
                     
         
    服务器端接收方式:
     TcpClient incomingClient = listener.AcceptTcpClient();
     NetworkStream ns = incomingClient.GetStream();
     StreamReader sr = new StreamReader(ns,System.Text.UTF8Encoding.UTF8);
     StreamWriter sw = new StreamWriter(ns, System.Text.UTF8Encoding.UTF8);

     String operation = sr.ReadLine(); //服务器端读取数据
     w.WriteLine("PROSPECT_OK"); //服务器端写回客户端数据
     sw.Flush();

    服务器端:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net.Sockets;
    using System.IO;
    using System.Net;
    using SocketSample_2;

    namespace SocketSample_Server
    {
        class Program
        {
             //listen on custom tcp port
            private const int port = 38081;

            static void Main(string[] args)
            {
                new Program().ListenerThread();
            }

            private void ListenerThread()
            {
                TcpListener listener = new TcpListener(new IPEndPoint(IPAddress.Any, port));
                listener.Start();
               
                try
                {
                    while (true)
                    {
                        Console.WriteLine("");
                        Console.WriteLine("等待客户端连接... ... ...");


                        TcpClient incomingClient = listener.AcceptTcpClient();
                       
                        //get address of remove device
                        IPAddress senderAddress = ((IPEndPoint)incomingClient.Client.RemoteEndPoint).Address;
                      
                        //get a stream to read from the socket
                        NetworkStream ns = incomingClient.GetStream();
                        try
                        {

                            StreamReader sr = new StreamReader(ns,System.Text.UTF8Encoding.UTF8);
                            StreamWriter sw = new StreamWriter(ns, System.Text.UTF8Encoding.UTF8);

                            string operation = sr.ReadLine();

                           
                            Console.WriteLine("将要执行:"+operation);

                            if (operation == "exit")
                            {
                                Console.WriteLine("程序结束!");
                                break;
                             
                            }

                            if (operation == "PROSPECT")
                            {
                               
                                string rawProspect = sr.ReadLine();
                                string[] fields = rawProspect.Split(',');

                                if (fields.Length == 3)
                                {
                                    sw.WriteLine("PROSPECT_OK");
                                    sw.Flush();
                                    Console.WriteLine("PROSPECT_OK");
                                }
                                else
                                {
                                    sw.WriteLine("PROSPECT_ERROR");
                                    sw.Flush();
                                    Console.WriteLine("PROSPECT_ERROR");

                                }

                                Prospect receivedProspect = new Prospect();
                                receivedProspect.Name = fields[0];
                                receivedProspect.Company = fields[1];
                                receivedProspect.Number = fields[2];
                               

                                Console.WriteLine("接收到_PROSPECT:" + senderAddress.ToString()+" "+receivedProspect.ToString());
                            }
                           
                            if (operation == "FILE")
                            {
                                //filename
                                string filename = sr.ReadLine();
                                Console.WriteLine("文件名:"+filename);

                                //file length
                                byte[] len = new byte[8];
                                ns.Read(len, 0, 8);
                                Int64 fileSize = BitConverter.ToInt64(len, 0);
                                Console.WriteLine("文件长度:"+fileSize);

                                //write file
                                FileStream fs = new FileStream(Path.Combine(System.Environment.GetFolderPath(Environment.SpecialFolder.Personal), filename), FileMode.CreateNew);
                                byte[] buffer = new byte[4096];
                                int bytesRead = 0;
                                do{
                                    bytesRead = ns.Read(buffer, 0, 4096);
                                    fs.Write(buffer, 0, bytesRead);
                                } while (bytesRead > 0);
                                fs.Close();

                                sw.WriteLine("FILE_OK"); (此处应该删掉,因为发送的程序已经关闭了数据流) 2009.10.15日
                                Console.WriteLine("FILE_OK");
                            }
                        }
                        catch(Exception e)
                        {
                            ns.Close();
                            Console.WriteLine(e.Message + " ERROR");
                        }
                    }//end while
                }catch{
                    //transfer failed
                   Console.WriteLine("Failed");
                }
                finally
                {
                    //stop the listener
                    listener.Stop();
                }
            }//end ListenerThread
        }
    }


    客户端:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Net.Sockets;
    using System.Threading;
    using System.IO;
    using System.Net;

    namespace SocketSample_2
    {
        public partial class Form1 : Form
        {
            //listen on custom tcp port
            private const int port = 38081;


            public Form1()
            {
                InitializeComponent();
            }


            private void button_sendFile_Click(object sender, EventArgs e)
            {
                //pick a file
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    //only perform if file was selected
                    TcpClient tc = new TcpClient();
                    tc.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), port));
                    NetworkStream ns = tc.GetStream();

                    try
                    {
                        //send a header to show it will be followed by a binary file
                        byte[] header = System.Text.Encoding.UTF8.GetBytes("FILE\r\n");
                        ns.Write(header, 0, header.Length);
                   
                        //send the filename
                        string filename = Path.GetFileName(openFileDialog1.FileName);
                        header = System.Text.Encoding.UTF8.GetBytes(filename + "\r\n");
                        ns.Write(header, 0, header.Length);
                  
                        //send the file length (int64 - 8 bytes)
                        FileInfo fi = new FileInfo(openFileDialog1.FileName);
                        byte[] buffer = BitConverter.GetBytes(fi.Length);
                        ns.Write(buffer, 0, buffer.Length);

                        //send the file contents
                        FileStream fs = new FileStream(filename, FileMode.Open);
                        buffer = new byte[fs.Length];
                        fs.Read(buffer, 0, (int)fs.Length);
                        fs.Close();
                        ns.Write(buffer, 0, buffer.Length);
                    }
                    catch (SocketException se)
                    {
                        MessageBox.Show(se.NativeErrorCode.ToString() + ": " + se.ToString());
                    }
                    finally
                    {
                        ns.Close();
                        tc.Close();
                    }
                    MessageBox.Show("文件发送完毕!");
                }
            }

            //send object
            private void button_Prospect_Click(object sender, EventArgs e)
            {
                //create prospect object
                Prospect p = new Prospect();
                p.Name = "qihuaifeng";
                p.Company = "ahnu";
                p.Number = "1";

                TcpClient tc = new TcpClient();
                tc.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), port));

                NetworkStream ns = tc.GetStream();
                StreamWriter sw = new StreamWriter(ns);
                sw.AutoFlush = true;
                StreamReader sr = new StreamReader(ns);

                try
                {
                    sw.WriteLine("PROSPECT");
                    sw.WriteLine(p.ToString());

                    string response = sr.ReadLine();
                    switch (response)
                    {
                        case "PROSPECT_OK":
                            MessageBox.Show("数据写入成功!");
                            break;
                        case "PROSPECT_ERROR":
                            MessageBox.Show("数据写入失败!");
                            break;
                    }
                    
                 
                }
                catch (SocketException se)
                {
                    MessageBox.Show("Socket Exception trying to send: " + se.ToString());
                }
                finally
                {
                    ns.Close();
                }
            }

            private void button_Exit_Click(object sender, EventArgs e)
            {
                TcpClient tc = new TcpClient();
                tc.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), port));

                NetworkStream ns = tc.GetStream();
                StreamWriter sw = new StreamWriter(ns);
                sw.AutoFlush = true;
               try
               {
                   sw.WriteLine("exit");
                   MessageBox.Show("服务器已经停止!");
                }
                catch (SocketException se)
                {
                    MessageBox.Show("Socket Exception trying to send: " + se.ToString());
                }
                finally
                {
                    ns.Close();
                }

            }
        }
    }

  • 相关阅读:
    Clob实践
    Read Clob字段 Function最终版
    asp.net mvc proflie 使用 区别 疑惑
    csdn中关于程序员的一封信
    【解惑】女生适合干计算机什么方面的工作
    网络女友跟现实女友的区别
    [转]俞敏洪老师郑州大学演讲
    【解惑】这么多技术我该怎么学
    google使用技巧
    杨澜给二十几岁女孩子的忠告
  • 原文地址:https://www.cnblogs.com/qqhfeng/p/1582975.html
Copyright © 2011-2022 走看看