
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.Net;
using System.Threading;
using System.IO;
namespace socket
{
    public partial class 客户端 : Form
    {
        public 客户端()
        {
            InitializeComponent();
            TextBox.CheckForIllegalCrossThreadCalls = false;
        }
        Socket socketClient;
        
        //连接服务器
        private void button1_Click(object sender, EventArgs e)
        {
            socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress address = IPAddress.Parse(textBox1.Text);
            IPEndPoint endpoint = new IPEndPoint(address, int.Parse(textBox2.Text));
            //向指定的IP和端口发送连接请求
            try
            {
                socketClient.Connect(endpoint);
            }
            catch (SocketException ex)
            {
                textBox3.AppendText("异常:"+ex.Message+"\r\n");
                return;
                
            }
            textBox3.AppendText("连接服务器成功!\r\n");
            //定义一个接收用的缓冲区
            Thread threadWatch = new Thread(receive);
            threadWatch.IsBackground = true;
            threadWatch.Start();
        }
        void receive()
        {
            while (true)
            {
                byte[] msg = new byte[1024 * 1024 * 2];
                //接收到的信息的长度
                int length=-1;
                try
                {
                    length = socketClient.Receive(msg);
                }
                catch (Exception ex)
                {
                    textBox3.AppendText("异常:" + ex.Message + "\r\n");
                    return;
                }
                //在客户端显示
                textBox3.AppendText("接收数据:"+System.Text.Encoding.UTF8.GetString(msg, 0, length)+"\r\n");
            }
        }
        private void button2_Click(object sender, EventArgs e)
        {
            //发送文字
            //将要发送的字符串转成utf8对应的字节数组
            byte[] message = System.Text.Encoding.UTF8.GetBytes(textBox4.Text);
            byte[] message1=new byte[message.Length+1];
            message1[0] = 0;//代表发送的是文字
            Buffer.BlockCopy(message,0,message1,1,message.Length);
            try
            {
                socketClient.Send(message1);
            }
            catch (SocketException ex)
            {
                textBox3.AppendText("异常:" + ex.Message + "\r\n");
                return;
            }
            catch (Exception ex)
            {
                textBox3.AppendText("异常:" + ex.Message + "\r\n");
                return;
            }
            textBox3.AppendText("发送数据:" + textBox4.Text + "\r\n");
        }
        private void button3_Click(object sender, EventArgs e)
        {
            //选择要发送的文件
            OpenFileDialog ofd = new OpenFileDialog();
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                textBox5.Text =ofd.FileName;
            }
        }
        private void button4_Click(object sender, EventArgs e)
        {
            //发送文件
            try
            {
                using (FileStream fs = new FileStream(textBox5.Text, FileMode.Open))
                {
                    byte[] arr = new byte[1024 * 1024 * 2];
                    //将文件数据读到数组arr中,并获得读取的真实数据长度length
                    int length = fs.Read(arr, 0, arr.Length);
                    byte[] arr2 = new byte[length + 1];
                    arr2[0] = 1; //代表发送的是文件数组
                    //将arr数组里的元素从第0个开始拷贝,拷贝到arr2数组中,从第一个位置开始存放,一共拷贝length个数据
                    Buffer.BlockCopy(arr, 0, arr2, 1, length);
                    //放松包含标识位的新数据组到服务端
                    socketClient.Send(arr2);
                }
            }
            catch (Exception ex) 
            {
                textBox3.AppendText("异常:" + ex.Message + "\r\n");
            }
        }
    }
}