避免跨线程程序出现问题
Control.CheckForIllegalCrossThreadCalls = false;
客户端
1创建一个负责监听的Socke
Socket socketWatch = new Socket(
AddressFamily.InterNetwork,
SocketType.Stream, //Socket的模式
ProtocolType.Tcp //协议
);
2创建ip地址和端口号对象
IPAddress ip = IPAddress.Any;
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));
3让负责监听的socket绑定ip地址和端口号
socketWatch.Bind(point);
ShowMsg("监听成功");
4设置监听队列(一个时间内同时可以访问的人数)
socketWatch.Listen(10);
5开始监听(为了保证监听过程中不死机,把监听的过程设成一个新的线程)
Thread th = new Thread(Listen); //创建一个线程来执行Listen这个监听过程
th.IsBackground = true; //设置成后台线程
th.Start(socketWatch); //利用th.start传参
Listen里的代码(在获取访问者的ip,获取过程中避免死机,再申请一个线程来完成访问过程)
void Listen(object o)
{
Socket socketWatch = o as Socket;
while (true)
{
//Accept能够接受客户端的连接,并且创建一个负责通信的socket
socketSend = socketWatch.Accept();
//获取链接的电脑的ip
ShowMsg(socketSend.RemoteEndPoint.ToString() + "连接成功");
Thread t = new Thread(Recive);
t.IsBackground = true;
t.Start(socketSend);
}
}
Recive里的代码
void Recive(object ss)
{
//as用法,如果ss可以强转为Socket,则强转后返回,不可以则返回NULL
Socket socketSend = ss as Socket;
while (true)
{
try
{
//客户端连接成功后,服务器应该接受客户端发来的消息
byte[] buffer = new byte[1024 * 1024 * 2];
//接收到的实际有效个数
int r = socketSend.Receive(buffer);
//如果r等于0,则证明客户端已下线
if (r == 0)
{
break;
}
string str = Encoding.UTF8.GetString(buffer, 0, r);
ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + str);
}
catch
{ }
}
}
6.向客户端发消息
string str = txtMsg.Text.Trim();
byte[] buffer = Encoding.UTF8.GetBytes(str);
string ip = cbousers.SelectedItem.ToString();
sockets[ip].Send(buffer);
showMsg
void ShowMsg(string str)
{
txtLog.AppendText(str + "\r\n");
}
客户端
1创建负责通信的socket
socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress iP = IPAddress.Parse(txtServer.Text);//服务器的ip
IPEndPoint point = new IPEndPoint(iP, Convert.ToInt32(txtPort.Text));
2绑定建立连接
socketSend.Connect(point);
3.send(发送信息)
string str = txtMsg.Text.Trim(); //去除字符串前后空格
byte[] bytes = Encoding.UTF8.GetBytes(str);
List<byte> list = new List<byte>();
list.AddRange(bytes);
byte[] buffer = list.ToArray();
socketSend.Send(buffer);
4.recive(接受服务端返回的消息)
void Recive(object ss)
{
//as用法,如果ss可以强转为Socket,则强转后返回,不可以则返回NULL
Socket socketSend = ss as Socket;
while (true)
{
try
{
//客户端连接成功后,服务器应该接受客户端发来的消息
byte[] buffer = new byte[1024 * 1024 * 2];
int r = socketSend.Receive(buffer);
if (r == 0)
{
break;
}
string str = Encoding.UTF8.GetString(buffer, 0, r);
ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + str);
}
catch
{ }
}
}