实现一个多客户端与服务器互传信息的程序
现在问题是,所有客户端发送的消息服务器都能收到,
但是服务器发送的消息,只有最后连接的一个客户端能收到,其它的都不行望高手解惑!!!!!!!!!!服务器端代码 public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//用于处理客户端连接请求的socket
Socket clientSocket = null;
//创建服务端服务端套接字
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;////////////////
} //server-侦听方法
private void listen()
{
IPAddress HostIp = IPAddress.Parse(textBoxIP.Text);
IPEndPoint iep = new IPEndPoint(HostIp, 80);
serverSocket.Bind(iep);
serverSocket.Listen(50);
Thread acceptThread = new Thread(new ThreadStart(AcceptWorkThread));
acceptThread.Start(); } //处理来自客户端的连接方法
private void AcceptWorkThread()
{
Thread.CurrentThread.IsBackground = true;
while (true)
{
clientSocket = serverSocket.Accept();
IPEndPoint remoEP = (IPEndPoint)clientSocket.RemoteEndPoint;
MessageBox.Show("接收到来自" + remoEP.Address.ToString() + "的连接。");
Thread receiveThread = new Thread(new ParameterizedThreadStart(ReceiveWorkThread));
receiveThread.Start(clientSocket);
}
} //接收数据方法
private void ReceiveWorkThread(object obj)
{
Thread.CurrentThread.IsBackground = true;
Socket socket = (Socket)obj;
byte[] buffer = new byte[1024];
while (true)
{
int receiveCount = socket.Receive(buffer);
if (receiveCount > 0)
{
IPEndPoint remoEP = (IPEndPoint)socket.RemoteEndPoint;
string recString = "来自客户端" + remoEP.Address.ToString() + "的消息:" + Encoding.Default.GetString(buffer, 0, receiveCount);
textBoxMsgView.Text = recString + "\r\n";
textBoxMsgView.SelectionStart = this.textBoxMsgView.Text.Length;
textBoxMsgView.ScrollToCaret();
socket.Send(buffer, receiveCount, SocketFlags.None);
}
else
{
socket.Close();
break;
}
}
} //启动服务器按钮
private void buttonSocket_Click(object sender, EventArgs e)
{
//server-创建并运行侦听线程
Thread threadListen = new Thread(new ThreadStart(listen)); threadListen.IsBackground = true; threadListen.Start();
}
//发送消息按钮
private void buttonSemdMsg_Click(object sender, EventArgs e)
{
if (this.textBoxMsgSend.Text != "")//不能发送空消息
{
try
{
//发送数据
string message = textBoxMsgSend.Text;
byte[] sendbytes = System.Text.Encoding.UTF8.GetBytes(message);
int successSendBtyes = clientSocket.Send(sendbytes, sendbytes.Length, SocketFlags.None);
}
catch (Exception exp)
{
MessageBox.Show(exp.Message);
}
//将发送的数据显示到对话窗口并使对话窗口的滚动条一直停留在最下方
this.textBoxMsgView.Text += "服务器:" + "\r\n" + textBoxMsgSend.Text + "\r\n";//发完一条消息就换行显示
this.textBoxMsgView.SelectionStart = this.textBoxMsgView.Text.Length;
this.textBoxMsgView.ScrollToCaret();
this.textBoxMsgSend.Text = "";//将发送窗口清空 }
else
{
MessageBox.Show("发送内容不能为空");
}
}
private void timer1_Tick(object sender, EventArgs e)
{
byte[] receiveBytes = new byte[1024];
//如果侦听后取得客户端连接,并且客户端的缓冲区中有内容可读,开始接收数据
if (clientSocket != null)
{ if (clientSocket.Poll(100, SelectMode.SelectRead))
{
int successReceiveBytes = clientSocket.Receive(receiveBytes);
this.textBoxMsgView.Text += "客户端:" + "(" + clientSocket.RemoteEndPoint.ToString() + ")" + "\r\n" +
System.Text.Encoding.UTF8.GetString(receiveBytes, 0, successReceiveBytes) + "\r\n";
this.textBoxMsgView.SelectionStart = this.textBoxMsgView.Text.Length;//使对话窗口的滚动条一直停留在最下方
this.textBoxMsgView.ScrollToCaret();
} }
} private void buttonQuiet_Click(object sender, EventArgs e)
{
this.Close();
} //private void buttonStop_Click(object sender, EventArgs e)
//{
// serverSocket.Shutdown(SocketShutdown.Both);//停止Socket前应该先暂停Socket上的发送和接受
// serverSocket.Close();
//} private void textBoxIP_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 13)
buttonSocket_Click(null, null);
} private void textBoxMsgSend_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 13)
buttonSemdMsg_Click(null,null);
}
客户端代码
public Form1()
{
InitializeComponent();
} Socket clientSocket = null;//客户端套接字 private void Form1_Load(object sender, EventArgs e)
{ } private void buttonConnect_Click(object sender, EventArgs e)
{
try
{
//建立与服务器连接的套接字
IPAddress ip = IPAddress.Parse(textBoxIP.Text);
IPEndPoint iep = new IPEndPoint(ip, 80);
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
clientSocket.Connect(iep);
if (clientSocket != null)
{
textBoxViewMsg.Text = "连接成功" + "\r\n";
}
else
{
textBoxViewMsg.Text = "连接失败" + "\r\n";
}
}
catch (Exception exp)
{
MessageBox.Show(exp.Message);
}
timer1.Enabled = true;
} private void buttonSend_Click(object sender, EventArgs e)
{
if (textBoxSendMsg.Text != "")
{
try
{
//发送数据
string message = textBoxSendMsg.Text;
byte[] sendbytes = System.Text.Encoding.UTF8.GetBytes(message);
int successSendBtyes = clientSocket.Send(sendbytes, sendbytes.Length, SocketFlags.None);
}
catch (Exception exp)
{
MessageBox.Show(exp.Message);
}
//将发送的数据显示到对话窗口并使对话窗口的滚动条一直停留在最下方
this.textBoxViewMsg.Text += "我自己:" + "\r\n" + textBoxSendMsg.Text + "\r\n";//发完一条消自己息就换行显示
this.textBoxViewMsg.SelectionStart = this.textBoxViewMsg.Text.Length;
this.textBoxViewMsg.ScrollToCaret();
this.textBoxSendMsg.Text = "";//将发送窗口清空
}
else
{
MessageBox.Show("发送内容不能为空");
}
} private void timer1_Tick(object sender, EventArgs e)
{
byte[] receiveBytes = new byte[1024];
if (clientSocket.Poll(100, SelectMode.SelectRead))
{
int successReceiveBytes = clientSocket.Receive(receiveBytes);
this.textBoxViewMsg.Text += "服务器:" + "\r\n" +
System.Text.Encoding.UTF8.GetString(receiveBytes, 0, successReceiveBytes) + "\r\n";
this.textBoxViewMsg.SelectionStart = this.textBoxViewMsg.Text.Length;//使对话窗口的滚动条一直停留在最下方
this.textBoxViewMsg.ScrollToCaret();
}
} private void buttonquiet_Click(object sender, EventArgs e)
{
this.Close();
} //private void buttonStop_Click(object sender, EventArgs e)
//{
// clientSocket.Shutdown(SocketShutdown.Both);//停止Socket前应该先暂停Socket上的发送和接受
// clientSocket.Close();
//} private void textBoxIP_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 13)
buttonConnect_Click(null,null);
} private void textBoxSendMsg_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 13)
buttonSend_Click(null,null);
}
现在问题是,所有客户端发送的消息服务器都能收到,
但是服务器发送的消息,只有最后连接的一个客户端能收到,其它的都不行望高手解惑!!!!!!!!!!服务器端代码 public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//用于处理客户端连接请求的socket
Socket clientSocket = null;
//创建服务端服务端套接字
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;////////////////
} //server-侦听方法
private void listen()
{
IPAddress HostIp = IPAddress.Parse(textBoxIP.Text);
IPEndPoint iep = new IPEndPoint(HostIp, 80);
serverSocket.Bind(iep);
serverSocket.Listen(50);
Thread acceptThread = new Thread(new ThreadStart(AcceptWorkThread));
acceptThread.Start(); } //处理来自客户端的连接方法
private void AcceptWorkThread()
{
Thread.CurrentThread.IsBackground = true;
while (true)
{
clientSocket = serverSocket.Accept();
IPEndPoint remoEP = (IPEndPoint)clientSocket.RemoteEndPoint;
MessageBox.Show("接收到来自" + remoEP.Address.ToString() + "的连接。");
Thread receiveThread = new Thread(new ParameterizedThreadStart(ReceiveWorkThread));
receiveThread.Start(clientSocket);
}
} //接收数据方法
private void ReceiveWorkThread(object obj)
{
Thread.CurrentThread.IsBackground = true;
Socket socket = (Socket)obj;
byte[] buffer = new byte[1024];
while (true)
{
int receiveCount = socket.Receive(buffer);
if (receiveCount > 0)
{
IPEndPoint remoEP = (IPEndPoint)socket.RemoteEndPoint;
string recString = "来自客户端" + remoEP.Address.ToString() + "的消息:" + Encoding.Default.GetString(buffer, 0, receiveCount);
textBoxMsgView.Text = recString + "\r\n";
textBoxMsgView.SelectionStart = this.textBoxMsgView.Text.Length;
textBoxMsgView.ScrollToCaret();
socket.Send(buffer, receiveCount, SocketFlags.None);
}
else
{
socket.Close();
break;
}
}
} //启动服务器按钮
private void buttonSocket_Click(object sender, EventArgs e)
{
//server-创建并运行侦听线程
Thread threadListen = new Thread(new ThreadStart(listen)); threadListen.IsBackground = true; threadListen.Start();
}
//发送消息按钮
private void buttonSemdMsg_Click(object sender, EventArgs e)
{
if (this.textBoxMsgSend.Text != "")//不能发送空消息
{
try
{
//发送数据
string message = textBoxMsgSend.Text;
byte[] sendbytes = System.Text.Encoding.UTF8.GetBytes(message);
int successSendBtyes = clientSocket.Send(sendbytes, sendbytes.Length, SocketFlags.None);
}
catch (Exception exp)
{
MessageBox.Show(exp.Message);
}
//将发送的数据显示到对话窗口并使对话窗口的滚动条一直停留在最下方
this.textBoxMsgView.Text += "服务器:" + "\r\n" + textBoxMsgSend.Text + "\r\n";//发完一条消息就换行显示
this.textBoxMsgView.SelectionStart = this.textBoxMsgView.Text.Length;
this.textBoxMsgView.ScrollToCaret();
this.textBoxMsgSend.Text = "";//将发送窗口清空 }
else
{
MessageBox.Show("发送内容不能为空");
}
}
private void timer1_Tick(object sender, EventArgs e)
{
byte[] receiveBytes = new byte[1024];
//如果侦听后取得客户端连接,并且客户端的缓冲区中有内容可读,开始接收数据
if (clientSocket != null)
{ if (clientSocket.Poll(100, SelectMode.SelectRead))
{
int successReceiveBytes = clientSocket.Receive(receiveBytes);
this.textBoxMsgView.Text += "客户端:" + "(" + clientSocket.RemoteEndPoint.ToString() + ")" + "\r\n" +
System.Text.Encoding.UTF8.GetString(receiveBytes, 0, successReceiveBytes) + "\r\n";
this.textBoxMsgView.SelectionStart = this.textBoxMsgView.Text.Length;//使对话窗口的滚动条一直停留在最下方
this.textBoxMsgView.ScrollToCaret();
} }
} private void buttonQuiet_Click(object sender, EventArgs e)
{
this.Close();
} //private void buttonStop_Click(object sender, EventArgs e)
//{
// serverSocket.Shutdown(SocketShutdown.Both);//停止Socket前应该先暂停Socket上的发送和接受
// serverSocket.Close();
//} private void textBoxIP_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 13)
buttonSocket_Click(null, null);
} private void textBoxMsgSend_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 13)
buttonSemdMsg_Click(null,null);
}
客户端代码
public Form1()
{
InitializeComponent();
} Socket clientSocket = null;//客户端套接字 private void Form1_Load(object sender, EventArgs e)
{ } private void buttonConnect_Click(object sender, EventArgs e)
{
try
{
//建立与服务器连接的套接字
IPAddress ip = IPAddress.Parse(textBoxIP.Text);
IPEndPoint iep = new IPEndPoint(ip, 80);
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
clientSocket.Connect(iep);
if (clientSocket != null)
{
textBoxViewMsg.Text = "连接成功" + "\r\n";
}
else
{
textBoxViewMsg.Text = "连接失败" + "\r\n";
}
}
catch (Exception exp)
{
MessageBox.Show(exp.Message);
}
timer1.Enabled = true;
} private void buttonSend_Click(object sender, EventArgs e)
{
if (textBoxSendMsg.Text != "")
{
try
{
//发送数据
string message = textBoxSendMsg.Text;
byte[] sendbytes = System.Text.Encoding.UTF8.GetBytes(message);
int successSendBtyes = clientSocket.Send(sendbytes, sendbytes.Length, SocketFlags.None);
}
catch (Exception exp)
{
MessageBox.Show(exp.Message);
}
//将发送的数据显示到对话窗口并使对话窗口的滚动条一直停留在最下方
this.textBoxViewMsg.Text += "我自己:" + "\r\n" + textBoxSendMsg.Text + "\r\n";//发完一条消自己息就换行显示
this.textBoxViewMsg.SelectionStart = this.textBoxViewMsg.Text.Length;
this.textBoxViewMsg.ScrollToCaret();
this.textBoxSendMsg.Text = "";//将发送窗口清空
}
else
{
MessageBox.Show("发送内容不能为空");
}
} private void timer1_Tick(object sender, EventArgs e)
{
byte[] receiveBytes = new byte[1024];
if (clientSocket.Poll(100, SelectMode.SelectRead))
{
int successReceiveBytes = clientSocket.Receive(receiveBytes);
this.textBoxViewMsg.Text += "服务器:" + "\r\n" +
System.Text.Encoding.UTF8.GetString(receiveBytes, 0, successReceiveBytes) + "\r\n";
this.textBoxViewMsg.SelectionStart = this.textBoxViewMsg.Text.Length;//使对话窗口的滚动条一直停留在最下方
this.textBoxViewMsg.ScrollToCaret();
}
} private void buttonquiet_Click(object sender, EventArgs e)
{
this.Close();
} //private void buttonStop_Click(object sender, EventArgs e)
//{
// clientSocket.Shutdown(SocketShutdown.Both);//停止Socket前应该先暂停Socket上的发送和接受
// clientSocket.Close();
//} private void textBoxIP_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 13)
buttonConnect_Click(null,null);
} private void textBoxSendMsg_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 13)
buttonSend_Click(null,null);
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货