Tcp是网络编程中使用最多的一种,因为他可靠也能传输数据量大的文件。
下面是两个小案例,第一个是客户端给服务端发送要下载的图片路径,客户端在收到后完成下载。
package Tcp编程图片;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
/**
* @author庞慧斌最牛逼~~ version 2.0
*/
public class Client {
public static void main(String[] args) throws IOException {
//客户端给8888端口发送消息
Socket socket = new Socket(InetAddress.getLocalHost(),8888);
String path = "d:\\2.jpg";
//创建BufferedInputStream对象获取图片信息
BufferedInputStream bufferedInputStream = new BufferedInputStream(new
FileInputStream(path));
//将图片信息转成字节数组
byte b[] = stremToByte.convertInputStreamToByteArray(bufferedInputStream);
//通过socket获取输出流将文件信息写入
OutputStream outputStream1 = socket.getOutputStream();
BufferedOutputStream bufferedOutputStream = new
BufferedOutputStream(outputStream1);
bufferedOutputStream.write(b);
//关闭资源
bufferedInputStream.close();
bufferedOutputStream.close();
bufferedInputStream.close();
outputStream1.close();
socket.close();
}
}
package Tcp编程图片;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author庞慧斌最牛逼~~ version 2.0
*/
public class Sever {
public static void main(String[] args) throws IOException {
//服务端在8888端口监听
ServerSocket serverSocket = new ServerSocket(8888);
//服务端等待连接
Socket accept = serverSocket.accept();
System.out.println("等待连接");
//选择需要下载的路径
String path = "src\\ptoto";
//通过socket.getInputStrem 获取客户端发送的文件信息
InputStream inputStream = accept.getInputStream();
BufferedInputStream bufferedInputStream = new
BufferedInputStream(accept.getInputStream());
//通过工具类将其转换成字节数组
byte[] bytes = stremToByte.convertInputStreamToByteArray(bufferedInputStream);
//创建 BufferedOutputStream对象将文件写入选则好的路径
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new
FileOutputStream(path));
bufferedOutputStream.write(bytes);
//关闭资源
bufferedInputStream.close();
inputStream.close();
bufferedOutputStream.close();
serverSocket.close();
accept.close() ;
}
}
//这是自己写的工具类,可以将输入流转换成字节数组
package Tcp编程图片;
import java.io.*;
/**
* @author庞慧斌最牛逼~~ version 2.0
*/
public class stremToByte {
public static byte[] convertInputStreamToByteArray(InputStream inputStream) throws IOException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int n;
while ((n = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, n);
}
return outputStream.toByteArray();
}
//将输入流转成字符串
public static String convertToString(InputStream inputStream) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder stringBuilder = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
stringBuilder.append(line);
}
return stringBuilder.toString();
}
}
第二个相对复杂一点,客户端发送一个想要下载的文件给服务端,服务端接收后开始查找,如果有就返回,否则返回默认文件,客户端收到返回后开始下载到本地。
package tcp作业2;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;
/**
* @author庞慧斌最牛逼~~ version 2.0
*/
public class client {
public static void main(String[] args) throws IOException {
//与服务端连接
Socket socket = new Socket(InetAddress.getLocalHost(),9999);
//从键盘获取用户想下载的文件
Scanner scanner = new Scanner(System.in);
String next = scanner.next();
//将其发送给服务端
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
bufferedWriter.write(next);
bufferedWriter.flush();
socket.shutdownOutput();
//读取服务端传回的文件信息
BufferedInputStream bufferedInputStream = new BufferedInputStream(socket.getInputStream());
byte[] bytes = stremToByte.convertInputStreamToByteArray(bufferedInputStream);
//创建路径,将其下载
String path = "e:\\"+next+".mp3";
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(path));
bufferedOutputStream.write(bytes);
bufferedOutputStream.close();
bufferedInputStream.close();
socket.close();
bufferedWriter.close();
}
}
package tcp作业2;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.SQLOutput;
/**
* @author庞慧斌最牛逼~~ version 2.0
*/
public class sever {
public static void main(String[] args) throws IOException {
//服务端在9999端口监听,准备接收客户端的消息
ServerSocket serverSocket = new ServerSocket(9999);
//等待连接
Socket socket = serverSocket.accept();
//创建 BufferedInputStream对象 接受客户端的消息
InputStream inputStream = socket.getInputStream();
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
byte[] bytes = new byte[1024];
int rend = 0;
String download = "";
while ((rend = bufferedInputStream.read(bytes))!=-1){
download+= new String(bytes,0,rend);
}
System.out.println("客户端希望下载的文件是" + download);
//开始查找有无对应的文件
String resload = "";
if("1".equals(download)){
resload = "src\\1.mp3";
} else {
resload = "src\\2.mp3";
}
//将找到的文件进行返回
BufferedInputStream bufferedInputStream1 = new BufferedInputStream(new FileInputStream(resload));
byte[] bytes1 = stremToByte.convertInputStreamToByteArray(bufferedInputStream1);
//发送给客户端
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(socket.getOutputStream());
bufferedOutputStream.write(bytes1);
bufferedOutputStream.flush();
socket.shutdownOutput();
}
}
package tcp作业2;
import java.io.*;
/**
* @author庞慧斌最牛逼~~ version 2.0
*/
public class stremToByte {
public static byte[] convertInputStreamToByteArray(InputStream inputStream) throws IOException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int n;
while ((n = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, n);
}
return outputStream.toByteArray();
}
public static String convertToString(InputStream inputStream) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder stringBuilder = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
stringBuilder.append(line);
}
return stringBuilder.toString();
}
}