2012-01-18 106 views
2

我正在尝试创建一个程序,允许用户上传JAR文件,以获取已写入在线服务器的第三方代码,然后收到回复的字符串消息。C#网络问题

在线服务器使用带有标准TCP Socket网络的Java进行编码。客户端使用一个额外的软件,这意味着我必须使用C#作为File uploader。我写的代码包含在下面。在这个程序中,File uploader工作正常,但由于某种原因,客户端在达到input.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类没有发送字节数组的方法,(只有一个字符数组)。我想知道问题是否是由于我直接调用NetworkStream的Write方法而不是使用StreamWriter导致的。

如果任何人有任何想法为什么上面的代码不工作,请让我知道。或者,如果你有一个不同的解决方案,允许我发送一个文件(字节数组),并使用同一个TCPClient连接接收一个字符串消息,那么请随时提及它。

Regards,

Midavi。

+1

StreamReader.ReadLine需要换行符,回车符或组合。服务器发送了吗? – 2012-01-18 14:48:52

回答

0

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

1

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

+0

服务器使用Java PrintWriter的println方法发送字符串消息,因此行结束标志应与字符串的其余部分一起发送。如果我用StreamWriter.Write()替换了我的代码中的NetworkStream.Write方法,然后发送“Test \ n”,一切正常,(测试字符串由服务器接收,并且它的响应字符串由客户端接收)。但是,我无法使用StreamWriter发送包含我的文件的字节数组。 – midavi 2012-01-18 14:59:08

+0

请发布您的服务器代码,发送字符串。 – 2012-01-19 17:43:58

+0

上面的代码接缝正确,它只是我们想要的服务器端代码。 – 2012-01-19 19:45:04

1

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

+0

服务器使用Java PrintWriter的println方法发送字符串消息,因此行尾标志应与字符串的其余部分一起发送。 – midavi 2012-01-18 14:58:13

0

Readline等待行结束\ r \ n但在java行结束是默认情况\ n只有这可能是可以阻止您的通信,但要确保您需要监听网络活动,或者您可以使用其他方法读取数据。

您可以尝试使用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);