`
miaoge
  • 浏览: 109313 次
  • 性别: Icon_minigender_1
  • 来自: 嘉兴
社区版块
存档分类

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

 

分享到:
评论

相关推荐

    android基于WiFi的socket客户端和服务器端

    在Java中,Socket类代表一个网络连接,包括一个IP地址和一个端口号,可以用来建立客户端与服务器端的连接。 3. **服务器端(SocketServer)**:服务器端程序首先启动,监听特定端口等待客户端的连接请求。当客户端...

    Android开发,Socket Client端和Socket Server端数据发送和接收

    在Android开发中,Socket通信是实现设备间网络通信的一种常见方式。Socket分为客户端(Socket Client)和服务器端(Socket Server),它们共同构成了基于TCP/IP协议的通信模型。本篇文章将详细探讨Android环境下如何...

    Socket发送并接收服务器返回的数据

    在Android开发中,Socket通信是实现设备间网络通信的重要手段,尤其在移动应用与服务器进行实时数据交换时不可或缺。本文将深入探讨如何在Android平台上利用Socket进行数据的发送与接收,以及服务器返回数据的处理。...

    Android客户端通过socket与服务器通信(删改版)

    1. **Socket基础**:Socket是网络编程中的一个重要概念,它是两台计算机之间建立连接的端点,可以理解为一个数据传输的通道。在Java中,Socket类提供了客户端与服务器端进行数据通信的能力。 2. **Android权限申请*...

    Android Socket编程客户端服务器端源码

    通过这两个流,客户端可以发送数据到服务器并接收服务器返回的数据。 3. 数据交互:客户端通常会使用BufferedReader和PrintWriter进行数据的读写操作,例如: ```java BufferedReader in = new BufferedReader(new...

    Android实现的一对一聊天(socket),包括服务器和客户端,android studio2.3开发

    服务器端主要负责接收客户端发送的消息并广播给其他在线的客户端,或者将接收到的消息存储起来供后续查询。 3. **客户端实现**: 客户端应用(SimpleChat)需要连接到服务器,并保持连接状态以便进行实时通信。在...

    Android客户端通过socket与服务器通信

    在Android应用开发中,通过Socket实现客户端与服务器的通信是一项基本技能。Socket是TCP/IP协议族的一部分,允许两台计算机通过网络交换数据。在Android客户端,我们通常使用Java的网络和I/O库来创建和管理Socket...

    python利用socket上传文件的客户端和服务器代码

    在Python编程中,Socket是网络通信的基础模块,用于实现客户端与服务器之间的通信。在这个场景下,我们将探讨如何使用Python的socket库来实现文件的上传功能。这个过程涉及到两个主要部分:客户端(Client)和服务器...

    tcp(socket)通讯源代码,包括客户端,服务端

    综上所述,这个压缩包中的源代码应该是展示了如何使用TCP协议通过socket进行客户端和服务端之间的数据交换,开发者可以通过学习这段代码了解TCP通信的基本流程和方法,从而在自己的项目中实现网络通信功能。

    python socket 实现服务器与客户端多线程连接

    在Python编程中,Socket库是用于网络通信的基本工具,它允许程序作为服务器或客户端通过网络交换数据。在本文中,我们将深入探讨如何使用Python的socketserver模块实现服务器与多个客户端的多线程连接。 首先,我们...

    Android Wifi热点 数据传输Socket 通信

    在Android设备上,我们可以通过创建一个服务器Socket监听特定端口,然后用客户端Socket连接到这个服务器,从而实现数据的发送和接收。下面我们将深入探讨这一主题。 首先,我们需要了解Android的权限管理。在...

    Android socket tcp应用,包含服务器和客户端,代码正常通过测试,学习使用

    通过上述步骤,你可以构建一个基本的Android Socket TCP应用,无论是服务器端还是客户端,都能正常收发数据。在实际项目中,你可能需要考虑更多细节,如线程管理、心跳机制、数据编码解码等,以实现更稳定、功能更...

    C++解析json/socket通讯

    在客户端,你需要创建一个socket,连接到服务器,然后发送JSON数据,接收服务器的响应。这个过程与服务器端的接收和发送类似,只是角色互换。 总结,通过C++解析JSON数据,可以方便地处理网络通信中的数据交换。...

    多线程服务器、客户端程序

    本文将深入探讨如何使用Windows API,特别是VC++,来实现一个多线程的服务器和客户端系统,其中客户端能够接收用户按键并发送数据到服务器,而服务器则会进行相应的响应。这种通信模式被称为Client-Server(CS)模式...

    Android中基于Socket的网络通信-博客源码

    在Android开发中,网络通信是应用功能的重要组成部分,特别是在实现实时聊天、文件传输等功能时,Socket通信成为首选。本篇文章将深入探讨如何在Android中利用Socket进行基于TCP协议的网络通信,结合提供的...

    单线程Socket编程实现mysql数据读取

    在IT领域,Socket编程是一种基础且重要的网络通信技术,它允许两个程序通过网络进行数据交换。在这个场景中,我们关注的是如何使用单线程Socket编程来实现从MySQL数据库中读取数据。首先,我们需要理解Socket的基本...

    安卓socket链接服务器接收数据APP大学生作业

    在安卓平台上,Socket编程是一种常见的通信机制,常用于实现设备间的网络通信,比如在智能农业应用中接收服务器发送的传感器数据。在这个“安卓socket链接服务器接收数据APP大学生作业”中,我们可以深入探讨以下几...

    简易服务器和客户端

    2. **服务器端**:服务器端应用通常负责接收客户端的请求并作出响应。在这个项目中,服务器端通过创建一个Socket监听特定的端口号(需要用户自行设定)。当客户端尝试连接时,服务器端会接受连接,然后可以读取...

    Android socket 多用户通信

    在Android平台上进行网络通信时,Socket是一个至关重要的组件。Socket提供了进程间通信(IPC)的能力,使得设备可以与其他网络上的设备或服务器交换数据。在这个"Android Socket 多用户通信"的示例中,我们主要关注...

Global site tag (gtag.js) - Google Analytics