java 原生socket 服务器端和客户端之间的通信 ,做通信100次、1000次的时间

版权声明:如果觉得好的话,不防点个赞,那点你们认为不对或是需要补充,可以留言啊!本人原创,未经允许不得转载!! https://blog.csdn.net/qq_28289405/article/details/82868568

服务器端

package com.socket2;

import java.io.BufferedReader;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author Administrator 先启动 Server 端,进入一个死循环以便一直监听某端口是否有连接请求。然后运行 Client
 *         端,客户端发出连接请求, 服务端监听到这次请求后向客户端发回接受消息,连接建立,启动一个线程去处理这次请求,然后继续死循环监听其他请求。
 *         客户端输入字符串后按回车键,向服务器发送数据。服务器读取数据后回复客户端数据。这次请求处理完毕,启动的线程消亡。 如果客户端接收到
 *         "OK" 之外的返回数据,会再次发送连接请求并发送数据,服务器会为这次连接再次启动一个线程来进行响应。。。
 *         直到当客户端接收到的返回数据为"OK" 时,客户端退出。
 * 
 */
public class Server {

	// 监听的端口号
	public static final int PORT = 12345;

	public static void main(String[] args) {
		System.out.println("服务器启动...\n");
		Server server = new Server();
		// 调用init 函数
		server.init();
	}

	public void init() {

		try {
			// 端口号
			ServerSocket serverSocket = new ServerSocket(PORT);
			while (true) {
				// 一旦有堵塞, 则表示服务器与客户端获得了连接
				Socket client = serverSocket.accept();
				// 处理这次连接
				new HandlerThread(client);
			}
		} catch (Exception e) {
			System.out.println("服务器异常: " + e.getMessage());
		}
	}

	private class HandlerThread implements Runnable {
		private Socket socket;

		public HandlerThread(Socket client) {
			socket = client;
			new Thread(this).start();
		}

		public void run() {

			try {
				// 读取客户端数据
				DataInputStream input = new DataInputStream(
						socket.getInputStream());
				String clientInputStr = input.readUTF(); // 这里要注意和客户端输出流的写方法对应,否则会抛异常
				// 处理客户端数据
				System.out.println("客户端发过来的内容:" + clientInputStr);
				// 向客户端回复信息
				DataOutputStream out = new DataOutputStream(
						socket.getOutputStream());
				System.out.print("请输入:\t");
				// 发送键盘输入的一行
				String s = new BufferedReader(new InputStreamReader(System.in))
						.readLine();
				out.writeUTF(s);
				out.close();
				input.close();
			} catch (Exception e) {
				System.out.println("服务器 run 异常: " + e.getMessage());
			} finally {
				if (socket != null) {
					try {
						socket.close();
					} catch (Exception e) {
						socket = null;
						System.out.println("服务端 finally 异常:" + e.getMessage());
					}
				}
			}
		}
	}
}

客户端

package com.socket2;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class Client {

	// 服务器的地址和端口号
	public static final String IP_ADDR = "localhost";
	public static final int PORT = 12345;

	public static void main(String[] args) {
		
		//项目开始执行时间
		long start = System.currentTimeMillis();

		//循环100次 
		
		for (int i = 0; i < 100; i++) {
			System.out.println("客户端启动。。。。");
			System.out.println("当接受到服务器端字符为\"OK\" 的时候, 客户端将终止\n");

			while (true) {
				Socket socket = null;
				
				/*
				 * try { //执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。否则不会执行catch里面的内容 } 
				 * catch { //除非try里面执行代码发生了异常,否则这里的代码不会执行 } 
				 * finally { //不管什么情况都会执行,包括try catch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally } 
				 */
				try {

					// 创建一个流套接字并将其连接到指定主机上的指定端口号
					socket = new Socket(IP_ADDR, PORT);

					// 读取服务器端数据
					DataInputStream inputStream = new DataInputStream(
							socket.getInputStream());
					// 向服务器发送数据
					DataOutputStream outputStream = new DataOutputStream(
							socket.getOutputStream());
					System.out.println("请输入:\t");
					
					//System.in 接受从控制台输入的字节
					//new InputStreamReader(System.in);构造一个InputStreamReader对象
					//构造一个字符流的缓存,里面存放在控制台输入的字节转换后成的字符。
					//readLine():读取一个文本行 ,参考:https://blog.csdn.net/sinat_31057219/article/details/78742653
					String string = new BufferedReader(new InputStreamReader(
							System.in)).readLine();
					//writeUTF()写出一个UTF-8编码的字符串前面会加上2个字节的长度标识,已标识接下来的多少个字节是属于本次方法所写入的字节数。
					outputStream.writeUTF(string);

					String ret = inputStream.readUTF();
					System.out.println("服务器端返回来的是:" + ret);

					// 如接受到 “OK” 则断开连接
					if ("ok".equals(ret)) {
						System.out.println("客户端将关闭连接");
						//线程睡眠500ms
						Thread.sleep(500);
						//结束整个循环体
						break;
					}

					//关闭流
					outputStream.close();
					inputStream.close();

				} catch (Exception e) {
					System.out.println("客户端异常:" + e.getMessage());
				} finally {
					//判断不等于null
					if (null != socket) {
						//异常处理
						try {
							socket.close();
						} catch (IOException e) {
							socket = null;
							System.out.println("客户端 finally 异常:"+ e.getMessage());
						}
					}
				}
			}
		}
		
		//项目运行结束时间
		long end = System.currentTimeMillis();
		
		System.out.println("项目总体输出时间:" + (end - start) + "ms");
	}
}

参考:一个 Java 的 Socket 服务器和客户端通信的例子

猜你喜欢

转载自blog.csdn.net/qq_28289405/article/details/82868568