socket学习 同步
来源:互联网 发布:怎么在淘宝上写评价 编辑:程序博客网 时间:2024/06/05 20:00
socket分为2种模式,同步和异步,
同步:
服务器端
建立联接,首先声明一个全局的Socket,这个必须是全局的,因为其他的地方还需要使用这个实例。
Socket socket;
建立监听
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse("192.168.200.212"), 1234);
socket.Bind(ipEndPoint);
socket.Listen(10);
这样就建立了允许最多10个用户的监听,
然后建立线程监听获得的消息
Thread t = new Thread(StartListener);
t.IsBackground = true;
t.Start();
这个线程是为了接收多个客户端联接。
以上代码可以放到Page_load里,或者放到服务器的启动按钮里。
private void StartListener()
{
while (true)
{
byte[] packBuff = new byte[maxSize];
Socket newClient =socket.Accept();
newClient.Receive(packBuff);
string ip = Encoding.UTF8.GetString(packBuff).TrimEnd('/0');
ht.Add(ip, newClient);//这里是把联接的客户端更新下,不影响核心逻辑
UpdateOnlineUserList(ip, true);//这里是把联接的客户端更新下,不影响核心逻辑
System.Threading.Thread t = new System.Threading.Thread(new ParameterizedThreadStart(ReceivedMsg));
t.IsBackground = true;
t.Start(ip);
}
}
在监听线程里把链接的客户端保存起来,同时建立一个线程来启动接收数据
private void ReceivedMsg(object userName)
{
while (true)
{
Socket clientSocket = ht[userName] as Socket;
byte[] buff = new byte[128];
clientSocket.Receive(buff);
string message = Encoding.UTF8.GetString(buff).TrimEnd('/0');
if (message == "")
{
continue;
}
string flag = message.Substring(0, 2);
this.Invoke((EventHandler)delegate
{
lstReceiveMsg.Items.Add(message + "_"+flag+"_" + userName);
});
switch (flag)
{
case"01":
ht.Remove(userName);
UpdateOnlineUserList(userName.ToString(),false);
Thread.CurrentThread.Abort();
break;
default:
string ip = message.Split('#')[0];
if (ht.ContainsKey(ip))
{
this.Invoke((EventHandler)delegate
{
lstReceiveMsg.Items.Add("Send " + ip + " Say:" + message.Split('#')[1]);
});
Socket talkSocke = ht[ip] as Socket;
talkSocke.Send(Encoding.UTF8.GetBytes(userName.ToString()+" Say:"+message.Split('#')[1]));
}
break;
}
}
}
这里接收到数据,同时进行处理,
客户端:
建立联接,首先声明一个全局的Socket,这个必须是全局的,因为其他的地方还需要使用这个实例。
Socket socket;
建立连接
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse("192.168.200.212"), 1234);
socket.Connect(ipEndPoint);
新建线程来获取接收数据
Thead t = new Thread(ReceivedMsg);
t.IsBackground = true;
t.Start();
以上代码可以放到Page_load或者联接按钮里。
private void ReceivedMsg()
{
while (true)
{
byte[] b = new byte[1024*60];
socket.Receive(b);
string message = Encoding.UTF8.GetString(b).TrimEnd('/0');
}
}
这里是解决接收数据的线程。
- socket学习 同步
- Socket同步异步学习
- C#学习笔记-socket通信(同步,客户端+服务器,TCP)
- boost-asio学习2——同步、异步socket处理
- 异步SOCKET与同步SOCKET
- Socket 同步与异步
- c# SOCKET同步通信
- socket同步通讯过程
- 同步与异步Socket
- socket同步与异步
- IOS Socket 同步方式
- 同步与异步Socket
- Socket同步异步通信
- socket同步与异步
- socket同步与异步
- c#同步Socket
- 同步与异步Socket
- socket同步与异步
- Java多线程详解--转载
- 从nand的启动的uboot
- w%r指标及其应用
- MACD指标及其应用
- 去除NSString字符串的前后空格和换行符
- socket学习 同步
- Nutch 的命令
- 时间复杂度分析
- C#导出txt
- c# winform 程序打包部署
- QGraphicsItem子类对象间消息的传递与获取
- QT对话框显示中文文件名
- Problem32
- GCC 参数