Java 网络编程 02 TCP编程 & 文件上传

1 TCP程序

1)服务端:先启动

package com.lihaogn.inet;

import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 1 创建服务器 ServerSocker 对象
 * 2 开启服务器,等待客户端连接
 * 3 给客户端反馈信息
 * 4 关闭资源
 * 
 * @author Mac
 *
 */
public class TCPServer {

	public static void main(String[] args) throws IOException {

		// 1 创建服务器 ServerSocker 对象
		ServerSocket serverSocket=new ServerSocket(12345);
		// 2 开启服务器,等待客户端连接
		Socket socket=serverSocket.accept();
		// 3 给客户端反馈信息
		OutputStream outputStream=socket.getOutputStream();
		outputStream.write("连接服务器成功!".getBytes());
		// 4 关闭资源
		outputStream.close();
		socket.close();
//		serverSocket.close(); // 服务器流通常是不关闭的	
	}
}

2)客户端:后启动

package com.lihaogn.inet;

import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.Socket;

/**
 * 1 创建客户端对象 Socket 
 * 2 获取服务器端反馈的信息 
 * 3 关闭资源
 * 
 * @author Mac
 *
 */

public class TCPClient {

	public static void main(String[] args) throws IOException {

		// 1 创建客户端对象 Socket
		Socket socket = new Socket(InetAddress.getLocalHost().getHostAddress(), 12345);
		// 2 获取服务器端反馈的信息
		InputStream inputStream = socket.getInputStream();
		byte[] buffer = new byte[1024];
		int length = inputStream.read(buffer);
		System.out.println(new String(buffer, 0, length));
		// 3 关闭资源
		inputStream.close();
		socket.close();
	}
}

2 文件上传

1)服务器端

package com.lihaogn.inet;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

/*
 * 文件上传 服务器端
 */

public class FileServer {

	public static void main(String[] args) throws IOException {

		// 1 创建服务器,等待客户端连接
		ServerSocket serverSocket = new ServerSocket(22222);
		Socket clientSocket = serverSocket.accept();
		// 2 获取连接客户端的IP地址对象
		InetAddress ipAddress = clientSocket.getInetAddress();
		String ipString = ipAddress.getHostAddress(); // 获取客户端的IP地址

		System.out.println("发现一个客户端! " + ipString);
		// 3 获取socket输入流,准备读取客户端数据
		InputStream inputStream = clientSocket.getInputStream();
		// 4 获取本地输出流,准备写入客户端传来的数据到本地
		BufferedOutputStream fileOut = new BufferedOutputStream(new FileOutputStream("/Users/Mac/mydata/upload.png"));

		byte[] buffer = new byte[1024];
		int len = -1;
		while ((len = inputStream.read(buffer)) != -1) {
			fileOut.write(buffer, 0, len);
		}
		// 5 发送反馈信息给客户端
		OutputStream outputStream = clientSocket.getOutputStream();
		outputStream.write("文件上传成功!".getBytes());
		// 6 关闭资源
		outputStream.close();
		fileOut.close();
		inputStream.close();
		clientSocket.close();

	}
}

2)客户端

package com.lihaogn.inet;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

/*
 * 文件上传 客户端
 */

public class FileClient {

	public static void main(String[] args) throws IOException{

		// 1 创建客户端socket对象,连接服务器
		Socket socket=new Socket(InetAddress.getLocalHost().getHostAddress(),22222);
		// 2 获取socket输出流,准备将数据传输到服务器
		OutputStream outputStream=socket.getOutputStream();
		// 3 获取本地输入流,读取要传输的文件
		BufferedInputStream fileIn=new BufferedInputStream(new FileInputStream("/Users/Mac/mydata/touxiang.png"));
		// 4 传输数据
		byte[] buffer=new byte[1024];
		int len=-1;
		while ((len=fileIn.read(buffer))!=-1) {
			outputStream.write(buffer,0,len);
		}
		// 5 关闭socket输出流,告知服务器数据传输完毕
		socket.shutdownOutput();
		
		// 6 反馈信息
		// 7 获取socket输入流
		InputStream inputStream=socket.getInputStream();
		// 8 读取数据
		byte[] info=new byte[1024];
		int length=inputStream.read(info);
		System.out.println(new String(info, 0, length));
		// 9 关闭资源
		inputStream.close();
		fileIn.close();
		outputStream.close();
		socket.close();
		
	}
}

3 文件上传多线程版本

只需要更改服务器端:

package com.lihaogn.inet;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

/*
 * 文件上传 服务器端 多线程 接收多个客户端连接
 */

public class FileServer {

	public static void main(String[] args) throws IOException {

		// 1 创建服务器,等待客户端连接
		ServerSocket serverSocket = new ServerSocket(22222);

		while (true) {

			final Socket clientSocket = serverSocket.accept();

			new Thread() {
				public void run() {
					try {
						// 2 获取连接客户端的IP地址对象
						InetAddress ipAddress = clientSocket.getInetAddress();
						String ipString = ipAddress.getHostAddress(); // 获取客户端的IP地址

						System.out.println("发现一个客户端! " + ipString);
						// 3 获取socket输入流,准备读取客户端数据
						InputStream inputStream = clientSocket.getInputStream();
						// 4 获取本地输出流,准备写入客户端传来的数据到本地
						BufferedOutputStream fileOut = new BufferedOutputStream(
								new FileOutputStream("/Users/Mac/mydata/upload.png"));

						byte[] buffer = new byte[1024];
						int len = -1;
						while ((len = inputStream.read(buffer)) != -1) {
							fileOut.write(buffer, 0, len);
						}
						// 5 发送反馈信息给客户端
						OutputStream outputStream = clientSocket.getOutputStream();
						outputStream.write("文件上传成功!".getBytes());
						// 6 关闭资源
						outputStream.close();
						fileOut.close();
						inputStream.close();
						clientSocket.close();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				};
			}.start();
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值