我想用socket编一个文件互传.已经实现文件重客户端发到服务端。问题是服务器的read是阻塞的,必须要客户端关闭我才可以读。可是我还必须要再用到客户端。请教方法。
解决方案 »
- 对于回调方式,如何反射?
- java 计算器
- JSP网上购物车
- 为什么我运行InetAddress.getLocalHost()会出异常?
- 什么是api,做什么用?哪里可以下载?
- 学习lucene源码的疑问11111111111111111111111111
- connect database programmer can not be run!!
- 我想将在程序一运行时,就把焦点设置在一个JTextArea内,该用什么函数?
- 一个关于Visual Age For Java 3.0简体中文企业版 帮助的简单问题,100分轻松拿到!!
- 请问用JDBC如果找到远程数据库,并访问它呢?谢谢
- 数据转换
- 第一次运行java程序就出现这个问题,不知如何解决,请帮忙!
什么叫“服务器的read是阻塞的,必须要客户端关闭我才可以读”
package com.sun.net3;import java.io.*;
import java.net.*;
import java.util.ArrayList;
public class FileServer {
private ServerSocket servSck;
private Socket cliSck;
static ArrayList al=new ArrayList();
public static void main(String[] args) {
FileServer fs=new FileServer();
try {
fs.init();
} catch (IOException e) {
e.printStackTrace();
}
} public FileServer() {
try {
servSck=new ServerSocket(3000);
System.out.println("服务器运行中,监听端口3000...");
} catch (IOException e) {
System.out.println("服务器运行出错");
}
}
public void init() throws IOException{
while(true){
cliSck=servSck.accept();
System.out.println("有客户连接,启动线程");
System.out.println("接受文件中");
transer tr=new transer(cliSck);
al.add(tr);
tr.start();
}
}
}
package com.sun.net3;import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;class transer extends Thread{
private FileOutputStream fos;
private Socket cliSck;
private DataInputStream dis;
private String msg;
public transer(Socket cliSck){
this.cliSck=cliSck;
} public void run() { this.reClient();
this.writeClient(cliSck);
}
public void reClient() {
try {
dis=new DataInputStream(cliSck.getInputStream());
String file=dis.readUTF();
fos=new FileOutputStream(file,true);
byte b[]=new byte[1024];
int n=0;
while(dis.readByte()!=0){
System.out.println(1);
n=dis.read(b);
fos.write( b,0,n);
fos.flush();
}
System.out.println(n);
fos.close();
// dis.close();
// cliSck.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void writeClient(Socket client) {
try {
OutputStream os = client.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
String msg = "这是服务器做出的回答";
dos.writeUTF(msg);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.sun.net3;import java.io.*;
import java.net.*;import javax.swing.*;import com.sun.xml.bind.marshaller.DataWriter;public class FileClient {
private static FileInputStream fis;
private static Socket cliSck;
private static DataOutputStream dos;
public static void main(String[] args) {
FileClient fc=new FileClient();
try {
cliSck = new Socket("localhost", 3000);
JFileChooser jf=new JFileChooser();
jf.showOpenDialog(null);
File file=jf.getSelectedFile();
fc.sedServer(file);
fc.readServer();
} catch (UnknownHostException e) {
} catch (IOException e) {
}
} public void sedServer(File file) {
try {
dos=new DataOutputStream(cliSck.getOutputStream());
dos.writeUTF(file.getAbsolutePath());
dos.flush();
fis = new FileInputStream(file);
byte[] b = new byte[1024];
int n;
while ((n = fis.read(b))!=-1) {
dos.writeByte(1);
System.out.println(n);
dos.write(b,0,n);
dos.flush();
}
dos.writeByte(0);
fis.close();
// dos.close();
// cliSck.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void readServer(){
try {
InputStream is=cliSck.getInputStream();
DataInputStream di=new DataInputStream(is);
System.out.println("服务器的回复"+di.readUTF());
// dos.close();
// cliSck.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}