まず、実験の目的
- 運動のJavaマルチスレッドプログラミング技術。
- 運動は並行プログラミング技術のネットワークサービスを実現します。
- お互いにマルチスレッドの同期を実装し、互いに協力する方法を学びます。
- スレッドセーフであるかを理解。
II。設計要件 - 概要特長:同時サービスをサポートしているサーバプログラムを計算ネットワークのため。サーバが同時にから受信することができる
複数のクライアントにオペレータ要求を、操作タイプと要求パラメータに応じて実際の演算を行い、演算結果が、最終的に返す
クライアントへ。 - 特定の要件:
(1)支持体の少なくとも加算、減算、乗算、除算4つの基本的な算術演算。
(2)サーバは、それぞれ、正常に処理された動作要求の異なる種類の数を記録することができます。
UDPに基づいて、クライアントとサーバの通信プロトコルの間(2)。
(3)アプリケーション層プロトコルを設計しました。次のように例えば要求パケット、応答パケットをフォーマットすることができる:
次のように(4)サーバプログラムを設定する必要があります
サーバー。
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クラスの実装:
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;
}
}
クライアント:
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();
}
}
}