BBS水木清华站∶精华区

发信人: stevenc (stevenc), 信区: Java 
 
我在使用socket建立了网络通信后,使用DataInputStream 
和DataOutputStream进行数据流的传送,client端能送出文件, 
但server却不能正常收取全部文件,而只能接收到一部分文件, 
大约只有9KB左右,其余的不知所踪,而且这9KB也只是文件的 
前一部分。 
这到底是怎么回事,还请大虾们多多指教。 
小弟是位新手,如今是火烧眉毛,哪位大虾如果不嫌弃的话, 
还请您直接把解决方法邮至chenqch@163.net。小弟这里上 
清华比较困难,这里就先多谢了。 
程序如下: 
public class FileClientThread extends Thread 

Socket miniClient; 
DataOutputStream out1; 
String ip; 
FileInputStream infile; 
byte read[]; 
int r; 
boolean flag=true; 
File file2; 
//File file3; 
//FileOutputStream outfile; 
 
FileClientThread() 

super("FileClient Thread"); 

 
public void run() 

    while(flag) 
    { 
 
    try 
    { 
    ip=edit1.getText(); 
    miniClient=new Socket(ip,2002); 
    } 
    catch(Exception r) 
    { 
richEdit3.setText"outputsocketerror"+r); 
    } 
 
    try 
    {     
    String filename=edit4.getText(); 
file2=new File("C:\\My Documents\\Visual Studio Projects\\xianliao",filen 
ame); 
    infile=new FileInputStream(file2); 
    read=new byte[(int)file2.length()]; 
 
    r=infile.read(read); 
 
/*file3=new File("C:\\My Documents\\Visual Studio Projects\\xianliao","win 
.gif"); 
outfile=new FileOutputStream(file3); 
outfile.write(read);*/ 
 
out1=new DataOutputStream(new BufferedOutputStream(miniClient.getOutputStr 
eam())); 
 
out1.writeInt(read.length); 
 
out1.write(read,0,read.length); 
 
out1.writeBytes(file2.getName());  
 
infile.close(); 
//outfile.close(); 
out1.close(); 
miniClient.close(); 
 
flag=false; 
 
    } 
    catch(Exception r) 
    { 
    richEdit3.setText("output error"+r); 
    } 



 
public class FileServerThread extends Thread 

DataInputStream in1; 
byte[] b; 
ServerSocket server1; 
Socket client; 
File file; 
FileOutputStream outfile; 
 
FileServerThread() 

super("FileSocketServer Thread"); 

 
public void run() 

button6.setEnabled(false); 
try 

server1=new ServerSocket(2002); 

catch(Exception r) 

richEdit3.setText("input error"+r); 

 
 
try 

client=server1.accept(); 

catch(Exception r) 
    { 
     richEdit3.setText("inputserver error"+r); 
    } 
 
    try 
    { 
    in1=new DataInputStream(client.getInputStream()); 
      
int len=in1.readInt(); 
 
b=new byte[len]; 
in1.read(b); 
 
String filename=in1.readLine(); 
edit2.setText(filename); 
 
file=new File("C:\\My Documents\\Visual Studio Projects\\xianliao",filena 
me); 
outfile=new FileOutputStream(file); 
outfile.write(b); 
 
/*String str=new String(b); 
richEdit1.setText(str);*/ 
 
 
outfile.close(); 
in1.close(); 
    client.close(); 
 
button6.setEnabled(true); 
    } 
    catch(Exception r) 
    { 
    richEdit3.setText("input error"+r); 
    } 
 
try 

    server1.close(); 

catch(Exception r) 

    richEdit3.setText("server close error"+r); 



 
 
 
发信人: SerialNo (小抠**乖乖肥猪), 信区: Java        
 
