javaSE (四十)网络编程(TCP传输、服务器多线程、网络编程练习:反转字符串、上传文件)

在这里插入图片描述

1、TCP传输:

1.客户端

  1. 创建Socket链接服务端(指定ip地址,端口号),通过ip地址找到对应的服务器
  2. 调用Socket的getInputStream和getOutputStream方法获取和服务器端相连的IO流

2.服务器端

  1. 创建ServerSocket(指定端口号)
  2. 调用ServerSocket的accept方法接收一个客户端请求,得到一个Socket
  3. 调用Socket的getInputStream和getOutputStream方法获取和客户器端相连的IO流

注:这里按照上面的步骤就可以通信了,然后我们用bufferedReader和printStream包装一下getInputStream和getOutputStream(具体如图所示,应该很简洁明了)
在这里插入图片描述

测试代码如下(要先开服务端):

Tcp_client


package SocketCollection;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class Tcp_client  {
	public static void main(String[] args) throws UnknownHostException, IOException {
		
		
		Socket  socket = new Socket("127.0.0.1",12345);
		
		BufferedReader bre = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
		PrintStream ps = new PrintStream(socket.getOutputStream());
		
		ps.println("我是小雨,我爱你,你爱我么?");
		
		System.out.println(bre.readLine());
		
	    socket.close;
	}
	

}

Tcp_server


package SocketCollection;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Tcp_server {

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

		ServerSocket server = new ServerSocket(12345);
		Socket socket = server.accept();
		BufferedReader bre = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
		PrintStream ps = new PrintStream(socket.getOutputStream());
		
		System.out.println(bre.readLine());
		
		ps.println("我是阿伦,我也爱你!");

		socket.close;
	}

}

效果如图:

在这里插入图片描述

2、服务器多线程:

简单地将服务器端改为多线程,应对更多的请求

思路:

  1. while循环
  2. 匿名内部类,来一个请求就开一个线程

修改服务端代码如下:

Tcp_server

package SocketCollection;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Tcp_server {

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

		ServerSocket server = new ServerSocket(12345);

		while (true) {
			final Socket socket = server.accept();

			new Thread() {
				public void run() {
					try {
						BufferedReader bre = new BufferedReader(new InputStreamReader(socket.getInputStream()));
						PrintStream ps = new PrintStream(socket.getOutputStream());

						System.out.println(bre.readLine());

						ps.println("我是阿伦,我也爱你!");
					} catch (IOException e) {

						e.printStackTrace();
					}
				}
			}.start();

		}

	}

}

3、网络编程练习:

练习1:客户端键入字符串,服务器端反转传回,客户端接收反转后的字符串

思路:

  1. 反转嘛,就想到了StringBuilde.reverse()
  2. 然后客户端传过来用SB接收反转一下再传回去就行了

代码如下:

Tcp_client

Scanner sc = new Scanner(System.in);
System.out.println("请输入要反转的字符串:");
String line = sc.nextLine();

Tcp_server

String line = bre.readLine();
StringBuilder sb = new StringBuilder(bre.readLine());
ps.println(sb.reverse().toString());

效果如图:
在这里插入图片描述

练习二:上传文件

思路:

  1. 客户端键入字符串,验证是否为文件名
  2. 客户端发送文件名到服务器端
  3. 服务器创建文件夹存放此文件(可选),验证服务器端是否有此文件并返回验证结果
  4. 客户端接收结果,若存在,程序停止,若不存在,上传文件(IO流FileInputStream /FileOutputStream)
  5. 服务器端接收文件(传的是文件的byte[]流),并写入(在自己电脑上实验可以写到本地,也就是当前工程目录下)
    (和之前的IO流不同的是,这里需要经过socket.getOutputStream()和socket.getInputStream()的处理

代码如下:

Tcp_client

package SocketCollection;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Tcp_client {
	public static void main(String[] args) throws UnknownHostException, IOException {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入要上传的文件名:");

		while (true) {
			String line = sc.nextLine();

			File file = new File(line);
			// 1、验证是否存在并且为文件夹

			if (!file.exists()) {
				System.out.println("路径不存在");
			} else if (file.isDirectory()) {
				System.out.println("是文件夹路径,请输入文件路径");
			} else {

				// 2、发送文件名到客户端
				Socket socket = new Socket("127.0.0.1", 12345);

				BufferedReader bre = new BufferedReader(new InputStreamReader(socket.getInputStream()));
				PrintStream ps = new PrintStream(socket.getOutputStream());

				ps.println(file.getName());// 是文件名,不是tostring,这是将文件路径变成字符串

				// 3、接受结果,如果存在给与提示,程序直接退出,如果不存在,上传

				String result = bre.readLine();

				if (result.equals("文件存在")) {
					System.out.println("您上传的文件已经存在,请不要重复上传!");
					socket.close();
					return; // 特别注意:返回值为void的方法,从某个判断中跳出,必须用return;
				} else if (result.equals("文件不存在")) { // 这个地方可以直接不用写,为了好看就写上了
					FileInputStream fin = new FileInputStream(file);

					byte[] arr = new byte[1024 * 8];
					int len;
					while ((len = fin.read(arr)) != -1) {
						ps.write(arr, 0, len);
					}

					fin.close();
					socket.close();

				}
			}
		}
		// System.out.println(bre.readLine());

	}

}

Tcp_server

package SocketCollection;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

import cn.njupt.file;

public class Tcp_server {

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

		ServerSocket server = new ServerSocket(12345);

		while (true) {
			final Socket socket = server.accept();

			new Thread() {
				public void run() {
					try {
						InputStream is = socket.getInputStream();
						BufferedReader bre = new BufferedReader(new InputStreamReader(is));
						PrintStream ps = new PrintStream(socket.getOutputStream());

						String line = bre.readLine();
						File dir = new File("update"); // 创建文件夹存放这个文件,我觉得是可选的
						dir.mkdir();

						File file = new File(dir, line);
						if (file.exists()) {
							ps.println("文件存在");
							socket.close(); // 关闭
							return;
						} else {
							ps.println("文件不存在");
						}

						FileOutputStream fout = new FileOutputStream(file);

						byte[] arr = new byte[1024 * 8];
						int len;
						while ((len = is.read(arr)) != -1) {
							fout.write(arr, 0, len);
						}
						fout.close();
						socket.close();

					} catch (IOException e) {

						e.printStackTrace();
					}
				}
			}.start();

		}

	}

}

猜你喜欢

转载自blog.csdn.net/weixin_39782583/article/details/85007169
今日推荐