点击此处下载源代码
客户端向服务器传递字符串格式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();
            }

        }
    }
}

posted on 2009-10-14 09:58  qqhfeng16  阅读(1538)  评论(0编辑  收藏  举报