启动两个java虚拟机,每一个都既是客户端又是服务器,需要多线程来实现。
Cilent.java:
package com.oracle.test1;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client implements Runnable{
/*
* 主线程作为客户端上传文件,需要输入上传文件路径
*/
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
try {
new Thread(new Client()).start();
String str=scan.next();
Socket socket=new Socket("localhost", 6040);
File file=new File(str);
FileInputStream fis=new FileInputStream(file);
BufferedReader br=new BufferedReader(new InputStreamReader(fis));
OutputStream os=socket.getOutputStream();
PrintWriter pw=new PrintWriter(os);
String temp="";
byte []bytes=new byte[1024];
pw.println(str);
while((temp=br.readLine())!=null){
pw.println(temp);
}
pw.flush();
System.out.println("-----客户端A发送完毕------");
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* 另建一个线程作为服务器接收文件,默认保存到e盘根目录
*/
@Override
public void run() {
// TODO Auto-generated method stub
try {
ServerSocket server=new ServerSocket(6041);
Socket socket = server.accept();
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String temp =br.readLine();
String[] strs=temp.split("/");
File file = new File("e:",strs[strs.length-1]);
FileOutputStream fos = new FileOutputStream(file);
PrintWriter pw=new PrintWriter(new OutputStreamWriter(fos));
temp=null;
while ((temp = br.readLine())!=null) {
pw.println(temp);
}
pw.flush();
System.out.println("----服务器B接收完毕---");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Server.java:
package com.oracle.test1;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Server implements Runnable{
/*
* 主线程作为服务器接收文件,默认保存到e盘根目录
*/
public static void main(String[] args) {
try {
ServerSocket server=new ServerSocket(6040);
new Thread(new Server()).start();
Socket socket = server.accept();
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String temp =br.readLine();
String[] strs=temp.split("/");
File file = new File("e:",strs[strs.length-1]);
FileOutputStream fos = new FileOutputStream(file);
PrintWriter pw=new PrintWriter(new OutputStreamWriter(fos));
temp=null;
while ((temp = br.readLine())!=null) {
pw.println(temp);
}
pw.flush();
System.out.println("----服务器A接收完毕---");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* 另建一个线程作为客户端上传文件,需要输入上传文件路径
*/
@Override
public void run() {
// TODO Auto-generated method stub
Scanner scan=new Scanner(System.in);
try {
String str=scan.next();
Socket socket=new Socket("localhost", 6041);
File file=new File(str);
FileInputStream fis=new FileInputStream(file);
BufferedReader br=new BufferedReader(new InputStreamReader(fis));
OutputStream os=socket.getOutputStream();
PrintWriter pw=new PrintWriter(os);
String temp="";
byte []bytes=new byte[1024];
pw.println(str);
while((temp=br.readLine())!=null){
pw.println(temp);
}
pw.flush();
System.out.println("-----客户端B发送完毕------");
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}