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;
允许主线程以外的线程访问窗体上的控件 。

浙公网安备 33010602011771号