UDP + + multithreading bloqueo de cola

En primer lugar, el propósito del experimento

  1. El ejercicio de Java multi-hilo técnicas de programación.
  2. Ejercicio lograr servicios de red de tecnología de la programación concurrente.
  3. Aprender cómo implementar la sincronización multi-hilo entre sí y cooperan entre sí.
  4. Comprender lo que es seguro hilo.
    II. Los requisitos de diseño
  5. Descripción de las características: para la computación de red del programa servidor que soporta servicios concurrentes. El servidor es capaz de recibir simultáneamente desde el
    operador de una solicitud a la pluralidad de clientes y realiza el cálculo real de acuerdo con el tipo de operación y el parámetro de petición, el resultado del cálculo finalmente regresa
    de vuelta al cliente.
  6. Los requisitos específicos:
    (1) de soporte al menos la suma, resta, multiplicación y división cuatro operaciones aritméticas fundamentales.
    (2) el servidor puede registrar el número de diferentes tipos de solicitud de operación ha sido procesado con éxito, respectivamente.
    (2) entre los protocolos de comunicaciones cliente y servidor basados en UDP.
    (3) de protocolo de capa de aplicación diseñado. Por ejemplo, paquete de solicitud, un paquete de respuesta puede tener el siguiente formato:
    Aquí Insertar imagen Descripción
    (4) el programa servidor debe estar configurado como sigue:
    Aquí Insertar imagen Descripción
    el servidor:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.LinkedList;
import java.util.Scanner;
import java.util.concurrent.LinkedBlockingQueue;
import java.net.*;
import java.io.*;

public class Server2{
	public static void main(String args[]) throws InterruptedException{
		DatagramSocket aSocket = null;
		int serverPort = 6789;
		LinkedBlockingQueue<DatagramPacket> lbq1 = new LinkedBlockingQueue<DatagramPacket>();
		LinkedBlockingQueue<DatagramPacket> lbq2 = new LinkedBlockingQueue<DatagramPacket>();
		try{
			aSocket = new DatagramSocket(serverPort);
			byte[] buffer = new byte[1000];
			new ServerThread(lbq1, lbq2).start();
			new ServerThread(lbq1, lbq2).start();
			while(true){
				DatagramPacket request = new DatagramPacket(buffer, buffer.length);
				aSocket.receive(request);				
				lbq1.put(request);	
				aSocket.send(lbq2.take());
				System.out.println("处理加法请求个数:"+ServerThread.getSum1());
				System.out.println("处理减法请求个数:"+ServerThread.getSum2());
				System.out.println("处理乘法请求个数:"+ServerThread.getSum3());
				System.out.println("处理除法请求个数:"+ServerThread.getSum4());
			}
		} catch (SocketException e){
			System.out.println("Socket: " + e.getMessage());
		} catch (IOException e) {
			System.out.println("IO: " + e.getMessage());
		} finally {
			if (aSocket != null) aSocket.close();
		}
	}
}

ServerThread implementación de la clase:

import java.net.DatagramPacket;
import java.util.concurrent.LinkedBlockingQueue;

public class ServerThread extends Thread{
	LinkedBlockingQueue<DatagramPacket> lbq1 = new LinkedBlockingQueue<DatagramPacket>();
	LinkedBlockingQueue<DatagramPacket> lbq2 = new LinkedBlockingQueue<DatagramPacket>();
	DatagramPacket request  = null;
    static int sum1=0,sum2=0,sum3=0,sum4=0;
	public ServerThread(LinkedBlockingQueue<DatagramPacket> lbq1, LinkedBlockingQueue<DatagramPacket> lbq2) {
		super();
		this.lbq1 = lbq1;
		this.lbq2 = lbq2;
	}
	
	public void run() {
		while (true) {
			try {
				request = lbq1.take();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			Integer sum = null;
			String string = new String(request.getData(), 0, request.getLength());
			String str[] = string.split(" ");
/*			for (int i = 0; i < str.length; i++) {
				System.out.println(str[1]);
			}*/
			if (str[1].equals("+")) {
				sum = Integer.parseInt(str[0]) + Integer.parseInt(str[2]);
				sum1++;
				}
			else if (str[1].equals("-")) {
				sum = Integer.parseInt(str[0]) - Integer.parseInt(str[2]);
				sum2++;
			}
			else if (str[1].equals("*")) {
				sum = Integer.parseInt(str[0]) * Integer.parseInt(str[2]);
				sum3++;
			}
			else if (str[1].equals("/")) {
				sum = Integer.parseInt(str[0]) / Integer.parseInt(str[2]);
				sum4++;
			}
			// System.out.println(sum);
			byte[] m = sum.toString().getBytes();

			DatagramPacket reply = new DatagramPacket(m, m.length, request.getAddress(), request.getPort());

			try {
				lbq2.put(reply);
			} catch (InterruptedException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
		}
	}

	public static int getSum1() {
		return sum1;
	}


	public static int getSum2() {
		return sum2;
	}


	public static int getSum3() {
		return sum3;
	}


	public static int getSum4() {
		return sum4;
	}



}

cliente:

import java.net.*;
import java.util.Scanner;
import java.io.*;

public class CLIENT{
public static void main(String args[]){
	// args give message contents and server hostname
    DatagramSocket aSocket = null;
	Scanner input = new Scanner(System.in);
	try {
		while(true) {
				aSocket = new DatagramSocket();
				//byte[] m = args[0].getBytes();
				String str = input.nextLine();
				byte[] m = str.getBytes();
				InetAddress aHost = InetAddress.getByName("127.0.0.1");
				int serverPort = 6789;
				DatagramPacket request = new DatagramPacket(m, m.length, aHost, serverPort);
				aSocket.send(request);
				byte[] buffer = new byte[1000];
				DatagramPacket reply = new DatagramPacket(buffer, buffer.length);
				aSocket.receive(reply);
				System.out.println(str+"= " + new String(reply.getData()));
		}	
	} catch (SocketException e){
		System.out.println("Socket: " + e.getMessage());
    } catch (IOException e){
		System.out.println("IO: " + e.getMessage());
    } finally { 
	    if(aSocket != null) aSocket.close();
	}
}
}
Publicó un artículo original · ganado elogios 1 · vistas 54

Supongo que te gusta

Origin blog.csdn.net/qq_41813878/article/details/104810170
Recomendado
Clasificación