天天看点

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

------- 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培训、期待与您交流! -------