我在c#中创建了一个服务器 - 客户端应用程序。我设法从客户端向服务器发送消息并阅读它们,但我不知道如何将消息从服务器发送回客户端。
namespace TCPSockets {
public partial class Form1 : Form {
TcpClient client = null;
TcpListener listener = null;
IPAddress ip = null;
int port = 1337;
Thread thClient = null;
Thread thListener = null;
NetworkStream dataStream = null;
public Form1() {
InitializeComponent();
txt_ip.Text = "127.0.0.1";
txt_port.Text = "1234";
}
private void ListenForConnections() {
listener = new TcpListener(ip, port);
listener.Start();
while (true) {
try {
client = listener.AcceptTcpClient();
dataStream = client.GetStream();
byte[] message = new byte[1024];
dataStream.Read(message, 0, message.Length);
dataStream.Close();
string strMessage = Encoding.UTF8.GetString(message);
MessageBox.Show("Server: I got message: " + strMessage);
}
catch (Exception ex) {
thListener.Join();
}
}
}
private void start_server_Click(object sender, EventArgs e)
{
ip = IPAddress.Parse(txt_ip.Text);
port = Convert.ToInt32(txt_port.Text);
// nit => sicer vmesnik blokira, ko kličemo AcceptTcpClient()
thListener = new Thread(new ThreadStart(ListenForConnections));
thListener.IsBackground = true;
thListener.Start();
}
}
}
namespace TCPSockets {
public partial class Form1 : Form {
TcpClient client = null;
TcpListener listener = null;
IPAddress ip = null;
int port = 1337;
Thread thClient = null;
Thread thListener = null;
NetworkStream dataStream = null;
public Form1() {
InitializeComponent();
txt_ip.Text = "127.0.0.1";
txt_port.Text = "1234";
}
private void SendPacket(object pClient) {
string message = txt_message.Text;
try {
client = (TcpClient)pClient;
client.Connect(ip, port);
dataStream = client.GetStream();
byte[] strMessage = Encoding.UTF8.GetBytes(message);
dataStream.Write(strMessage, 0, strMessage.Length);
dataStream.Close();
client.Close();
}
catch (Exception ex) {
MessageBox.Show("Odjemalec: Pošiljanje ni bilo uspešno!");
}
}
private void send_to_server_Click(object sender, EventArgs e)
{
ip = IPAddress.Parse(txt_ip.Text);
port = Convert.ToInt32(txt_port.Text);
client = new TcpClient();
thClient = new Thread(new ParameterizedThreadStart(SendPacket));
thClient.IsBackground = true;
thClient.Start(client);
}
}
}
有谁知道如何从服务器向客户端正确发送消息并在客户端中读取它?
答案 0 :(得分:0)
如果您想使用当前使用的相同代码,则只需在&#上同时实现 Server 和 Client 角色34;服务器"和你的"客户"电脑。然后当你想要" Server"要发送的计算机,它将充当客户端角色并发送给您的客户"计算机充当服务器角色。您将需要两台计算机监听另一台计算机的消息。我建议他们也在不同的端口上收听,这样你就不必修改代码了。根据Tobias的评论,可能会导致更多的复杂性,这就是为什么我建议使用SignalR但这不是这个问题的答案,它是另一种选择。
如果您不介意使用新的代码库,我强烈建议您探索的一种解决方案是SignalR。 SignalR是一种允许推动"推动"通知,可以让你轻松完成你的目标。这是一个很简单的例子:
https://github.com/SignalR/Samples/tree/master/Samples_2.1.0/ConsoleClient
这将允许您像以下一样简单地调用消息:
await _connection.Send(new { Type = "sendToMe", Content = "Hello World!" });
它是supported on many platforms并且有很多tutorials!
以下是samples repository on GitHub的链接。此处概述了使用SignalR执行此操作的另一种方法以及OWIN自托管方法:SignalR Console app example
答案 1 :(得分:0)
当服务器(TcpListener)接受来自客户端(TcpClient)的传入连接时,它将创建服务器端TcpClient。见MSDN TcpListener.AcceptTcpClient
所以你将拥有其中的两个:一个是你在客户端程序中创建的,另一个是由TcpListener自动创建的。
只需使用TcpClient.GetStream()在两者上获取底层网络流,您就可以使用NetworkStream.Read()和.Write()进行通信。那就是它。
为了测试和调试网络连接,我建议使用HWGroup Hercules和SysInternals TcpView。