我也遇到socks丢数据的现象 
也是后面的数据有时候会丢失 
但有时候会好 
最后也没解决:( 
 
 
 
发信人: Lover9 (无情), 信区: Java        
 
        我听人家说,socket的字节流模式只能保证字节的准确传输, 
 
        但不能保证写入socket的字节流能在一次读之后就能读出来, 
 
        因此如果你能知道写入socket的字节数之后,在读出的一方 
 
        用简单的while控制直到读出的字节数与写入的数相同时才终止 
 
        读入字节流。 
 
        如果 有兴趣,可以试一试。 
 
 
 
发信人: stevenc (stevenc), 信区: Java 
 
我在使用socket建立了网络通信后,使用DataInputStream 
和DataOutputStream进行数据流的传送,client端能送出文件, 
但server却不能正常收取全部文件,而只能接收到一部分文件, 
大约只有9KB左右,其余的不知所踪,而且这9KB也只是文件的 
前一部分。 
这到底是怎么回事,还请大虾们多多指教。 
小弟是位新手,如今是火烧眉毛,哪位大虾如果不嫌弃的话, 
还请您直接把解决方法邮至chenqch@163.net。小弟这里上 
清华比较困难,这里就先多谢了。 
程序如下: 
public class FileClientThread extends Thread 

Socket miniClient; 
DataOutputStream out1; 
String ip; 
FileInputStream infile; 
byte read[]; 
int r; 
boolean flag=true; 
File file2; 
//File file3; 
//FileOutputStream outfile; 
 
FileClientThread() 

super("FileClient Thread"); 

 
public void run() 

    while(flag) 
    { 
 
    try 
    { 
    ip=edit1.getText(); 
    miniClient=new Socket(ip,2002); 
    } 
    catch(Exception r) 
    { 
richEdit3.setText"outputsocketerror"+r); 
    } 
 
    try 
    {     
    String filename=edit4.getText(); 
file2=new File("C:\\My Documents\\Visual Studio Projects\\xianliao",filen 
ame); 
    infile=new FileInputStream(file2); 
    read=new byte[(int)file2.length()]; 
 
    r=infile.read(read); 
 
/*file3=new File("C:\\My Documents\\Visual Studio Projects\\xianliao","win 
.gif"); 
outfile=new FileOutputStream(file3); 
outfile.write(read);*/ 
 
out1=new DataOutputStream(new BufferedOutputStream(miniClient.getOutputStr 
eam())); 
 
out1.writeInt(read.length); 
 
out1.write(read,0,read.length); 
 
out1.writeBytes(file2.getName());  
 
infile.close(); 
//outfile.close(); 
out1.close(); 
miniClient.close(); 
 
flag=false; 
 
    } 
    catch(Exception r) 
    { 
    richEdit3.setText("output error"+r); 
    } 



 
public class FileServerThread extends Thread 

DataInputStream in1; 
byte[] b; 
ServerSocket server1; 
Socket client; 
File file; 
FileOutputStream outfile; 
 
FileServerThread() 

super("FileSocketServer Thread"); 

 
public void run() 

button6.setEnabled(false); 
try 

server1=new ServerSocket(2002); 

catch(Exception r) 

richEdit3.setText("input error"+r); 

 
 
try 

client=server1.accept(); 

catch(Exception r) 
    { 
     richEdit3.setText("inputserver error"+r); 
    } 
 
    try 
    { 
    in1=new DataInputStream(client.getInputStream()); 
      
int len=in1.readInt(); 
 
b=new byte[len]; 
in1.read(b); 
 
String filename=in1.readLine(); 
edit2.setText(filename); 
 
file=new File("C:\\My Documents\\Visual Studio Projects\\xianliao",filena 
me); 
outfile=new FileOutputStream(file); 
outfile.write(b); 
 
/*String str=new String(b); 
richEdit1.setText(str);*/ 
 
 
outfile.close(); 
in1.close(); 
    client.close(); 
 
button6.setEnabled(true); 
    } 
    catch(Exception r) 
    { 
    richEdit3.setText("input error"+r); 
    } 
 
try 

    server1.close(); 

catch(Exception r) 

    richEdit3.setText("server close error"+r); 



 
 
 
发信人: SerialNo (小抠**乖乖肥猪), 信区: Java        
 
我也遇到socks丢数据的现象 
也是后面的数据有时候会丢失 
但有时候会好 
最后也没解决:( 
 
 
 
发信人: Lover9 (无情), 信区: Java        
 
        我听人家说,socket的字节流模式只能保证字节的准确传输, 
 
        但不能保证写入socket的字节流能在一次读之后就能读出来, 
 
        因此如果你能知道写入socket的字节数之后,在读出的一方 
 
        用简单的while控制直到读出的字节数与写入的数相同时才终止 
 
        读入字节流。 
 
        如果 有兴趣,可以试一试。 
 
 
 

BBS水木清华站∶精华区