设置控件(下面的是richTextBox)
连接按钮事件
Socket socket; // 全局的socket对象,套接字,实现tcp通信的类
private void button1_Click(object sender, EventArgs e)
{
if (button1.Text == "连接")//连接功能
{
try
{
//构造函数参数1是socket类型,传递的数据是数据流类型
// 参数2是使用的协议,ProtocolType.Tcp tcp协议
//1 创建基于流的套接字对象
socket = new Socket(SocketType.Stream,ProtocolType.Tcp);
//2 连接到指定的tcp远程服务器
//Connect 连接,参数1是远程ip地址,
//参数2 是端口号
socket.Connect(this.textBox1.Text,int.Parse(this.textBox2.Text));
//修改按钮的标题
button1.Text = "断开";
textBox1.Enabled = false; //输入框不可用
textBox2.Enabled = false;// 输入框不可用
//4接受数据 封装一个方法接受数据
startReceive();
}
catch (Exception)
{
MessageBox.Show("连接失败");
}
}
else
{
//按钮的标题是断开的时候
//断开连接
socket.Close();
//设置状态
button1.Text = "连接";
textBox1.Enabled = true; //输入框可用
textBox2.Enabled = true;// 输入框可用
}
//MessageBox.Show(socket.Connected + ""); //连接状态
}
//接受数据方法
public void startReceive()
{
//开启一个分线程去接收
// Thread 分线程
Thread t = new Thread(() =>
{
// 重复的接收数据,直到数据被接收完了
while (true)
{
try
{
byte[] bs = new byte[50]; //字节数组,
int count = socket.Receive(bs);//读取socket返回的数据 一次从返回数据接收指定长度的数据
// 如果socket数据接收完了或者断开的连接,会接受到0字节大小的数据,count就等于0,
if (count == 0)
{
BeginInvoke(new Action(() =>
{
button1.Text = "连接";
textBox1.Enabled = true; //输入框可用
textBox2.Enabled = true;// 输入框可用
}));
//断开连接 把断开连接字符串写入富文本框中
WriteRich("连接已经断开");
break;
}
// 把接受到数据写入富文本框中
// bs 就是接受过来的数据
WriteRich(Encoding.UTF8.GetString(bs, 0, count));
}
catch (Exception)
{
WriteRich("连接已经断开");
break;
}
}
});
t.Start(); // 开启分线程
}
void WriteRich(string s)
{
BeginInvoke(new Action(()=>{
richTextBox1.AppendText(s + "\n");
richTextBox1.SelectionStart = richTextBox1.Text.Length;//把光标定到文件尾部。
richTextBox1.ScrollToCaret(); // 控件滚动光标处
}));
}
//发送按钮
发送按钮:
private void button2_Click(object sender, EventArgs e)
{
//3 发送数据(发送的是一个字节数组)
//Send() 参数1字节数组
byte[] bs = Encoding.UTF8.GetBytes(textBox3.Text);//把字符串按照默认编码方式进行编码
socket.Send(bs);
}
总结:
1 创建基于流的套接字对象
socket = new Socket(SocketType.Stream,ProtocolType.Tcp);
2 连接到指定的tcp远程服务器
socket.Connect(this.textBox1.Text,int.Parse(this.textBox2.Text));
3 发送数据(发送的是一个字节数组)
byte[] bs = Encoding.UTF8.GetBytes(textBox3.Text);
socket.Send(bs);
4 接受数据
byte[] bs = new byte[50]; //字节数组,
socket.Receive(bs);
string s = Encoding.UTF8.GetString(bs, 0, count) 把数据转成字符串