//服务器端传来的文件中文显示不了,我知道是字节流的问题,可是我用字符流实现还是没有成功啊 请问怎么改 !!高手帮忙啊 !!!
//从服务器向客户端发送一个文件,客户端接收文件并保存
//Client端
import java.net.*;
import java.io.*;public class TcpClient { /**
* @param args从服务器向客户端发送一个文件,客户端接收文件并保存
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
while (true) {
Socket client = new Socket("10.33.0.9", 2222);
File f = null;
InputStream in = client.getInputStream();
int b = 0;
String str = "C:/";
while ((b = in.read()) != -1) {
str += (char) b;
}
f = new File(str);
f.createNewFile();
System.out.println("文件创建成功");
client.close(); Socket client1 = new Socket("10.33.0.9", 2222); // InputStream ins = client1.getInputStream();
// System.out.println(str);
// DataInputStream ins = new
// DataInputStream(client.getInputStream());//不知道为什么这样就不行呢
// str = str+ins.readUTF(); int bc = 0;
BufferedInputStream buffin = new BufferedInputStream(
client1.getInputStream());// 将管道中的数据读入缓冲区
FileWriter fw = new FileWriter(f);
while ((bc = buffin.read()) != -1) {
fw.write(bc);
}
System.out.println("client over");
fw.close();
client1.close();
buffin.close();
}
}
}
//Server端import java.net.*;
import java.io.*;
import java.util.*;public class TcpServer { /**
*
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
while (true) {
ServerSocket server = new ServerSocket(2222);
File f = new File("D:/JavaWorkspace/day12/src/TcpServer.java"); Socket socket = server.accept();
DataOutputStream dos = new DataOutputStream(
socket.getOutputStream());
System.out.println("请输入要传递的文件名");
Scanner in = new Scanner(System.in);
String path = in.next();// 文件名
if (path != null) {
dos.writeBytes(path);
}
dos.flush();
dos.close();
socket.close();
Socket socket1 = server.accept();
DataOutputStream dos1 = new DataOutputStream(
socket1.getOutputStream());
FileReader fr = new FileReader(f);
int b = 0;
while ((b = fr.read()) != -1) {
dos1.write(b);
}
System.out.println("server over"); dos1.flush();
dos1.close();
server.close();
socket1.close(); }
}}
//从服务器向客户端发送一个文件,客户端接收文件并保存
//Client端
import java.net.*;
import java.io.*;public class TcpClient { /**
* @param args从服务器向客户端发送一个文件,客户端接收文件并保存
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
while (true) {
Socket client = new Socket("10.33.0.9", 2222);
File f = null;
InputStream in = client.getInputStream();
int b = 0;
String str = "C:/";
while ((b = in.read()) != -1) {
str += (char) b;
}
f = new File(str);
f.createNewFile();
System.out.println("文件创建成功");
client.close(); Socket client1 = new Socket("10.33.0.9", 2222); // InputStream ins = client1.getInputStream();
// System.out.println(str);
// DataInputStream ins = new
// DataInputStream(client.getInputStream());//不知道为什么这样就不行呢
// str = str+ins.readUTF(); int bc = 0;
BufferedInputStream buffin = new BufferedInputStream(
client1.getInputStream());// 将管道中的数据读入缓冲区
FileWriter fw = new FileWriter(f);
while ((bc = buffin.read()) != -1) {
fw.write(bc);
}
System.out.println("client over");
fw.close();
client1.close();
buffin.close();
}
}
}
//Server端import java.net.*;
import java.io.*;
import java.util.*;public class TcpServer { /**
*
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
while (true) {
ServerSocket server = new ServerSocket(2222);
File f = new File("D:/JavaWorkspace/day12/src/TcpServer.java"); Socket socket = server.accept();
DataOutputStream dos = new DataOutputStream(
socket.getOutputStream());
System.out.println("请输入要传递的文件名");
Scanner in = new Scanner(System.in);
String path = in.next();// 文件名
if (path != null) {
dos.writeBytes(path);
}
dos.flush();
dos.close();
socket.close();
Socket socket1 = server.accept();
DataOutputStream dos1 = new DataOutputStream(
socket1.getOutputStream());
FileReader fr = new FileReader(f);
int b = 0;
while ((b = fr.read()) != -1) {
dos1.write(b);
}
System.out.println("server over"); dos1.flush();
dos1.close();
server.close();
socket1.close(); }
}}
解决方案 »
- 如何解决 connection reset by peer:socket write error 问题??
- 内部类在主方法中的实例化为什么用的是 .new
- 在JTextArea上显示滚动条问题,帮忙看看程序~
- 有关字节与字符的个数
- 使用 group by 子句后的ResultSet的问题!!
- 请教:在Ecplise能启动TOMCAT,而在LOMBOZ中。。。
- 为什么在JComboBox的ItemChange事件改变界面风格(setLookAndFeel)会报错
- int 类型的数据如何显示
- 图形操作的一个问题
- 哪位大虾能告诉我unicode中中文段的值?
- java中泛型的应用问题
- split的问题
不过,对于传输文件而言,一般建议读写直接用 byte[] 数组来做,效率高,且适用于任何文件类型,图片啥的都没问题。
DataOutputStream dos1 = new DataOutputStream(socket1.getOutputStream());
FileReader fr = new FileReader(f);
while ((b = fr.read()) != -1) {
dos1.write(b);
}你可能感觉 fr.read() 返回int,dos1.write()参数也是int,刚好就对了。其实就错了!先看看 DataOutputStream:
public void write(int b)
throws IOException
Writes the specified byte (the low eight bits of the argument b) to the underlying output stream. If no exception is thrown, the counter written is incremented by 1.再看看 FileReader:
public int read()
throws IOException
Read a single character.结果你从文件中读取1个字符,然后再流中写入1个字节。。客户端代码错得完全一致。
建议:服务器端用:FileInputStream;客户端用:FileOutputStream