如何使用tcp发送txt以外的文件格式
how to send file formats other than txt using tcp
我正在尝试使用 tcp 连接将 pdf 文件发送给客户端。不知何故,文件已损坏。请问tcp是否支持非txt文件?
这是一个简单的服务器程序
import java.io.*;
import java.net.*;
class server{
public static void main (String args[]) throws Exception
{
Socket s = null;
int firsttime=1;
while(true) {
ServerSocket s_sock = new ServerSocket(3248);
Socket socket = s_sock.accept();
BufferedReader bf = new BufferedReader(new InputStreamReader(socket.getInputStream()));
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
File myFile = new File ("/Users/wchen48/Desktop/123.pdf");
byte [] mybyte = new byte[(int)myFile.length()];
OutputStream os = socket.getOutputStream();
System.out.println("sending......" + mybyte.length + "Byte");
os.write(mybyte,0,mybyte.length);
os.flush();
socket.close();
s_sock.close();
}
} //end of main
这是客户:
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.Socket;
public class client{
public static void main(String[] argv) throws Exception {
Socket sock = new Socket("127.0.0.1", 3248);
byte[] mybytearray = new byte[11536];
InputStream is = sock.getInputStream();
FileOutputStream fos = new
FileOutputStream("/Users/wchen48/Documents/123.pdf");
bos = new BufferedOutputStream(fos);
int bytesRead = is.read(mybytearray, 0, mybytearray.length);
bos.write(mybytearray, 0, mybytearray.length);
bos.close();
sock.close();
}
}
提前致谢。
您没有将文件内容读入您稍后通过套接字发送的缓冲区 mybyte,因此您发送 00000....
文件损坏的最可能原因是您尝试读取的字节数固定 (11536)。您应该尝试读取套接字上接收到的所有字节,而不是固定数量的字节。
Zielu 和 Juned 所说的,加上:
服务器和客户端都需要循环。
在服务器上,选择一个合理大小的缓冲区并循环。尝试从文件中读取 [buffer length] 个字节。然后使用读取调用的返回值来检查错误(结果<0)或文件结尾(结果 0),或者使用网络写入调用中的值作为要写入的字节数。不要使用缓冲区长度 - 它可能未满。当你得到 0 时,关闭文件和套接字,否则循环并阅读更多内容。
在客户端,选择一个合理大小的缓冲区并循环。尝试从套接字中读取 [buffer length] 个字节。然后使用读取调用的返回值来检查错误(结果<0)或套接字关闭(结果 0),或使用文件写入调用中的值作为要写入的字节数。不要使用缓冲区长度 - 它可能未满。当你得到 0 时,退出循环并关闭文件,否则返回并阅读更多内容。
我正在尝试使用 tcp 连接将 pdf 文件发送给客户端。不知何故,文件已损坏。请问tcp是否支持非txt文件? 这是一个简单的服务器程序
import java.io.*;
import java.net.*;
class server{
public static void main (String args[]) throws Exception
{
Socket s = null;
int firsttime=1;
while(true) {
ServerSocket s_sock = new ServerSocket(3248);
Socket socket = s_sock.accept();
BufferedReader bf = new BufferedReader(new InputStreamReader(socket.getInputStream()));
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
File myFile = new File ("/Users/wchen48/Desktop/123.pdf");
byte [] mybyte = new byte[(int)myFile.length()];
OutputStream os = socket.getOutputStream();
System.out.println("sending......" + mybyte.length + "Byte");
os.write(mybyte,0,mybyte.length);
os.flush();
socket.close();
s_sock.close();
}
} //end of main
这是客户:
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.Socket;
public class client{
public static void main(String[] argv) throws Exception {
Socket sock = new Socket("127.0.0.1", 3248);
byte[] mybytearray = new byte[11536];
InputStream is = sock.getInputStream();
FileOutputStream fos = new
FileOutputStream("/Users/wchen48/Documents/123.pdf");
bos = new BufferedOutputStream(fos);
int bytesRead = is.read(mybytearray, 0, mybytearray.length);
bos.write(mybytearray, 0, mybytearray.length);
bos.close();
sock.close();
}
}
提前致谢。
您没有将文件内容读入您稍后通过套接字发送的缓冲区 mybyte,因此您发送 00000....
文件损坏的最可能原因是您尝试读取的字节数固定 (11536)。您应该尝试读取套接字上接收到的所有字节,而不是固定数量的字节。
Zielu 和 Juned 所说的,加上:
服务器和客户端都需要循环。
在服务器上,选择一个合理大小的缓冲区并循环。尝试从文件中读取 [buffer length] 个字节。然后使用读取调用的返回值来检查错误(结果<0)或文件结尾(结果 0),或者使用网络写入调用中的值作为要写入的字节数。不要使用缓冲区长度 - 它可能未满。当你得到 0 时,关闭文件和套接字,否则循环并阅读更多内容。
在客户端,选择一个合理大小的缓冲区并循环。尝试从套接字中读取 [buffer length] 个字节。然后使用读取调用的返回值来检查错误(结果<0)或套接字关闭(结果 0),或使用文件写入调用中的值作为要写入的字节数。不要使用缓冲区长度 - 它可能未满。当你得到 0 时,退出循环并关闭文件,否则返回并阅读更多内容。