各位高人,我写一个监听指定端口的程序,有个自动的程序一直向这个端口发送数据,但是为什么我只能监听到一次数据,各位教教。 public partial class Form1 : Form
{
//变量
private ThreadStart start;
private Thread listenThread;
static private bool m_bListening = false;
static private System.Net.IPAddress MyIP = System.Net.IPAddress.Parse("192.168.222.98");
static private TcpListener listener = new TcpListener(MyIP, 50010);
private String msg;
//初始化监听器 public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
start = new ThreadStart(startListen);
listenThread = new Thread(start);
} //服务器线程处理
private void startListen()
{
listener.Start();
Socket socket = listener.AcceptSocket();
byte[] buffer = new byte[1024];
while (true)
{ int receiveCount = socket.Receive(buffer);
if (receiveCount > 0)
{
string recString = Encoding.UTF8.GetString(buffer, 0, receiveCount); //解码
tbNews.AppendText(socket.RemoteEndPoint.ToString() + "成功连接服务器\r\n");
tbNews.AppendText(recString + "\r\n"); }
else
{
socket.Close();
break;
}
}
} private void btn_startServer_Click(object sender, EventArgs e)
{
m_bListening = true;
listenThread.Start();
tbNews.AppendText("开始监听...\r\n");
btn_startServer.Enabled = false;
btn_closeServer.Enabled = true; } private void btn_closeServer_Click(object sender, EventArgs e)
{
m_bListening = false;
tbNews.AppendText("停止监听...\r\n");
btn_startServer.Enabled = true;
btn_closeServer.Enabled = false;
}
}
{
//变量
private ThreadStart start;
private Thread listenThread;
static private bool m_bListening = false;
static private System.Net.IPAddress MyIP = System.Net.IPAddress.Parse("192.168.222.98");
static private TcpListener listener = new TcpListener(MyIP, 50010);
private String msg;
//初始化监听器 public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
start = new ThreadStart(startListen);
listenThread = new Thread(start);
} //服务器线程处理
private void startListen()
{
listener.Start();
Socket socket = listener.AcceptSocket();
byte[] buffer = new byte[1024];
while (true)
{ int receiveCount = socket.Receive(buffer);
if (receiveCount > 0)
{
string recString = Encoding.UTF8.GetString(buffer, 0, receiveCount); //解码
tbNews.AppendText(socket.RemoteEndPoint.ToString() + "成功连接服务器\r\n");
tbNews.AppendText(recString + "\r\n"); }
else
{
socket.Close();
break;
}
}
} private void btn_startServer_Click(object sender, EventArgs e)
{
m_bListening = true;
listenThread.Start();
tbNews.AppendText("开始监听...\r\n");
btn_startServer.Enabled = false;
btn_closeServer.Enabled = true; } private void btn_closeServer_Click(object sender, EventArgs e)
{
m_bListening = false;
tbNews.AppendText("停止监听...\r\n");
btn_startServer.Enabled = true;
btn_closeServer.Enabled = false;
}
}
接到的数据是>0 ??
public void ServiceClient()
{
string[] tokens=null;
byte[] buff=new byte[1024];
bool keepConnect=true;
//用循环来不断地与客户端进行交互,直到客户端发出“EXIT”命令,
//将keepConnect置为false,退出循环,关闭连接,并中止当前线程
while(keepConnect && ClientSeverForm.SocketServiceFlag)
{
tokens = null;
try
{
if (currentSocket == null ||
currentSocket.Available < 1)
{
Thread.Sleep(300);
continue;
} //接收数据并存入buff数组中
int len = currentSocket.Receive(buff);
//将字符数组转化为字符串
string clientCommand=System.Text.Encoding.Default.GetString(
buff, 0, len);
//tokens[0]中保存了命令标志符(CONN、CHAT、PRIV、LIST或EXIT)
tokens=clientCommand.Split(new Char[]{'|'}); if (tokens == null)
{
Thread.Sleep(200);
continue;
}
}
catch(Exception e)
{
server.updateUI("发生异常:"+ e.ToString());
}
if(tokens[0]=="CONN")
{
//此时接收到的命令格式为:
//命令标志符(CONN)|发送者的用户名|,
//tokens[1]中保存了发送者的用户名
this.name = tokens[1];
if (ClientSeverForm.clients.Contains(this.name))
{
SendToClient(this, "ERR|User " + this.name + " 已经存在"); }
else
{
Hashtable syncClients = Hashtable.Synchronized(
ClientSeverForm.clients);
syncClients.Add(this.name,this); //更新界面
server.addUser(this.name);
//对每一个当前在线的用户发送JOIN消息命令和LIST消息命令,
//以此来更新客户端的当前在线用户列表
System.Collections.IEnumerator myEnumerator =
ClientSeverForm.clients.Values.GetEnumerator();
while (myEnumerator.MoveNext())
{
Client client = (Client)myEnumerator.Current;
SendToClient(client, "JOIN|"+tokens[1]+"|");
Thread.Sleep(100);
}
//更新状态
state = "connected";
SendToClient(this, "ok"); //向客户端发送LIST命令,以此更新客户端的当前在线用户列表
string msgUsers="LIST|"+server.GetUserList();
SendToClient(this, msgUsers);
} }
else if(tokens[0]=="LIST")
{
if (state == "connnected")
{
//向客户端发送LIST命令,以此更新客户端的当前在线用户列表
string msgUsers="LIST|"+server.GetUserList();
SendToClient(this, msgUsers);
}
else
{
//send err to server
SendToClient(this, "ERR|state error,Please login first");
}
}
else if(tokens[0]=="CHAT")
{
if (state == "connected")
{
//此时接收到的命令的格式为:
//命令标志符(CHAT)|发送者的用户名:发送内容|
//向所有当前在线的用户转发此信息
System.Collections.IEnumerator myEnumerator =
ClientSeverForm.clients.Values.GetEnumerator();
while (myEnumerator.MoveNext())
{
Client client = (Client)myEnumerator.Current;
//将“发送者的用户名:发送内容”转发给用户
SendToClient(client, tokens[1]);
}
server.updateUI(tokens[1]);
}
else
{
//send err to server
SendToClient(this, "ERR|state error,Please login first");
}
}
else if(tokens[0]=="PRIV")
{
if (state == "connected")
{
//此时接收到的命令格式为:
//命令标志符(PRIV)|发送者用户名|接收者用户名|发送内容|
//tokens[1]中保存了发送者的用户名
string sender=tokens[1];
//tokens[2]中保存了接收者的用户名
string receiver=tokens[2];
//tokens[3]中保存了发送的内容
string content=tokens[3];
string message=sender+" ---> "+receiver+": " + content;
//仅将信息转发给发送者和接收者
if (ClientSeverForm.clients.Contains(sender))
{
SendToClient(
(Client)ClientSeverForm.clients[sender], message);
}
if (ClientSeverForm.clients.Contains(receiver))
{
SendToClient(
(Client)ClientSeverForm.clients[receiver], message);
}
server.updateUI(message);
}
else
{
//send err to server
SendToClient(this, "ERR|state error,Please login first");
}
}
else if(tokens[0]=="EXIT")
{
//此时接收到的命令的格式为:命令标志符(EXIT)|发送者的用户名
//向所有当前在线的用户发送该用户已离开的信息
if (ClientSeverForm.clients.Contains(tokens[1]))
{
Client client = (Client)ClientSeverForm.clients[tokens[1]]; //将该用户对应的Client对象从clients中删除
Hashtable syncClients = Hashtable.Synchronized(
ClientSeverForm.clients);
syncClients.Remove(client.name);
server.removeUser(client.name); //向客户端发送QUIT命令
string message="QUIT|" + tokens[1];
System.Collections.IEnumerator myEnumerator =
ClientSeverForm.clients.Values.GetEnumerator();
while (myEnumerator.MoveNext())
{
Client c = (Client)myEnumerator.Current;
SendToClient(c, message);
}
server.updateUI("QUIT");
} //退出当前线程
break;
}
Thread.Sleep(200);
}
}给你参考一上,省了很多话茬儿
private void StartSocketListen()
{
while(ClientSeverForm.SocketServiceFlag)
{
try
{
//当接收到一个客户端请求时,确认与客户端的连接
if (listener.Pending())
{
Socket socket=listener.AcceptSocket();
if(clients.Count>=MAX_NUM)
{
add("已经达到了最大连接数:" +
MAX_NUM + ",拒绝新的连接\n");
socket.Close();
}
else
{
//启动一个新的线程,
//执行方法this.ServiceClient,处理用户相应的请求
Client client = new Client(this, socket);
Thread clientService=new Thread(
new ThreadStart(client.ServiceClient));
clientService.Start();
}
}
Thread.Sleep(200);
}
catch(Exception ex)
{
add(ex.Message.ToString()+ "\n");
}
}
}