【发布时间】:2018-08-13 10:23:54
【问题描述】:
我正在尝试在本地用 c# 编写一个聊天客户端/服务器来熟悉 Sockets。
首先我用(非常简化的)以下代码启动服务器:
Server.cs
private readonly MessageManager _messageManager;
private readonly ChatServer _chatServer;
public ChatServerSkeleton()
{
_messageManager = new MessageManager();
_chatServer = new ChatServer();
Console.WriteLine("Server is running on: " + _messageManager.MyAddress);
}
然后我以 +- 相同的方式启动客户端,除了我将服务器地址存储在客户端中(我将服务器地址复制到提示符中)。
Client.cs
private readonly MessageManager _messageManager;
public ChatClient ChatClient { get; }
public ChatClientSkeleton(IPEndPoint serverAddress, string name)
{
_messageManager = new MessageManager();
ChatClient = new ChatClient(new ChatServerStub(serverAddress, _messageManager), name);
Console.WriteLine($"IPAddress of {name} is: {_messageManager.MyAddress}");
Console.WriteLine($"IPAddress of Server is: { serverAddress}");
}
MessageManager.cs
private readonly TcpListener _serverSocket;
public IPEndPoint MyAddress { get; }
public MessageManager()
{
try
{
//Create server socket on random port
_serverSocket = new TcpListener(IPAddress.Any, FindFreeTcpPort());
//Get host ip address
IPAddress[] localIps = Dns.GetHostAddresses(Dns.GetHostName());
IPAddress localhost = localIps.First(ip => ip.AddressFamily == AddressFamily.InterNetwork);
//Get port of serversocket
IPEndPoint ipEndPoint = _serverSocket.LocalEndpoint as IPEndPoint;
int port = ipEndPoint.Port;
//Create address
MyAddress = new IPEndPoint(localhost, port);
}
catch (Exception ex)
{
Console.Error.WriteLine("Something went wrong with the serversocket:");
Console.Error.WriteLine(ex);
}
}
FindFreeTcp 端口来自这里:https://stackoverflow.com/a/150974/5985593
到目前为止,一切似乎都有效。例如,服务器现在有 192.168.0.219:51080 和客户端 192.168.0.219:51085。
当我尝试使用 MessageManager.cs
中的此代码发送消息时出现问题 public void Send(MethodCallMessage message, IPEndPoint address)
{
try
{
_serverSocket.Start();
TcpClient destination = new TcpClient(address.Address.ToString(), address.Port);
NetworkStream output = destination.GetStream();
MessageReaderWriter.Write(message, output);
destination.Close();
}
catch (Exception ex)
{
Console.Error.WriteLine("Failed to write a message:");
Console.Error.WriteLine(ex);
}
finally
{
_serverSocket.Stop();
}
}
_server.Start(); 行更具体。
谁知道我做错了什么?
提前致谢!
编辑: 在服务器上注册客户端时,它运行良好 1 次。但在那之后,如果我想发送一条消息,我会得到目标机器主动拒绝的 SocketException。
我确实在这里使用 AcceptTcpClient():
MessageManager.cs
public MethodCallMessage WReceive()
{
MethodCallMessage result = null;
try
{
//_serverSocket.Start();
TcpClient client = _serverSocket.AcceptTcpClient();
NetworkStream input = new NetworkStream(client.Client, true);
result = MessageReaderWriter.Read(input);
client.Close();
}
catch (Exception ex)
{
Console.Error.WriteLine("Failed to receive a message:");
Console.Error.WriteLine(ex);
}
finally
{
//_serverSocket.Stop();
}
return result;
}
该方法在ServerSkeleton & ClientSkeleton中使用如下:
public void Run()
{
while (true)
{
MethodCallMessage request = _messageManager.WReceive();
HandleRequest(request);
}
}
所以流程基本如下:
- 我启动服务器(实例化新的消息管理器,第 3 个 sn-p 并运行 serverskeleton (last sn-p)
- 服务器打印 IP 控制台,我复制 ip 并启动客户端
- 实例化客户端 & 将服务器 ip 设置为我复制粘贴的内容
- 启动客户端骨架(最后 sn-p)
【问题讨论】:
标签: c# sockets network-programming