本次项目增加的引用
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("客户端连接成功!" + "
");
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 + "
");
}
}
}
catch (SocketException SE)
{
textBox1.AppendText("连接断开"+"
");
}
}
控件默认是单线程的,所以要禁止多线程检查,这样就不会报莫名奇怪的错了
这里的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));
}
这里客户端存在一个问题,可以建立很多个连接,但是服务端不知道,因为服务端接收到的连接套接字 句柄 没次都可以不一样
这仅仅有 客户端发送和服务端接受的功能。
那么互相发送又该如何呢?多人通讯呢?