我开始在网络编程领域沾沾自喜,我最近在讲师教程中遇到了一个相当古老的样本(或者我被告知)。
我们在大学的计算机上试过它,但是它不起作用所以讲师认为它是由Windows 7或大学计算机系统设置的安全设置。
渴望找到原因我决定在家里自己的电脑上运行相同的代码,毫不奇怪它没有用。
解决方案中有两个项目,一个充当客户端,另一个充当服务器。一旦服务器和客户端彼此连接,客户端就会向服务器发送一个简单的字符串,该字符串将打印到控制台。在此之后,关闭适当的连接并正常退出应用程序。
应用程序可以在服务器确认已连接到客户端的情况下工作,但它会使用文本引发异常(捕获和处理):
无法从传输连接读取数据:远程主机强行关闭现有连接。 - (System.IO.IOException)
现在因为我刚刚开始用C#进行网络编程,我不确定在哪里看,我的讲师说他会在下周的讲座中找到解决问题的原因和解决方案,但我想采取主动,找出自己。
我已经添加了Client.cs和Server.cs类以防它们有用,调试器建议原因在于Server.cs中的第27行,对streamReader.Readline()的调用;
注意:这绝不是作业,我只是好奇为什么它不起作用。称之为学习经历=]
Client.cs
using System;
using System.Net.Sockets;
using System.IO;
namespace NetworkProgrammingTutorial1Client
{
class Client
{
static void Main(string[] args)
{
TcpClient myclient;
try
{
// Create a TcpClient to talk to the local host.
myclient = new TcpClient("localhost", 1234);
}
catch
{
Console.WriteLine("Failed to connect to the server.");
return;
}
// get a Network stream from the server
NetworkStream networkStream = myclient.GetStream();
StreamWriter streamWriter = new StreamWriter(networkStream);
streamWriter.WriteLine("Have a message.");
streamWriter.Flush();
}
}
}
Server.cs
using System;
using System.Net.Sockets;
using System.Net;
using System.IO;
namespace NetworkProgrammingTutorial1Server
{
class Server
{
static void Main(string[] args)
{
// TcpListener is listening on the given port... {
TcpListener tcpListener = new TcpListener(1234);
tcpListener.Start();
Console.WriteLine("Server Started") ;
// Accepts a new connection...
Socket socketForClient = tcpListener.AcceptSocket();
try
{
if (socketForClient.Connected)
{
while (true)
{
Console.WriteLine("Client connected");
NetworkStream networkStream = new NetworkStream(socketForClient);
StreamReader streamReader = new StreamReader(networkStream);
string line = streamReader.ReadLine();
if (line == null)
break;
Console.WriteLine(line);
}
}
socketForClient.Close();
Console.WriteLine("Exiting...");
}
catch(Exception e)
{
Console.WriteLine(e.ToString()) ;
}
}
}
}
答案 0 :(得分:1)
试试这个服务器代码:
TcpListener listener = new TcpListener(IPAddress.Any, 1234);
listener.Start();
using (TcpClient client = listener.AcceptTcpClient())
using (StreamReader reader = new StreamReader(client.GetStream()))
{
string line;
while ((line = reader.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
listener.Stop();
这将侦听端口1234,接受一个客户端,创建StreamReader并输出客户端发送的所有行,直到客户端关闭连接。然后它停止收听和退出。
如您所见,只创建了一个StreamReader(不是每行重复一次),完成后,TcpClient和StreamReader都由using
语句处理。
您的客户端代码应该有效。不过,在这里处理对象也是一个好主意:
using (TcpClient client = new TcpClient("localhost", 1234))
using (StreamWriter writer = new StreamWriter(client.GetStream()))
{
writer.WriteLine("Have a message.");
writer.Flush();
writer.WriteLine("Have another message.");
writer.Flush();
}