【Socket网络通信】写一个服务器(客户端)可以接收客户端(服务器)的数据,并可以把数据保存在“name-yyyy-MMM-dd.txt”的文件中...

服务器:

 

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();
	}
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值