1、你的代码写的是只执行一次的,所以只有一个。
2、socket同步一般配合多线程,即,每有一个客户端连接进来,开辟一个新线程用来处理socket的接收;而Listview刷新又需要有一个线程或者timer去完成
3、socket不使用多线程的情况下,只有当上一个接收完成后,才能接收下一个,如果等待数超过了队列长度,则会报错。
将你上述代码改成可以循环接收,但只能一个一个接收,如下:
private void GetIPs()//监听客户端IP
{
Form.CheckForIllegalCrossThreadCalls = false;
while(true)//添加一个死循环while用于不停的接收。
{
Socket s = _tcpl.AcceptSocket();
try
{
IPEndPoint clientipe = (IPEndPoint)s.RemoteEndPoint;
getIP = clientipe.Address.ToString();
//if (clientipe != null)
//{
ListViewItem lvi = new ListViewItem(new string[] { clientipe.Address.ToString(), "" });
lvi.ImageIndex = 0;
listView1.Items.Add(lvi);
//}
}
catch (Exception) { }
}
}
多线程传参不知道你懂不懂,如果懂的话,就在socket s= _tcpl.AcceptSocket();后面开启新线程,将s传过去,在新线程里完成接收动作。
看完你的问题,其实是很简单的。但我确信你没有使用线程,当前也别说你开了几个线程的问题。
你的方法纯粹是一个方法,也没有线程调用它,除非你用的是VS2003,因为如果是在高版本中,创建线程是不允许修改UI的,必须使用委托的形式,而这个方法中根本就是直接调用了UI,所以不可以开辟线程的。
而这个方法每执行一次只可以能一个客户端IP的。无论你不停的地循环也好,因为没有多线程的支持,所以你也只能一次跟一个人通信,不可以有第二个人通信,如果你要通信,必须开辟第二个线程或者使用两个对象同时运行,但这个不是多线程,所以基本上判定你对线程上根本不懂。
要解决这样的事实,其实你用多线程是最合适的,如果你不会多线程,也没有关系,那么你可以使用UDP这种不可靠的通信来解决你的问题,UDP因为事先是不需要客户端建立连接的,所以他是非面向连接,这与TCP不同的时,通信前必须知道通信方的IP地址是不同的,所以UDP能解决你的问题——但是传输是不稳定的,也就是说,丢失信息是常有的事,局网通信会好些。
所以给你个建议是,要么去好好学习一下线程知识,要么使用不可靠传输UDP的方式。事实上多线程通信时这里要求你有几个客户端连接,要开几组线程的。一个线程用来收,一个线程用来发,还要考虑临界资源的应用。不过你的发送线程可以是一个的,因为你只有一个在发,让线程发向指定的地址即可,但接收线程因为是同时,所以必须是多个。