C#网络问题

本文关键字:问题 网络 | 更新日期: 2023-09-27 18:20:44

我正在尝试创建一个程序,允许用户将他们编写的某些第三方代码的JAR文件上传到在线服务器,然后收到一条String消息作为响应。

在线服务器使用Java和标准TCP套接字网络进行编码。客户端使用了一个额外的软件,这意味着我必须使用C#作为文件上传程序。我写的代码包含在下面。在这个程序中,文件上传器工作正常,但由于某种原因,客户端在到达输入时挂起。ReadLine(),用于接收来自服务器的String消息响应。

public static string sendFile(string filepath) {
    String response = "";
    // Get the file
    Stream fileStream = File.OpenRead(filepath);
    byte[] buffer = new byte[fileStream.Length];
    fileStream.Read(buffer, 0, buffer.Length);
    try {
        // Create the connection
        TCPClient client = new TCPClient("127.0.0.1", 21000);
        NetworkStream stream = client.GetStream();
        // Send the file to the server
        stream.Write(buffer, 0, buffer.Length);
        stream.Flush();
        // Receive a single string response from the server
        if (stream.CanRead) {
            StreamReader input = new StreamReader(stream);
            inputString = input.ReadLine();
        }
        input.Close();
        stream.Close();
        client.Close();
    }
    catch (IOException e) {
        print ("Error: " + e);
    }
    // Return the response message string
    return inputString;
}

我还尝试使用StreamWriter实现上面的代码,而不是直接从NetworkStream本身进行编写。不幸的是,StreamWriter类没有发送字节数组的方法(只有char数组)。我想知道问题是否是由我直接调用NetworkStream的Write方法而不是使用StreamWriter引起的。

如果有人知道为什么上面的代码不起作用,请告诉我。或者,如果你有一个不同的解决方案,可以让我使用相同的TCPClient连接发送一个文件(字节数组)并接收回一条字符串消息,那么也请随意提及。

问候,

Midavi。

C#网络问题

readline挂起,因为它只有在成功从服务器读取一行时才会返回,这是使用阻塞套接字的缺点。请确保您的服务器正在准确地发送一行(以"''n"结尾的字符串

您的流是否以行尾结束?Readline将阻塞,直到流结束或接收到行尾字符。如果你的上传者没有终止字符串,它可能会像你说的那样。

Checkout networkComms.net,一个开源的C#网络通信库。一个简短的例子展示了这里最基本的功能,希望不会过于复杂!你可能遇到的大多数问题都已经解决了,这可能会为你节省一些时间。

Readline等待行结束,''r''n但在java中,默认情况下仅为行结束。这可能会阻碍你的通信,但为了确保你需要窥探网络活动,或者你可以使用不同的方法来读取数据。

您可以尝试使用read方法:

byte[] myReadBuffer = new byte[512];
int numberOfBytesRead = 0;
// Incoming message may be larger than the buffer size.
do{
    numberOfBytesRead = stream.Read(myReadBuffer, 0, myReadBuffer.Length);  
    // do something with data in myReadBuffer
}
while(stream.DataAvailable);