我用异步SOCKET写了一个程序,可在服务器在同一时间只能与一个客户端连接,望高手指点,让与其多个客户端进行通信,多线程我看的是一头雾水,在线等。
解决方案 »
- 怎样panel中动态加载pictureBox 并实现图片的移动和根据鼠标的中间键放大缩小
- 求助C# System.IndexOutOfRangeException: 索引超出了数组界
- 效率优化或思路优化?
- 如何删除文件中两个已知字符串中的文本
- 请问如何将 124 转换成ASCII对应的值
- 请问用VS2005自带的SQL2005如何把一个数据库中的其中一个表导入到另一个数据库中
- C#做底层怎么样?
- 初学,问两个菜问题
- 在webform中关于光标移动的问题,在线求解!
- C#updateAPter.Update 重命名的表字段不能更新
- 求解:正则表达式提取数据
- Winform中Tabcontrol 多行tabpage上下行切换 问题
try
{
IPHostEntry myHost = new IPHostEntry();
myHost = Dns.GetHostByName(this.textBoxName.Text);
myIP = IPAddress.Parse(myHost.AddressList[nettype].ToString());
iep = new IPEndPoint(myIP, Int32.Parse(this.textBoxPort.Text));
}
catch
{
MessageBox.Show("你输入的服务器名或端口号格式不正确,请重新输入!");
return;
}
this.listBoxState.Items.Add("开始监听...");
this.buttonStart.Enabled = false;
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
serverSocket.Bind(iep);
serverSocket.Listen(10);
serverSocket.BeginAccept(new AsyncCallback(AcceptConnection), serverSocket);
//thread = new Thread(new ThreadStart(Begin));
//thread.Start();
}
//private void Begin()
//{
// while (true)
// {
// serverSocket.BeginAccept(new AsyncCallback(AcceptConnection), serverSocket);
// }
//}
private void AcceptConnection(IAsyncResult ar)
{
try
{
Socket oldServer = (Socket)ar.AsyncState;
//异步接收传入的连接,并创建新的Socket来处理远程主机通信
clientSocket = oldServer.EndAccept(ar);
this.listBoxState.Items.Add("与客户" + clientSocket.RemoteEndPoint.ToString() + "建立连接。");
byte[] message = System.Text.Encoding.Unicode.GetBytes("客户你好!");
clientSocket.BeginSend(message, 0, message.Length, SocketFlags.None, new AsyncCallback(SendData), clientSocket);
}
catch
{
treeView1.Nodes.Add("客户下线了");
}
}
private void SendData(IAsyncResult ar)
{
Socket client = (Socket)ar.AsyncState;
try
{
clientSocket.EndSend(ar);
client.BeginReceive(data, 0, dataSize, SocketFlags.None, new AsyncCallback(ReceiveData), client);
}
catch
{
client.Close();
this.listBoxState.Items.Add("客户已关闭连接,等待新客户……");
serverSocket.BeginAccept(new AsyncCallback(AcceptConnection), serverSocket);
}
} private void ReceiveData(IAsyncResult ar)
{
Socket client = (Socket)ar.AsyncState;
try
{
//结束读取并获得读取的字节数
int receiveDataLength = client.EndReceive(ar);
string str = System.Text.Encoding.Unicode.GetString(data, 0, receiveDataLength);
this.richTextBoxReceive.Text = str;
byte[] message = System.Text.Encoding.Unicode.GetBytes("服务器收到信息:" + str);
clientSocket.BeginSend(message, 0, message.Length, SocketFlags.None, new AsyncCallback(SendData), clientSocket);
}
catch
{
client.Close();
this.listBoxState.Items.Add("客户已关闭连接,等待新客户……");
serverSocket.BeginAccept(new AsyncCallback(AcceptConnection), serverSocket);
}
}
首先多线程技术原理一定要熟悉,懂得!线程句柄,线程句柄计数等概念,内核对象!
.
其次:sokcet的含义,它是介于提供给应用层调用的一套接口,这这套接口会调用底层的通讯接口的---传输层; 对于用户来说:不需要了解底层,只要知道sokcet给我们提供的接口就ok了,例如:创建socket, 侦听, 接受客户端连接,接受后,建立了通信,就可以发送和接受数据了,注意:tcp是3次握手;
一般用多线程主要是考虑到同一个sever连接多个client ,这个时候,一般需要在服务器端维护一个接口客户端连接的列表;
.
socket变成模型很多种,有基本事件的,重叠i/o的;等等!
另外对于windows窗口,事件句柄等概念需要清楚!
有空来我空间看看 http://hi.baidu.com/happylatch
.
//thread = new Thread(new ThreadStart(Begin));
//thread.Start();
}
//private void Begin()
//{
// while (true)
// {
// serverSocket.BeginAccept(new AsyncCallback(AcceptConnection), serverSocket);
// }
//}
不行,可以写错了,你能帮我改下吗
//thread = new Thread(new ThreadStart(Begin));
//thread.Start();
}
//private void Begin()
//{
// while (true)
// {
// serverSocket.BeginAccept(new AsyncCallback(AcceptConnection), serverSocket);
// }
//}
不行,可以写错了,你能帮我改下吗
一个我经常参考的异步socket通信: