//创建监听
void startListing()
{
try{
//创建一个负责监听的socket
Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = "192.168.1.2";// IPAddress.Parse(texIP.Text);
IPEndPoint endPoint = new IPEndPoint(ip, 8088); //设置ip 及端口号
socketWatch.Bind(endPoint); //绑定IP + 端口
ShowMsg("监听成功");
socketWatch.Listen(10); //设置监听数量
Thread thread = new Thread(Listen); //开启一个新线程专门用于监听
thread.IsBackground = true;
thread.Start(socketWatch);
}
catch{
}
}
//监听
void Listen(object obj)
{
Socket socketWatch = obj as Socket;
while(true) {
try{
//Accept() 监听会阻塞线程所以放在新线程中
Socket socketCommunication = socketWatch.Accept(); //每个连进来的客户端都要创建一个负责跟其通信的socket
ShowMsg(socketCommunication.RemoteEndPoint.ToString() + ":连接成功");
Thread thread = new Thread(Receive); //开启一个新线程专门用于这个socket接收消息
thread.IsBackground = true;
thread.Start(socketCommunication)
}
catch{
}
}
}
接下来服务端就要接收来自客户端输入的信息,即继续完善服务端Listen方法,通过负责通信的socket
调用Receive 方法即可接收到客户端的消息。
//用于socket接收消息 不断循环接收
//接收消息
void Receive(object obj)
{
Socket socketCommunication = obj as Socket;
byte[] buffer = new byte[1024*1024*2]; //定义2M内存用于接收数据
while(true) {
try{
//r 表示实际接收到的字节数
int r = socketCommunication.Receive(buffer);
if(r == 0) { //0 表示客户端关闭了
//break; //结束循环 也结束线程
socketCommunication.Shutdown(SocketShutdown.Both); //关闭socket Both表示接收 发送都关闭
socketCommunication.Close();
return;
}
string str = Encodeing.UTF8.GetString(buffer, 0, r);
//显示消息
show(socketCommunication.RemoteEndPoint.ToString() + ":" + str);
}
catch{
}
}
}
//发送消息
void Send(Socket socket)
{
string str = "发送一条消息";
byte[] buffer = Encodeing.UTF8.GetBytes(str);
socket.Send(buffer);
}
在网络通信过程中容易出现各种异常,比如在客户下线时,非正常退出(断网、停电等),所以一般对网络通信的
相关代码要用try catch ,而且在catch里面什么都不写,这样就不会把异常信息显示给用户,对用户来说就没有异常了,
实际上大家可以利用反编译器看下微软的通信方法代码,可以看到使用了很多try catch。