黑马程序员--套接之局域网聊天客户端(待续)

来源:互联网 发布:如何卖照片知乎 编辑:程序博客网 时间:2024/05/21 09:26

------- Windows Phone 7手机开发.Net培训、期待与您交流! -------


客户端的socket  

1.必须制定要连接的服务端地址和接口 

2.通过创建一个socket对象来初始化一个到服务器端的TCP连接。

System.Net 命名空间为当前网络上使用的多种协议提供了简单的编程接口。

System.Net.Sockets 命名空间为需要严密控制网络访问的开发人员提供了 Windows Sockets (Winsock) 接口的托管实现。

所以要先添加这两个命名空间。

 public Form1()
        {
            InitializeComponent();
            TextBox.CheckForIllegalCrossThreadCalls = false;//关闭微软对跨线程的检查
        }

Thread threadClient = null;


        private void textBox3_TextChanged(object sender, EventArgs e)
        {


        }
        Socket socketClient = null;
        private void btnConnect_Click(object sender, EventArgs e)
        {  

                // 获得文本框中的IP地址对象
            IPAddress address = IPAddress.Parse(txtIP.Text.Trim());

                //创建包含IP和Port的网络节点对象
            IPEndPoint endpoint = new IPEndPoint(address, int.Parse(txtPort.Text.Trim()));

            //创建服务端负责监听的套接字,参数(使用IP4寻址协议,使用流式连接,使用TCP协议传输数据。
             socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            // 将负责监听的套接字绑定到唯一的IP和端口上
            socketClient.Connect(endpoint);
                 //线程化
            threadClient = new Thread(RecMsg);
            threadClient.IsBackground = true;
            threadClient.Start();
            //byte[]arrMsgRec=new byte[1024*1024*2];
            //socketClient.Receive(arrMsgRec);
            //string strMsgRec = System.Text.Encoding.UTF8.GetString(arrMsgRec);
            //ShowMsg(strMsgRec);
        }
        void RecMsg()
        {
            while (true)
            {   //定义一个接受用的缓存区、(2M)
                byte[] arrMsgRec = new byte[1024 * 1024 * 2];
               // 将接收到的数据存入arrMsgRec数组中
                int length=socketClient.Receive(arrMsgRec);
                //此时是将数组所有的元素都转化成字符串,而真正接受的只有几个字符而已。
                string strMsgRec = System.Text.Encoding.UTF8.GetString(arrMsgRec,0,length);
                ShowMsg(strMsgRec);
            }
        }
           //向服务器发送文本消息  
        private void btnSendMsg_Click(object sender, EventArgs e)
        {
            string strMsg = txtMsgSend.Text.Trim();
                     //将字符串转成方便网络传送的二进制数据
            byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(strMsg);
            byte[] arrMsgSend = new byte[arrMsg.Length + 1];
            arrMsgSend[0] = 0;//设置标识位,0代表发送的是消息
            Buffer.BlockCopy(arrMsg, 0, arrMsgSend, 1, arrMsg.Length);
            socketClient.Send(arrMsgSend);
            ShowMsg("我说:" + strMsg);
        }
        #region 在窗体文本框中显示消息--void ShowMsg


        void ShowMsg(string msg)
        {
            txtMsg.AppendText(msg + "\r\n");
        } 
        #endregion


        #region 选择要发送的文件--void btnChooseFile_Click
        //选择要发送的文件
        private void btnChooseFile_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                txtFilePath.Text = ofd.FileName;
            }


        }


        #endregion


        //向服务端发送文件
        private void btnSendFile_Click(object sender, EventArgs e)
        {    
                    //用文件流打开用户选择的文件
            using (FileStream fs = new FileStream(txtFilePath.Text, FileMode.Open))
            {
                byte[] arrFile = new byte[1024 * 1024 * 2];//定义一个2兆的数组缓存区
                    //将文件数据读到数组arrFile中,并获得读取的真实数据长度
                int length=fs.Read(arrFile, 0, arrFile.Length);
                byte[] arrFileSend = new byte[length + 1];
                arrFileSend[0] = 1;//代表发送的是文件
                      //for (int i=0;i<length;i++)
                     //{
                    //    arrFileSend[i + 1] = arrFile[i];
                    //}
                    //将arrFile中的元素从0开始拷贝到arrFileSend中的第一个位置开始存放,存放length个元素。
                Buffer.BlockCopy(arrFile, 0, arrFileSend, 1, length);
                   //发送包含了标识位的新数据数组到服务端。
                socketClient.Send(arrFileSend);
                // 完全拷贝   arrFile.CopyTo(arrFileSend, length);




            }
        }


------- Windows Phone 7手机开发.Net培训、期待与您交流! -------