用Tcp/ip构建一个服务器和客户端,并用多线程和I/o数据流实现文件从多个客户端到服务器的传输

1.客户端和服务器利用Tcp构建,实现两台计算机之间的通信,通信的两端都需要创建socket对象。

    服务器:

    //创建端口(创建接收端对象)

    ServerSocket serverSocket =  new ServerSocket(8888);

   //监听

   Socket socket =  serverSocket.accept();

   客户端:

    //创建发送端Socket对象(创建连接)

   Socket socket =  new Socket("172.0.0.1", 8888);

 2. 客户端连接好服务器后,下面就开始从本地用BufferedInputStream输入流读文件,然后用DataOutputStream写文件,利用scoket传输到服务器端。

        DataOutputStream dataOutputStream = null;
        BufferedInputStream bufferedInputStream = null;
        Socket socket = null;
        //文件路径
        File file = new File("D:\\凯文-杜兰特 绝杀.mp4");
        //接收文件名称
        String name = file.getName();    
        try {
            //创建连接
            socket = new Socket("192.168.90.149", 9999);
            //写文件,并用scoket传输到服务器端
            dataOutputStream = new DataOutputStream(socket.getOutputStream());
            //从本地读文件
            bufferedInputStream = new BufferedInputStream(new FileInputStream(file));
            dataOutputStream.writeUTF(name);
            int len;
            //读的长度及以字节的形式来读写
            byte[] b = new byte[1024];
            while ((len=bufferedInputStream.read(b))!=-1) {
                //写文件
                dataOutputStream.write(b, 0, len);    
                //刷新
                dataOutputStream.flush();            
            }

3.服务器端用dataInputStream 接收客户端发来的文件,然后用bufferedOutputStream 写到本地。这样就ok了!

ServerSocket serverSocket = null;
        Socket socket = null;
        DataInputStream dataInputStream = null;
        BufferedOutputStream bufferedOutputStream = null;
        File file = new File("D:\\test");
        if(!file.exists()) {
            file.mkdirs();
        }
        try {
            //创建端口(创建接收端对象)
            serverSocket = new ServerSocket(9999);
            //监听对象
            socket = serverSocket.accept();
            //接收socket传输的文件
            dataInputStream = new DataInputStream(socket.getInputStream());
            //获得传输文件的名字
            String name = dataInputStream.readUTF();
            //拷贝后文件的名字
            File file2 = new File(file+File.separator+name);
            //把读进来的文件写到本地
            bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(file2));    
            int len;
            byte[] b = new byte[1024];        
            while((len=dataInputStream.read(b))!=-1) {
                bufferedOutputStream.write(b, 0, len);
                bufferedOutputStream.flush();    
            }

4.源码

服务器:

package com.xin01;

import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
	public static void main(String[] args) {

		ServerSocket serverSocket = null;
		Socket socket = null;	
		try {
			//创建端口(创建接收端对象)
			serverSocket = new ServerSocket(6666);	
			//用while true 目的是为了让多个客户端连接
			while(true) {			
				//监听对象	
				socket = serverSocket.accept();	
				new ThreadDemo(socket).start();
			}		
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}finally {
			try {
				serverSocket.close();
				socket.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}			
		}
	}

}

客户端:

package com.xin01;

import java.io.BufferedInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {
	public static void main(String[] args) {
		DataOutputStream dataOutputStream = null;
		BufferedInputStream bufferedInputStream = null;
		Socket socket = null;
		//文件路径
		File file = new File("D:\\迅雷下载\\mysql-installer-community-5.7.23.0.msi");
		//接收文件名称
		String name = file.getName();	
		try {
			//创建连接
			socket = new Socket("192.168.90.111", 8888);
			System.out.println("连接成功");
			//写文件,并用scoket传输到服务器端
			dataOutputStream = new DataOutputStream(socket.getOutputStream());		
			//从本地读文件
			bufferedInputStream = new BufferedInputStream(new FileInputStream(file));
			//outThread outThread = new outThread(socket);
			//outThread.start();
			dataOutputStream.writeUTF(name);
			
			int len;
			//读的长度及以字节的形式来读写
			byte[] b = new byte[1024];
			while ((len=bufferedInputStream.read(b))!=-1) {
				//写文件
				dataOutputStream.write(b, 0, len);	
				//刷新
				dataOutputStream.flush();			
			}
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				//关闭
				dataOutputStream.close();
				bufferedInputStream.close();
				socket.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

服务器多线程:

package com.xin01;

import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.Socket;

public class ThreadDemo extends Thread{
	private Socket socket;
	public ThreadDemo(Socket socket) {
		super();
		this.socket = socket;
	}
		
	@Override
	public void run() {
		// TODO Auto-generated method stub
		super.run();	
		DataInputStream dataInputStream = null;
		BufferedOutputStream bufferedOutputStream = null;
		try {		
			//接收socket传输的文件
			dataInputStream = new DataInputStream(socket.getInputStream());
			//获得传输文件的名字
			String name = dataInputStream.readUTF();
			//拷贝后文件的名字
			File file = new File("D:\\test"+File.separator+socket.getInetAddress());
			if(!file.exists()) {
				file.mkdirs();
			}
			File file2 = new File(file+File.separator+name);
			//把读进来的文件写到本地
			bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(file2));
			System.out.println("文件名:"+name);
			System.out.println("ip地址:"+socket.getInetAddress());
			int len;
			byte[] b = new byte[1024];		
			while((len=dataInputStream.read(b))!=-1) {
				bufferedOutputStream.write(b, 0, len);
				bufferedOutputStream.flush();			
			}
			System.out.println("传输成功");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("端口错误!!!");
		}finally {
			try {		
				bufferedOutputStream.close();
				dataInputStream.close();
				socket.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
	}
}

 

你可能感兴趣的:(Java)