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。
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);