【发布时间】:2012-04-18 20:33:23
【问题描述】:
这是一个从文件中搜索字符串的程序。客户端所需的字符串是从客户端给出的,在我的例子中,使用 telnet。我编写的程序是服务器端程序。它接受多个客户端。 但是,我无法纠正的问题是-
- 它不检查文件中的字符串。
- 一旦客户端建立连接,客户端就无法在该特定文件中键入他们想要搜索的字符串。
- 它不会将回复发送回(即文件中是否存在字符串)给客户端。它只显示在服务器端。
我该如何继续?有人能告诉我我哪里出错了吗?有人可以帮我写代码吗? 这是我在这个程序上的尝试..
class Program
{
static void Main(string[] args)
{
IPAddress ipad = IPAddress.Parse("192.168.0.181");
TcpListener serversocket = new TcpListener(ipad, 8888);
TcpClient clientsocket = default(TcpClient);
Byte[] bytes = new Byte[256];
serversocket.Start();
Console.WriteLine(">> Server Started");
while(true)
{
clientsocket = serversocket.AcceptTcpClient();
Console.WriteLine("Accepted Connection From Client");
LineMatcher lm = new LineMatcher(clientsocket);
Thread thread = new Thread(new ThreadStart(lm.Run));
thread.Start();
Console.WriteLine("Client connected");
}
Console.WriteLine(" >> exit");
Console.ReadLine();
clientsocket.Close();
serversocket.Stop();
}
}
public class LineMatcher //I've jumbled it up here. Don't know what exactly to do..
{
public string fileName = "c:/myfile2.txt";
private TcpClient _client;
public LineMatcher(TcpClient client)
{
_client = client;
}
public void Run()
{
try
{
StreamReader sr = new StreamReader("c:/myfile2.txt");
using (var reader = new StreamReader(_client.GetStream()))
{
string line ="";
int lineNumber = 0;
while (null != (line = sr.ReadLine()))
{
lineNumber += 1;
byte[] data = new byte[1024];
NetworkStream stream = _client.GetStream();
//if (line.Equals(line))
for (int ct = stream.Read(data,0, data.Length-1); 0 < ct; ct = stream.Read(data,0,data.Length-1))
line += Encoding.ASCII.GetString(data, 0, ct);
line = line.Trim();
{
lineNumber.ToString();
data = Encoding.ASCII.GetBytes(line);
_client.Client.Send(data, data.Length, SocketFlags.None);
Console.WriteLine("Line {0} matches {1}", lineNumber, line);
}
}
}
}
catch (Exception ex)
{
Console.Error.WriteLine(ex.ToString());
}
Console.WriteLine("Closing client");
_client.Close();
}
}
【问题讨论】:
-
从这段代码中我们无法看到发生了什么 - 您应该首先尝试调试代码以识别运行的位置(输入 lm.Run),当然我们需要查看
LineMatcher.Run中的代码,因为这可能是关键点 -
@CarstenKönig 非常感谢 Carsten。但我没有得到你。从我开始学习 C# 到现在才一个月。你能告诉我我该怎么做吗?和 LineMatcher.Run?怎么样?
-
你不知道如何设置断点和调试代码? - 只需在
LineMatcher类中调用thread.Start()和Run方法中的另一个断点 (F9) - 然后启动程序 (F5) 并使用 telnet 进行连接,看看你的断点是否被命中以及什么你的程序是从那里开始的......LineMatcher.Run是方法的名称Run发生 magic 的地方(你确实写了 - 不是吗?) -
顺便说一句:3个最爱。对此有 2 票赞成? - 哇,你让你的朋友增加你的声望了吗?
-
@CarstenKönig 我绝对不认识任何人。是的,我确实通过很多教程编写了它。谢谢你的程序,我会按照你的要求去做,看看出了什么问题。 :) 仍然是新手卡特森。对于那个很抱歉。有兴趣学习很多。我很高兴地说,我是.. :)
标签: c# client-server tcpclient serversocket tcplistener