文章目录
前言
提示:学习完黑马网络编程后的练习,供复习使用
一、TCP通讯练习====多发多收
客户端代码实现:
public class Client {
public static void main(String[] args) throws IOException {
// 1.创建Socket对象,并连接服务器
Socket socket = new Socket("127.0.0.1", 20000);
// 2.写数据
Scanner scanner = new Scanner(System.in);
OutputStream os = socket.getOutputStream();
while (true) {
System.out.println("请输入你要发送的信息:");
String message = scanner.nextLine();
if ("886".equals(message)) {
break;
}
os.write(message.getBytes());
}
// 3.释放资源
socket.close();
}
}
服务端代码实现:
public class Server {
public static void main(String[] args) throws IOException {
// 1.创建Socket对象
ServerSocket serverSocket = new ServerSocket(20000);
// 2.监听客户端的连接
Socket socket = serverSocket.accept();
// 3.从连接通道中获取输入流读取数据
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
int len;
while ((len = br.read()) != -1) {
System.out.print((char) len);
}
// 4.释放资源
socket.close();
serverSocket.close();
}
}
二、TCP通讯练习====接收并反馈
客户端代码实现:
public class Client {
public static void main(String[] args) throws IOException {
// 1.创建Socket对象,并连接服务器
Socket socket = new Socket("127.0.0.1", 20000);
// 2.写数据
OutputStream os = socket.getOutputStream();
os.write("见到你很高兴".getBytes());
// 写一个结束标记
socket.shutdownOutput();
// 3.接收服务端返回的数据
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
int len;
while ((len = br.read()) != -1) {
System.out.print((char) len);
}
// 4.释放资源
socket.close();
}
}
服务端代码实现:
public class Server {
public static void main(String[] args) throws IOException {
// 1.创建Socket对象
ServerSocket serverSocket = new ServerSocket(20000);
// 2.监听客户端的连接
Socket socket = serverSocket.accept();
// 3.从连接通道中获取输入流读取数据
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
int len;
// 细节:read方法会从连接通道中读取数据,但是需要有一个结束标记,此处的循环才会停止,
// 否则,程序就会一直停在read方法这里,等待读取下面的数据。
while ((len = br.read()) != -1) {
System.out.print((char) len);
}
// 4.向客户端写数据
OutputStream outputStream = socket.getOutputStream();
outputStream.write("到底有多开心".getBytes());
// 5.释放资源
socket.close();
serverSocket.close();
}
}
三、TCP通讯练习====上传文件
客户端代码实现:
public class Client {
public static void main(String[] args) throws IOException {
// 1.创建Socket对象,并连接服务器
Socket socket = new Socket("127.0.0.1", 20000);
// 2.读取本地文件中的数据并写道服务器中
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\idea_workspace\\demo\\juc-demo\\阿里巴巴Java开发手册.pdf"));
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
byte[] bytes = new byte[1024];
int len;
while ((len = bis.read(bytes)) != -1) {
bos.write(bytes, 0, len);
}
// 写一个结束标记
socket.shutdownOutput();
// 3.接收服务端返回的数据
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String result = br.readLine();
System.out.println(result);
// 4.释放资源
socket.close();
}
}
服务端代码实现:
public class Server {
public static void main(String[] args) throws IOException {
// 1.创建Socket对象
ServerSocket serverSocket = new ServerSocket(20000);
// 2.监听客户端的连接
Socket socket = serverSocket.accept();
// 3.读取数据并保存到本地文件中
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\阿里巴巴Java开发手册.pdf"));
byte[] bytes = new byte[1024];
int len;
while ((len = bis.read(bytes)) != -1) {
bos.write(bytes, 0, len);
}
// 4.回写数据
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
bw.write("上传成功!");
bw.newLine();
bw.flush();
// 5.释放资源
socket.close();
serverSocket.close();
}
}
三、TCP通讯练习====上传文件(多线程版)
客户端代码实现:
public class Client {
public static void main(String[] args) throws IOException {
// 1.创建Socket对象,并连接服务器
Socket socket = new Socket("127.0.0.1", 20000);
// 2.读取本地文件中的数据并写道服务器中
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("juc-demo/阿里巴巴Java开发手册.pdf"));
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
byte[] bytes = new byte[1024];
int len;
while ((len = bis.read(bytes)) != -1) {
bos.write(bytes, 0, len);
}
// 写一个结束标记
socket.shutdownOutput();
// 3.接收服务端返回的数据
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String result = br.readLine();
System.out.println(result);
// 4.释放资源
socket.close();
}
}
线程类代码实现:
public class MyRunnable implements Runnable {
private Socket socket;
public MyRunnable(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
// 3.读取数据并保存到本地文件中
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
String name = UUID.randomUUID().toString().replace("-", "");
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\" + name + ".pdf"));
byte[] bytes = new byte[1024];
int len;
while ((len = bis.read(bytes)) != -1) {
bos.write(bytes, 0, len);
}
// 4.回写数据
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
bw.write("上传成功!");
bw.newLine();
bw.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (socket != null) {
// 5.释放资源
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
服务端代码实现:
public class Server {
public static void main(String[] args) throws IOException {
// 1.创建Socket对象
ServerSocket serverSocket = new ServerSocket(20000);
while (true) {
// 2.等待客户端来连接
Socket socket = serverSocket.accept();
// 开启一条线程
// 一个用户就对应服务端的一条线程
MyRunnable myRunnable = new MyRunnable(socket);
new Thread(myRunnable).start();
}
}
}
四、TCP通讯练习====上传文件(线程池优化)
频繁创建线程并销毁非常浪费系统资源,所以需要用线程池优化
只需修改上面的服务端代码
服务端代码实现:
public class Server {
public static void main(String[] args) throws IOException {
// 创建线程池对象
ThreadPoolExecutor pool = new ThreadPoolExecutor(
3,// 核心线程数量
16,// 线程池总大小
60,// 空闲时间
TimeUnit.SECONDS,// 空闲时间(单位)
new ArrayBlockingQueue<>(2),// 队列
Executors.defaultThreadFactory(),// 线程工厂
new ThreadPoolExecutor.AbortPolicy()// 阻塞队列
);
// 1.创建Socket对象
ServerSocket serverSocket = new ServerSocket(20000);
while (true) {
// 2.等待客户端来连接
Socket socket = serverSocket.accept();
// 开启一条线程
// 一个用户就对应服务端的一条线程
pool.submit(new MyRunnable(socket));
}
}
}