C# socket和多线程开发

//创建监听

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。

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值