服务器:
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.RandomAccessFile;
import java.io.UnsupportedEncodingException;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @author $KangMiao$
* 1、写个服务器可以接受客户端的数据,并可以把客户端的输入的数据,保存在电脑上,
* 并以 “name-yyyy-MMM-dd.txt”格式命名。其中 ,name为客户端的主机名字,后面的为时间格式。
*/
public class NetCopyServer01 {
private final String file = "e:/peixun/test/";
public void talk() {
try {
ServerSocket ss = new ServerSocket(8888);
System.out.println("服务器开启···");
Socket s = null;
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
while ((s = ss.accept()) != null) {
//获得客户端的主机名(s.getInetAddress()方法是活的客户端IP地址)
String fileName = s.getInetAddress().getHostName();
//拼接成保存客户端数据的文件名
fileName = file+fileName + "-" + df.format(new Date()) + ".txt";
System.out.println(fileName);
ServerThread st = new ServerThread(s,fileName);
st.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
NetCopyServer01 ncs = new NetCopyServer01();
ncs.talk();
}
}
class ServerThread extends Thread{
private Socket s;
private String fileName; //写入客户端数据的文件名
public ServerThread(Socket s,String fileName) {
super();
this.s = s;
this.fileName = fileName;
}
public void run() {
BufferedReader br = null;
RandomAccessFile out = null;
PrintStream ps = null;
try {
// 从客户端读取数据的流
br = new BufferedReader(new InputStreamReader(s
.getInputStream()));
out = new RandomAccessFile(fileName,"rw");
ps = new PrintStream(s.getOutputStream()); // 向客户端输入数据的流
ps.println("欢迎你,请输入数据···");
out.seek(new File(fileName).length());
String temp = null;
while ((temp = br.readLine())!=null ){
if( "quit".equalsIgnoreCase(temp)){
ps.println("与服务器断开链接,你输入的数据已保存在服务器上的"+fileName+"文件中");
break;
}
out.writeUTF(temp);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
br.close();
out.close();
ps.close();
System.out.println(s.getInetAddress()+"退出!");
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
客户端:
客户端用到的测试服务器只需改下上面的run()方法中部分代码如下:
这里其实可以写到一起,也就是双向通信,可以参考我的另一篇双向聊天的文章。
try {
// 从控制台读取数据的流
br = new BufferedReader(new InputStreamReader(System.in);
ps = new PrintStream(s.getOutputStream()); // 向客户端输入数据的流
ps.println("欢迎你,服务器正在输入数据···");
String temp = null;
while ((temp = br.readLine())!=null ){
if( "quit".equalsIgnoreCase(temp)){
ps.println("服务器数据输入完成!!!");
break;
}
out.writeUTF(temp);
}
客户端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.RandomAccessFile;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @author $KangMiao$
* 1、写个客户端可以接受服务器的数据,并可以把服务器的输入的数据,保存在电脑上,
* 并以 “name-yyyy-MMM-dd.txt”格式命名。其中 name为客户端的主机名字,后面的为时间格式。
*/
public class NetCopyClient01 {
private String file = "e:/peixun/test/client/";
public void getFile() {
Socket s = null;
BufferedReader br = null;
PrintStream ps = null; //网络输出流
RandomAccessFile out = null;
try {
s = new Socket("localhost",8888);
System.out.println("已连接服务器,正在读取数据···");
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
//获得服务器的主机名(s.getInetAddress()方法是活的服务器IP地址)
String fileName = s.getInetAddress().getHostName();
//拼接成保存服务器数据的文件名
fileName = file+fileName + "-" + df.format(new Date()) + ".txt";
out = new RandomAccessFile(fileName,"rw");
String temp = "";
while ((temp = br.readLine())!= null ) {
if (temp.equalsIgnoreCase("quit")) {
ps.println("与客户端断开链接,你输入的数据已保存在客户端的"+fileName+"文件中!");
System.out.println("服务端与你断开连接!");
break;
}
out.writeUTF(temp);
System.out.println("服务端:" +temp);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
br.close();
out.close();
ps.close();
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
NetCopyClient01 ftp = new NetCopyClient01();
ftp.getFile();
}
}