通过socketjavac发送大量文件#
我试图通过socket C#和Java应用程序发送一组文件,但无法接收所有文件。我认为,服务器应用程序关闭连接,因为服务器总是在发送文件后关闭连接,而不确保客户端应用程序收到文件 以下是C#客户端代码:通过socketjavac发送大量文件#,java,c#,sockets,Java,C#,Sockets,我试图通过socket C#和Java应用程序发送一组文件,但无法接收所有文件。我认为,服务器应用程序关闭连接,因为服务器总是在发送文件后关闭连接,而不确保客户端应用程序收到文件 以下是C#客户端代码: public static void connectWithRemoteServer(string strIp, string strMessage, out string strResult) { strResult = "";
public static void connectWithRemoteServer(string strIp, string strMessage, out
string strResult)
{
strResult = "";
TcpClient tcpClient = new TcpClient();
tcpClient.Connect(strIp, 1593);
NetworkStream networkStream = tcpClient.GetStream();
StreamReader sr = new StreamReader(networkStream);
if (strMessage.Substring(0,1).Equals("s"))
{
byte[] byteBuffer = Encoding.ASCII.GetBytes(strMessage);
networkStream.Write(byteBuffer, 0, byteBuffer.Length);
strResult = sr.ReadLine();
}
else if (strMessage.Substring(0, 1).Equals("f"))
{
byte[] byteBuffer = Encoding.ASCII.GetBytes(strMessage);
networkStream.Write(byteBuffer, 0, byteBuffer.Length);
int length = int.Parse(sr.ReadLine());
byte[] buffer = new byte[length];
networkStream.Read(buffer, 0, (int)length);
string var = strMessage.Substring(1);
//write to file
BinaryWriter bWrite = new BinaryWriter(File.Open(var, FileMode.Create));
bWrite.Write(buffer);
bWrite.Flush();
bWrite.Close();
strResult = "ok";
}
tcpClient.Close();
}
}
foreach (string strFilePath in lst)
{
Utilities.connectWithRemoteServer("192.168.0.167", "f" + strFilePath, out str);
}
Java服务器应用程序
while(true)
{
String listeFiles = "";
ServerSocket serverSocket = new ServerSocket(1593);
System.out.println("Server started and waiting for request..");
Socket socket = serverSocket.accept();
System.out.println("Connection accepted from " + socket);
// this is to send to the client application
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
// this is to receive from the client application
BufferedInputStream in = new BufferedInputStream(socket.getInputStream());
byte[] bytearray = new byte[in.available()];// recived byte from the
// client application
in.read(bytearray, 0, bytearray.length);// read recieved byte from
String strRecieved = new String(bytearray);// get the received string
System.out.println(strRecieved);
//strRecieved = strRecieved.trim();
if(strRecieved.substring(0,1).equals("s"))
{
List<String> lstFiles = GetFiles.getListFilesPath("./testData");
for (String str : lstFiles) {
listeFiles = str + "+" + listeFiles;
}
String listFilesToSend = listeFiles.substring(0, listeFiles.length() - 1);
out.println(listFilesToSend);
System.out.println("List Files Send ");
serverSocket.close();
socket.close();
}
else if (strRecieved.substring(0,1).equals("f"))
{
File file = new File(strRecieved.substring(1));
// // send file length
out.println(file.length());
// read file to buffer
byte[] buffer = new byte[(int) file.length()];
DataInputStream dis = new DataInputStream(new FileInputStream(file));
dis.read(buffer, 0, buffer.length);
// // send file
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
bos.write(buffer);
bos.flush();
serverSocket.close();
socket.close();
}
}
}
任何帮助都将不胜感激。
谢谢。这是您的问题:
byte[]bytearray=new byte[in.available()]
如果从客户端发送的数据缓冲区大于最大容量,则您只需在buffer中读取长度等于该最大容量的数据。@m.rogalski我没有解决您的问题,客户端应用程序中提出的验证(C#)如何选择问题您遇到的一般问题是,您没有使用指定的协议,并且您只中继输入/输出缓冲区。或者要了解更多信息。@m.rogalski我正在使用TCP协议,请您帮助我。您在回答中有所有必要的详细信息,我在之前的评论中已经链接了您。
unable to write data to the transport connection an existing connection was forcibly closed