Socket 学习(一)
本次项目增加的引用
using System.Net; using System.Net.Sockets; using System.Threading;
TextBox.CheckForIllegalCrossThreadCalls = false;//禁止多线程检查
Socket S1;//发送方套接字(本方) Socket S2;//接收到的套接字(对方) Thread T1; Thread T2; private void button1_Click(object sender, EventArgs e) { button1.Enabled = !button1.Enabled; S1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//实例化自己的套接字 S1.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 80));//绑定自己的终结点(有信息,请通过这个IP的这个端口发给我) S1.Listen(10); // 侦听 参数的意思是最多连接数 T1 = new Thread(StartListen); //开启多线程 对侦听的信息做回应 T1.IsBackground = true; T1.Start(); } void StartListen() { while (true) { S2 = S1.Accept(); //Accept :返回接收套接字 textBox1.AppendText("客户端连接成功!" + "\r\n"); T2 = new Thread(TheadReceive);//多线程Receive T2.IsBackground = true; T2.Start(); } } void TheadReceive() { try { while (true) { byte[] ByteData = new byte[1024 * 1024]; //设置最大字节数1M int length = S2.Receive(ByteData); // Receive:参数表示 接收方的套接字 内容,返回内容长度,最重要的 它监听过程中会阻断当前线程(就是说:接受了一次之后就终止了线程,循环,本次完成循环就终止了) string Message = Encoding.UTF8.GetString(ByteData, 0, length);//byte转string if (!string.IsNullOrEmpty(Message)) { textBox1.AppendText(Message + "\r\n"); } } } catch (SocketException SE) { textBox1.AppendText("连接断开"+"\r\n"); } }
控件默认是单线程的,所以要禁止多线程检查,这样就不会报莫名奇怪的错了
这里的IP 和端口 是 表示 ,别人访问我,就要用此IP和 此端口
下面是客户端的
就4行代码
Socket S1; Thread T1; private void button1_Click(object sender, EventArgs e) { S1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); S1.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 80)); } private void button2_Click(object sender, EventArgs e) { S1.Send(Encoding.UTF8.GetBytes(textBox1.Text));
}
这里客户端存在一个问题,可以建立很多个连接,但是服务端不知道,因为服务端接收到的连接套接字 句柄 没次都可以不一样
这仅仅有 客户端发送和服务端接受的功能。
那么互相发送又该如何呢?多人通讯呢?