C#的一个客户端和服务器端例子

TcpClient和TcpListene的例子


参考 c#入门经典一书


1 Server端  

控制台程序

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

namespace PictureServer
{
    class Program
    {
        static void Main(string[] args)
        {
            TcpListener listener = new TcpListener(IPAddress.Any, Properties.Settings.Default.Port);
            listener.Start();

            while (true)
            {
                const int bufferSize = 256;

                TcpClient client = listener.AcceptTcpClient();
                NetworkStream clientStream = client.GetStream();

                byte[] buffer = new byte[bufferSize];
                int readBytes = 0;
                readBytes = clientStream.Read(buffer, 0, bufferSize);

                string request = Encoding.ASCII.GetString(buffer).Substring(0, readBytes);

                if (request.StartsWith("LIST"))
                {
                    byte[] responseBuffer = PictureHelper.GetFileListBytes();

                    clientStream.Write(responseBuffer, 0, responseBuffer.Length);
                }
                else if (request.StartsWith("FILE"))
                {
                    string[] requestMessage = request.Split(':');
                    string filename = requestMessage[1];

                    byte[] data = File.ReadAllBytes(Path.Combine(Properties.Settings.Default.PictureDirectory, filename));

                    clientStream.Write(data, 0, data.Length);
                }

                clientStream.Close();
            }

        }
    }
}


一个静态的辅助类 PictureHelper
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace PictureServer
{
    public static class PictureHelper
    {
        public static string[] GetFileList()
        {
            string[] files = Directory.GetFiles(Properties.Settings.Default.PictureDirectory);

            for (int i = 0; i < files.Length; i++)
            {
                files[i] = Path.GetFileName(files[i]);
            }
            return files;
        }

        public static byte[] GetPictureBytes(string filename)
        {
            FileInfo fileInfo = new FileInfo(filename);
            byte[] buffer = new byte[fileInfo.Length];
            using (FileStream stream = fileInfo.OpenRead())
            {
                stream.Read(buffer, 0, buffer.Length);
            }
            return buffer;
        }

        public static byte[] GetFileListBytes()
        {
            String[] files = PictureHelper.GetFileList();
            StringBuilder responseMessage = new StringBuilder();
            foreach (string str in files)
            {
                responseMessage.Append(str);
                responseMessage.Append(":");
            }
            byte[] responseBuffer = Encoding.ASCII.GetBytes(responseMessage.ToString());
            return responseBuffer;
        }
    }
}

2 Client端

winform程序

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;
using System.Net.Sockets;
using System.IO;

namespace PictureClient
{
    public partial class PictureClientForm : Form
    {
        public PictureClientForm()
        {
            InitializeComponent();
        }

        private void buttonListPicture_Click(object sender, EventArgs e)
        {
            const int bufferSize = 4096;

            TcpClient client = new TcpClient();

            try
            {
                client.Connect(Properties.Settings.Default.Server, Properties.Settings.Default.ServerPort);
            }
            catch (Exception ex)
            {
                throw (ex);
            }

            NetworkStream clientStream = client.GetStream();
            string request = "LIST";
            byte[] requestBuffer = Encoding.ASCII.GetBytes(request);
            clientStream.Write(requestBuffer, 0, requestBuffer.Length);

            byte[] responseBuffer = new byte[bufferSize];
            MemoryStream memStream = new MemoryStream();
            int bytesRead = 0;
            do
            {
                bytesRead = clientStream.Read(responseBuffer, 0, bufferSize);
                memStream.Write(responseBuffer, 0, bytesRead);
            } while (bytesRead > 0);
            clientStream.Close();
            client.Close();

            byte[] buffer = memStream.GetBuffer();
            string response = Encoding.ASCII.GetString(buffer);
            string[] fileNames = response.Split(':');
            this.listFiles.DataSource = fileNames;
        }

        private void buttonGetPicture_Click(object sender, EventArgs e)
        {
            const int bufferSize = 4096;

            TcpClient client = new TcpClient();

            try
            {
                client.Connect(Properties.Settings.Default.Server, Properties.Settings.Default.ServerPort);
                NetworkStream clientStream = client.GetStream();

                string request = @"FILE:" + this.listFiles.SelectedItem.ToString();
                byte[] requestBuffer = Encoding.ASCII.GetBytes(request);
                clientStream.Write(requestBuffer, 0, requestBuffer.Length);

                byte[] responseBuffer = new byte[bufferSize];
                MemoryStream memStream = new MemoryStream();
                int bytesRead = 0;
                do
                {
                    bytesRead = clientStream.Read(responseBuffer, 0, responseBuffer.Length);
                    memStream.Write(responseBuffer, 0, bytesRead);
                } while (bytesRead > 0);
                clientStream.Close();
                client.Close();

                this.pictureBox.Image = Image.FromStream(memStream);
            }
            catch (Exception ex)
            {
            }
      
        }
    }
}

源码地址

此程序需要进一步完善  在visual studio 2010下面编译成功

http://download.csdn.net/detail/fffanpei/6929083

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值