第一次写socket小程序,用socket上传文件,却总出问题,请大家帮我看看代码,到底是什么原因,以下是我的代码客户端:package com.ydz.client.socket;import java.io.*;
import java.net.*;public class SocketClient { public static void main(String[] args)
{
Socket s = null;
try{
File file = new File("F://java练习//AA.java");
FileInputStream fis = new FileInputStream(file);
long fileSize = fis.available();
String fileName = file.getName();
s = new Socket("127.0.0.1", 10000);
System.out.println("已经连接上服务器");
OutputStream os = s.getOutputStream();
PrintWriter pw = new PrintWriter(os, true);
pw.println(fileSize);
pw.println(fileName);
byte[] buffer = new byte[1024];
long count = fileSize/1024;
if(fileSize%1024 != 0)
count += 1;
for(long i=0; i<count; i++){
int aa = fis.read(buffer, 0, 1024);
os.write(buffer, 0, aa);
}
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
if(br.readLine().equals("OK")){
os.close();
fis.close();
s.close();
}
} catch (IOException e){
e.printStackTrace();
}
}
}
服务端:package com.ydz.server.socket;import java.io.*;
import java.net.*;import com.ydz.server.thread.inceptfile.InceptFileThread;public class SocketServer { public void start()
{
try{
ServerSocket ss = new ServerSocket(10000);
System.out.println("等待客户端连接");
int i = 1;
while(true){
Socket s = ss.accept();
System.out.println("第"+String.valueOf(i)+"客户端连接进来了");
InceptFileThread ifThread = new InceptFileThread(s, i);
ifThread.start();
i++;
}
} catch (IOException e){
e.printStackTrace();
}
}
public static void main(String[] args)
{
SocketServer ss = new SocketServer();
ss.start();
}
}
package com.ydz.server.thread.inceptfile;import java.io.*;
import java.net.Socket;public class InceptFileThread extends Thread { private Socket s;
private int fileNumber;
public InceptFileThread(Socket s, int fileNumber){
this.s = s;
this.fileNumber = fileNumber;
}
public void run(){
try{
InputStream is = s.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
PrintWriter pw = new PrintWriter(s.getOutputStream());
System.out.println("第"+String.valueOf(fileNumber)+"个文件开始上传");
String fileSizeStr = br.readLine();
System.out.println("文件长度"+fileSizeStr);
long fileSize = Long.valueOf(fileSizeStr).longValue();
String fileName = br.readLine();
System.out.println("文件名称"+fileName);
StringBuilder filePath = new StringBuilder();
filePath.append("E://主服务器//file")
.append(fileNumber);
File fileCatalog = new File(filePath.toString());
if(!fileCatalog.exists())
fileCatalog.mkdirs();
filePath.append("//").append(fileName);
File file = new File(filePath.toString());
FileOutputStream fos = new FileOutputStream(file);
byte[] buffer = new byte[1024];
long count = fileSize/1024;
if(fileSize%1024 != 0)
count += 1;
System.out.println("开始接收文件");
for(long i=0; i<count; i++){
int aa = is.read(buffer, 0, 1024);
fos.write(buffer, 0, aa);
}
fos.close();
is.close();
System.out.println("文件"+fileNumber+"上传完毕");
pw.println("OK");
} catch (IOException e) {
e.printStackTrace();
}
}
}
整个程序执行到线程类的for循环中的第一句“int aa = is.read(buffer, 0, 1024);”就阻塞了,文件总是无法实现上传,请各位高人知道,提前感谢。
import java.net.*;public class SocketClient { public static void main(String[] args)
{
Socket s = null;
try{
File file = new File("F://java练习//AA.java");
FileInputStream fis = new FileInputStream(file);
long fileSize = fis.available();
String fileName = file.getName();
s = new Socket("127.0.0.1", 10000);
System.out.println("已经连接上服务器");
OutputStream os = s.getOutputStream();
PrintWriter pw = new PrintWriter(os, true);
pw.println(fileSize);
pw.println(fileName);
byte[] buffer = new byte[1024];
long count = fileSize/1024;
if(fileSize%1024 != 0)
count += 1;
for(long i=0; i<count; i++){
int aa = fis.read(buffer, 0, 1024);
os.write(buffer, 0, aa);
}
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
if(br.readLine().equals("OK")){
os.close();
fis.close();
s.close();
}
} catch (IOException e){
e.printStackTrace();
}
}
}
服务端:package com.ydz.server.socket;import java.io.*;
import java.net.*;import com.ydz.server.thread.inceptfile.InceptFileThread;public class SocketServer { public void start()
{
try{
ServerSocket ss = new ServerSocket(10000);
System.out.println("等待客户端连接");
int i = 1;
while(true){
Socket s = ss.accept();
System.out.println("第"+String.valueOf(i)+"客户端连接进来了");
InceptFileThread ifThread = new InceptFileThread(s, i);
ifThread.start();
i++;
}
} catch (IOException e){
e.printStackTrace();
}
}
public static void main(String[] args)
{
SocketServer ss = new SocketServer();
ss.start();
}
}
package com.ydz.server.thread.inceptfile;import java.io.*;
import java.net.Socket;public class InceptFileThread extends Thread { private Socket s;
private int fileNumber;
public InceptFileThread(Socket s, int fileNumber){
this.s = s;
this.fileNumber = fileNumber;
}
public void run(){
try{
InputStream is = s.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
PrintWriter pw = new PrintWriter(s.getOutputStream());
System.out.println("第"+String.valueOf(fileNumber)+"个文件开始上传");
String fileSizeStr = br.readLine();
System.out.println("文件长度"+fileSizeStr);
long fileSize = Long.valueOf(fileSizeStr).longValue();
String fileName = br.readLine();
System.out.println("文件名称"+fileName);
StringBuilder filePath = new StringBuilder();
filePath.append("E://主服务器//file")
.append(fileNumber);
File fileCatalog = new File(filePath.toString());
if(!fileCatalog.exists())
fileCatalog.mkdirs();
filePath.append("//").append(fileName);
File file = new File(filePath.toString());
FileOutputStream fos = new FileOutputStream(file);
byte[] buffer = new byte[1024];
long count = fileSize/1024;
if(fileSize%1024 != 0)
count += 1;
System.out.println("开始接收文件");
for(long i=0; i<count; i++){
int aa = is.read(buffer, 0, 1024);
fos.write(buffer, 0, aa);
}
fos.close();
is.close();
System.out.println("文件"+fileNumber+"上传完毕");
pw.println("OK");
} catch (IOException e) {
e.printStackTrace();
}
}
}
整个程序执行到线程类的for循环中的第一句“int aa = is.read(buffer, 0, 1024);”就阻塞了,文件总是无法实现上传,请各位高人知道,提前感谢。
运行结果:
[align=center]等待客户端连接
第1客户端连接进来了
第1个文件开始上传
文件长度19968
文件名称1.doc
开始接收文件
文件1上传完毕[/align]
第1客户端连接进来了
第1个文件开始上传
文件长度19968
文件名称1.doc
开始接收文件
文件1上传完毕
第1客户端连接进来了
第1个文件开始上传
文件长度182
文件名称AA.java
开始接收文件这样就没反应了,也没有异常的捕获,文件只是在目标目录创建了,但是没有内容上传
private int fileNumber;
public InceptFileThread(Socket s, int fileNumber){
this.s = s;
this.fileNumber = fileNumber;
}
public void run(){
try{
InputStream is = s.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
PrintWriter pw = new PrintWriter(s.getOutputStream());
System.out.println("第"+String.valueOf(fileNumber)+"个文件开始上传");
String fileSizeStr = br.readLine();
System.out.println("文件长度"+fileSizeStr);
long fileSize = Long.valueOf(fileSizeStr).longValue();
String fileName = br.readLine();
System.out.println("文件名称"+fileName);
StringBuilder filePath = new StringBuilder();
filePath.append("E://主服务器//file").append(fileNumber);
File fileCatalog = new File(filePath.toString());
if(!fileCatalog.exists())fileCatalog.mkdirs();
filePath.append("//").append(fileName);
File file = new File(filePath.toString());
FileOutputStream fos = new FileOutputStream(file);
byte[] buffer = new byte[1024];
long count = fileSize/1024;
if(fileSize%1024 != 0)
count += 1;
System.out.println("开始接收文件");
pw.println("ready");
pw.flush();
System.out.println("server is ready!");
//for(long i=0; i<count; i++){
while(true){
int aa = is.read(buffer, 0, 1024);
if(aa==-1)break;
System.out.println("aa="+aa);
fos.write(buffer, 0, aa);
}
fos.close();
is.close();
System.out.println("文件"+fileNumber+"上传完毕");
pw.println("OK");
pw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class SocketClient { public static void main(String[] args)
{
Socket s = null;
try{
File file = new File("F:\\java练习\\AA.java");
FileInputStream fis = new FileInputStream(file);
long fileSize = fis.available();
String fileName = file.getName();
s = new Socket("127.0.0.1", 10000);
System.out.println("已经连接上服务器");
OutputStream os = s.getOutputStream();
PrintWriter pw = new PrintWriter(os, true);
pw.println(fileSize);
pw.println(fileName);
pw.flush();
byte[] buffer = new byte[1024];
long count = fileSize/1024;
if(fileSize%1024 != 0)
count += 1;
System.out.println("wait for the data from the server:");
InputStream in = s.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line="";
while(true){
line=br.readLine();
System.out.println("line="+line);
if(line!=null && line.equals("ready")){
for(long i=0; i<count; i++){
int aa = fis.read(buffer);
System.out.println("aa="+aa);
os.write(buffer, 0, aa);
os.flush();
}
break;
}
}
os.close();
fis.close();
s.close();
br.close();
} catch (IOException e){
e.printStackTrace();
}
}
}
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
if(br.readLine().equals("OK")){
这个判断,但是判断条件内部的语句保留,文件可以传上去了,但是传上去的文件,占用空间大小和原文件一样,打开后却是空的,什么都没有。
刚帮你看了下,文件传上去后确实是空的,帮你改了一下:// 客户端
package test;import java.io.*;
import java.net.*;public class SocketClient { public static void main(String[] args)
{
Socket s = null;
try{
File file = new File("C:/socketTest.txt");
BufferedReader br = new BufferedReader(new FileReader(file));
long fileSize = file.length();//.available();
String fileName = file.getName();
s = new Socket("127.0.0.1", 10000);
System.out.println("已经连接上服务器");
OutputStream os = s.getOutputStream();
PrintWriter pw = new PrintWriter(os, true);
pw.println(fileSize);
pw.println(fileName);
final char[] buffer = new char[1024];
long count = fileSize/1024;
if(fileSize%1024 != 0)
count += 1;
// for(long i=0; i<count; i++){
// int aa = fis.read(buffer, 0, 1024);
// os.write(buffer, 0, aa);
// }
int len = 0;
while((len = br.read(buffer,0,buffer.length)) != -1) {
pw.write(buffer, 0, len);
pw.flush();
}
// BufferedReader br2 = new BufferedReader(new InputStreamReader(s.getInputStream()));
// if(br2.readLine().equals("OK")){
os.close();
pw.close();
s.close();
// }
} catch (IOException e){
e.printStackTrace();
}
}
}
//服务端package test;import java.io.*;
import java.net.*;
public class SocketServer { public void start()
{
try{
ServerSocket ss = new ServerSocket(10000);
System.out.println("等待客户端连接");
int i = 1;
while(true){
Socket s = ss.accept();
System.out.println("第"+String.valueOf(i)+"客户端连接进来了");
InceptFileThread ifThread = new InceptFileThread(s, i);
ifThread.start();
i++;
}
} catch (IOException e){
e.printStackTrace();
}
}
public static void main(String[] args)
{
SocketServer ss = new SocketServer();
ss.start();
}
}class InceptFileThread extends Thread { private Socket s;
private int fileNumber;
public InceptFileThread(Socket s, int fileNumber){
this.s = s;
this.fileNumber = fileNumber;
}
public void run(){
try{
InputStream is = s.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
PrintWriter pw = new PrintWriter(s.getOutputStream());
System.out.println("第"+String.valueOf(fileNumber)+"个文件开始上传");
String fileSizeStr = br.readLine();
System.out.println("文件长度"+fileSizeStr);
long fileSize = Long.valueOf(fileSizeStr).longValue();
String fileName = br.readLine();
System.out.println("文件名称"+fileName);
StringBuilder filePath = new StringBuilder();
filePath.append("C://file")
.append(fileNumber);
File fileCatalog = new File(filePath.toString());
if(!fileCatalog.exists())
fileCatalog.mkdirs();
filePath.append("//").append(fileName);
File file = new File(filePath.toString());
FileWriter fos = new FileWriter(file);
final char[] buffer = new char[1024];
long count = fileSize/1024;
if(fileSize%1024 != 0)
count += 1;
System.out.println("开始接收文件");
// for(long i=0; i<count; i++){
// int aa = is.read(buffer, 0, 1024);
// fos.write(buffer, 0, aa);
// }
int len = 0;
while((len = br.read(buffer,0,buffer.length)) != -1) {
fos.write(buffer, 0, len);
fos.flush();
}
fos.close();
is.close();
System.out.println("文件"+fileNumber+"上传完毕");
// pw.println("OK");
} catch (IOException e) {
e.printStackTrace();
}
}
}