我想实现一个服务端与多个客户端TCP通讯的例子,现在服务端可以给每个客户端发信息,但是客户端发来的信息服务端收不到。大家麻烦下看看怎么回事?
客户端代码:
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
}
Thread th;
private void button1_Click(object sender, EventArgs e)//开始监听
{
th = new Thread(JTstart);
th.Start();
}
TcpListener myTL;
List<TcpClient> TClist = new List<TcpClient>();//用于保存每个连接的TcpClient对象
void JTstart()
{
myTL = new TcpListener(IPAddress.Parse(textBox1.Text.Trim()), Int32.Parse(textBox2.Text.Trim()));
myTL.Start();
while (true)
{
TcpClient myTC = myTL.AcceptTcpClient();
TClist.Add(myTL.AcceptTcpClient());
listView1.Items.Add((myTC.Client.RemoteEndPoint).ToString());
NetworkStream NS = myTC.GetStream();
StreamReader SR = new StreamReader(NS);
StreamWriter SW = new StreamWriter(NS);
SW.WriteLine("已连接");
SW.Flush();//如果有客户端连接 就给客户端 发回一个信息
getmessage g = new getmessage();//实例化一个getmessage 对象
g.myTC = myTC;//把当前TcpClient对象引用给getmessage成员
g.SRR = SR;//把当前读流引用给getmessage成员
g.temp = this.textBox3;//textBox3是用于显示客户端发来的信息的
new Thread(g.getmes).Start();//开始一个线程接收该客户端发来流
}
}
private void button2_Click(object sender, EventArgs e)
{
if(listView1.SelectedItems.Count>0)
{
NetworkStream NS = TClist[listView1.SelectedIndices[0]].GetStream();//选择一个客户端
StreamWriter SW = new StreamWriter(NS);
SW.WriteLine(textBox4.Text.Trim());
SW.Flush();//给客户端发送信息
}
else
{
MessageBox.Show("请选择发送对象!","提示信息",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
System.Environment.Exit(0);
}
}
class getmessage
{
public TcpClient myTC;
public StreamReader SRR;
public TextBox temp;
public void getmes()
{
while (true)
{
string ss= SRR.ReadLine();//这里我断点时候。 这里有错误我看不懂 ??????????????
temp.Text += myTC.Client.RemoteEndPoint.ToString() + "说:" + ss+ "\r\n";
//一旦有客户端的信息就显示在服务端的TextBox上
}
}
}客户端:
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false; }
Thread th;
private void button1_Click(object sender, EventArgs e)//开始连接
{
th = new Thread(LJstart);
th.Start(); }
TcpClient myTC;
StreamWriter SW;
StreamReader SR;
NetworkStream NS;
void LJstart()
{
myTC = new TcpClient(textBox1.Text.Trim(), Int32.Parse(textBox2.Text.Trim()));
NS = myTC.GetStream();
SR = new StreamReader(NS);
SW = new StreamWriter(NS);
while (true)
{
textBox3.Text += myTC.Client.RemoteEndPoint.ToString() + "说:" + SR.ReadLine() + "\r\n";//把服务端发来的信息信息在textBox3
}
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
System.Environment.Exit(0);
} private void button2_Click(object sender, EventArgs e)//发送按钮
{
SW.WriteLine(textBox4.Text.Trim());//把编辑的内容发给服务端
SW.Flush();
textBox4.Text = "";
}
客户端代码:
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
}
Thread th;
private void button1_Click(object sender, EventArgs e)//开始监听
{
th = new Thread(JTstart);
th.Start();
}
TcpListener myTL;
List<TcpClient> TClist = new List<TcpClient>();//用于保存每个连接的TcpClient对象
void JTstart()
{
myTL = new TcpListener(IPAddress.Parse(textBox1.Text.Trim()), Int32.Parse(textBox2.Text.Trim()));
myTL.Start();
while (true)
{
TcpClient myTC = myTL.AcceptTcpClient();
TClist.Add(myTL.AcceptTcpClient());
listView1.Items.Add((myTC.Client.RemoteEndPoint).ToString());
NetworkStream NS = myTC.GetStream();
StreamReader SR = new StreamReader(NS);
StreamWriter SW = new StreamWriter(NS);
SW.WriteLine("已连接");
SW.Flush();//如果有客户端连接 就给客户端 发回一个信息
getmessage g = new getmessage();//实例化一个getmessage 对象
g.myTC = myTC;//把当前TcpClient对象引用给getmessage成员
g.SRR = SR;//把当前读流引用给getmessage成员
g.temp = this.textBox3;//textBox3是用于显示客户端发来的信息的
new Thread(g.getmes).Start();//开始一个线程接收该客户端发来流
}
}
private void button2_Click(object sender, EventArgs e)
{
if(listView1.SelectedItems.Count>0)
{
NetworkStream NS = TClist[listView1.SelectedIndices[0]].GetStream();//选择一个客户端
StreamWriter SW = new StreamWriter(NS);
SW.WriteLine(textBox4.Text.Trim());
SW.Flush();//给客户端发送信息
}
else
{
MessageBox.Show("请选择发送对象!","提示信息",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
System.Environment.Exit(0);
}
}
class getmessage
{
public TcpClient myTC;
public StreamReader SRR;
public TextBox temp;
public void getmes()
{
while (true)
{
string ss= SRR.ReadLine();//这里我断点时候。 这里有错误我看不懂 ??????????????
temp.Text += myTC.Client.RemoteEndPoint.ToString() + "说:" + ss+ "\r\n";
//一旦有客户端的信息就显示在服务端的TextBox上
}
}
}客户端:
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false; }
Thread th;
private void button1_Click(object sender, EventArgs e)//开始连接
{
th = new Thread(LJstart);
th.Start(); }
TcpClient myTC;
StreamWriter SW;
StreamReader SR;
NetworkStream NS;
void LJstart()
{
myTC = new TcpClient(textBox1.Text.Trim(), Int32.Parse(textBox2.Text.Trim()));
NS = myTC.GetStream();
SR = new StreamReader(NS);
SW = new StreamWriter(NS);
while (true)
{
textBox3.Text += myTC.Client.RemoteEndPoint.ToString() + "说:" + SR.ReadLine() + "\r\n";//把服务端发来的信息信息在textBox3
}
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
System.Environment.Exit(0);
} private void button2_Click(object sender, EventArgs e)//发送按钮
{
SW.WriteLine(textBox4.Text.Trim());//把编辑的内容发给服务端
SW.Flush();
textBox4.Text = "";
}
进来Mark学习一下