Socket 编程(二)
首先,看主界面
点击链接按钮,开始建立与服务端的连接
Socket socket = null; private void btnStart_Click(object sender, EventArgs e) { IPAddress ip = IPAddress.Parse(txtIP.Text); //获取IP地址 IPEndPoint enpoint = new IPEndPoint(ip, int.Parse(txtPort.Text)); //获取网络端点(IP+端口号) //创建Socket对象,连接服务器端 socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { socket.Connect(enpoint); //连接 SetText("连接成功!"); this.btnStart.Enabled = false; //连接成功后,按钮禁用 //接收服务器消息 Thread th = new Thread(RecMsg); //在另一个线程中接收服务端发来的信息 th.Start(); } catch(Exception ex) { SetText(ex.Message); } }
那么我们再来看看这个RecMsg方法
void RecMsg() { while (true) { byte[] buffer = new byte[1024 * 1024 * 5]; //消息大小不能超过5M int count = -1; try { //接收的有效信息 count = socket.Receive(buffer); } catch(Exception ex) { SetText(ex.Message); break; } int flag=buffer[0]; 、//获取消息的第一个字节,0代表是字符,1代表是文件 if (flag == 0)//接收文字 { //首字节是标示符,所以重第二个位置开始转换 string s = Encoding.UTF8.GetString(buffer, 1, count-1); SetText(s); } else if (flag == 1)//接收文件 { SaveFileDialog sfd = new SaveFileDialog(); if (sfd.ShowDialog(this) == DialogResult.OK) { //创建文件流 using (FileStream fs = new FileStream(sfd.FileName, FileMode.Create)) { fs.Write(buffer, 1, count - 1); //将buffer中的数据写入到文件流中 MessageBox.Show("保存车成功!"); } } } } }
现在我们已经能接收到服务端发来的消息了,再来看看向服务端发送消息
private void btnSend_Click(object sender, EventArgs e) { if (socket != null) { try { byte[] buffer = Encoding.UTF8.GetBytes(txtMessage.Text); socket.Send(buffer); } catch(Exception ex) { SetText(ex.Message); } } } }
最后提示一下:要在窗体构造函数中添加一行代码
Control.CheckForIllegalCrossThreadCalls = false;
允许主线程以外的线程访问窗体上的控件 。