UDPServer, 异步返回。新建线程返回数据
package m; import java.io.*; import java.net.*; import java.util.ArrayList; public class UDPServer extends Thread { /** * */ private static int server_port = 9988; //private static final long serialVersionUID = 8362159773100396897L; private static DatagramSocket serverSocket; public static String name; //send method 2 public static void sendUDPPacket2(String info , InetAddress IP , int port) throws InterruptedException { byte[] sendData = new byte[4096]; sendData = info.getBytes(); try { DatagramPacket sendPacket = new DatagramPacket(sendData,sendData.length, IP, port); serverSocket.send(sendPacket); } catch (SocketException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //Receiver thread public void startReceiving() { Thread tReceiverthread = new Thread(new Runnable() { @Override public void run() { try { UDPReceiver(); } catch (Exception e) { // e.printStackTrace(); } } public void UDPReceiver() throws Exception { while(true) { byte[] receiveData1 = new byte[8192]; final DatagramPacket receivePacket1 = new DatagramPacket(receiveData1, receiveData1.length); try { serverSocket.receive(receivePacket1); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } new Thread() { @Override public void run() { // TODO Auto-generated method stub if (!Thread.currentThread().isInterrupted()) {// 如果没有终止 try { String receive_str = new String(receivePacket1.getData()); print("RECEIVE:"+receive_str+"\n"); //打印当前线程总数 print("ThreadCount:"+Thread.activeCount()+""); //send final InetAddress IPAddress =receivePacket1.getAddress(); final int port = receivePacket1.getPort(); // Thread.sleep(10000); // do something sendUDPPacket2("ssssssssss", IPAddress , port); Thread.currentThread().interrupt(); } catch (Exception e) { e.printStackTrace(); } finally { Thread.currentThread().interrupt();// 执行完终止 } } } }.start(); }//end of while loop }//end of receiver function });//end of runnable tReceiverthread.start(); System.out.println("Thread started"); }//end of startReceiver public static void print(String s){ System.out.println(s+"\n"); } public static void main(String[] args) throws Exception { // TODO Auto-generated method stub serverSocket = new DatagramSocket(server_port); System.out.println("Server has been started\n"); new UDPServer().startReceiving(); }//main }//class
UDPServer.java
package bidding; import java.io.*; import java.net.*; import java.util.ArrayList; public class UDPServer extends Thread { /** * */ //private static final long serialVersionUID = 8362159773100396897L; private static DatagramSocket serverSocket; public static boolean ACK = false; public static ArrayList<client> clientList = new ArrayList<client>(); public static ArrayList<offline_user> offline_List = new ArrayList<offline_user>(); public static ArrayList<Item> itemList = new ArrayList<Item>(); public static String name; /** * */ public static void sendACK(InetAddress IP,int port) { System.out.println("Sent ack"); byte[] data = new byte[4096]; data = "acknowledgement".getBytes(); DatagramPacket sendPacket = new DatagramPacket(data,data.length, IP, port); try { serverSocket.send(sendPacket); } catch (IOException e) { // TODO Auto-generated catch block //e.printStackTrace(); } } //Used to broadcast client information public static ArrayList<String> clientInfo() { ArrayList<String> info = new ArrayList<String>(); for(int i = 0; i < clientList.size() ; i++) { client c = clientList.get(i); String s = c.username+" "+c.cli_IP+" "+c.cli_port; info.add(s); } return info; } //send method public static void sendUDPPacket(String info , InetAddress IP , int port, String name) throws InterruptedException { System.out.println("Sending " + info); int i; for(i=0;i<clientList.size();i++) { client c =clientList.get(i); if(c.username.equalsIgnoreCase(name)) { break; } } if (i == clientList.size()) { info = "Offline message: "+info; offline_user o = new offline_user(name,info); offline_List.add(o); return; } byte[] sendData = new byte[4096]; sendData = info.getBytes(); int attempt_no = 0; //ACK =false; try { /*while ((!ACK && attempt_no < 5)) {*/ System.out.println("Sending : "+info); System.out.println(ACK); DatagramPacket sendPacket = new DatagramPacket(sendData,sendData.length, IP, port); serverSocket.send(sendPacket); /*Thread.sleep(500); if(!ACK) sendAttempt++; System.out.println("sendAttemptCount: " + attempt_no);*/ // } /*if(!ACK) addOfflineMessage(name,info); for(int i=0;i<clientList.size();i++) { client c = clientList.get(i); if(c.username.equals(name)) { clientList.remove(i); break; } }*/ } catch (SocketException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * @param args */ //FInds the name of the user from whom the packet has been received public static String getCurrentUser(InetAddress IP, int port) { client c = new client(); for(int i=0;i<clientList.size();i++) { c = clientList.get(i); } for(int i=0; i < clientList.size();i++) { c = clientList.get(i); if((c.cli_IP.toString().equals(IP.toString())) && (c.cli_port == port)) { return c.username; } } return "none"; } //add messagesfor offline users public static void addOfflineMessage(String username, String message) { System.out.println("Inside offline messages"); offline_user o = new offline_user(username,message); offline_List.add(o); for(int j = 0; j<offline_List.size();j++) { offline_user o1 = offline_List.get(j); System.out.println("Offline message " + username +" "+message); } } //Receiver thread public void startReceiving() { Thread tReceiverthread = new Thread(new Runnable() { @Override public void run() { try { UDPReceiver(); } catch (Exception e) { // e.printStackTrace(); } } public void UDPReceiver() throws Exception { int itemCount = 0; while(true) { boolean flag1 = false; String message; String reply; byte[] receiveData1 = new byte[8192]; DatagramPacket receivePacket1 = new DatagramPacket(receiveData1, receiveData1.length); try { serverSocket.receive(receivePacket1); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } InetAddress IPAddress =receivePacket1.getAddress(); int port = receivePacket1.getPort(); String command = new String(receivePacket1.getData()); String currentuser = getCurrentUser(IPAddress,port); System.out.println("The current user is"+currentuser); String[] split_command1 = new String[20]; split_command1 = command.split(" "); System.out.println("Printing the list of users"); for(int i=0; i<clientList.size();i++) { client c = clientList.get(i); System.out.println(c.username); } if(command.trim().equals("acknowledgement")) { System.out.println("Acknowledgement received"); ACK = true; } else if(split_command1[0].trim().equals("register")) { name = split_command1[1].trim(); System.out.println("Entered registered part"); System.out.println(clientList.isEmpty()); if(!clientList.isEmpty()) { for (int i=0; i <clientList.size(); i++) { client c = clientList.get(i); if(c.username.equalsIgnoreCase(name)) { clientList.remove(i); } } } client CL = new client(name,IPAddress,port); System.out.println("Adding user"); clientList.add(CL); sendACK(IPAddress,port); if(!offline_List.isEmpty()) { for(int i=0;i<offline_List.size();i++) { offline_user u = offline_List.get(i); System.out.println(u.name); System.out.println(u.message); } System.out.println("Entered offline messages list"); for (int i=0; i <offline_List.size(); i++) { offline_user u = offline_List.get(i); System.out.println(u.name); if(u.name.equalsIgnoreCase(name)) { sendUDPPacket(u.message,IPAddress,port,name); } } } sendUDPPacket("done",IPAddress,port,name); for(int i=0 ; i<clientList.size(); i++) { System.out.println("Entered broadcast"); client c = clientList.get(i); sendUDPPacket("broadcast",c.cli_IP,c.cli_port,c.username); ArrayList<String> client_info = new ArrayList<String>(); client_info = clientInfo(); System.out.println(client_info.toString()); sendUDPPacket(client_info.toString(),c.cli_IP, c.cli_port,c.username); sendUDPPacket("sent",c.cli_IP,c.cli_port,c.username); } //sendUDPPacket("updated",IPAddress,port,name); } else if(split_command1[0].trim().equals("sell")) { System.out.println("Entered the sell part"); String itemname = split_command1[1]; int trans_limit = Integer.parseInt(split_command1[2]); int start_bid = Integer.parseInt(split_command1[3]); System.out.println(start_bid); int buy_now = Integer.parseInt(split_command1[4]); String description = split_command1[5]; if((trans_limit > 0) && (start_bid >= 0) && (start_bid >0) ) { itemCount = itemCount + 1; Item item = new Item(itemCount,itemname,currentuser,trans_limit,start_bid,buy_now,description); itemList.add(item); reply = "["+itemname+" added with number "+item.item_code+"]"; } else { reply = "[ Error : arguments ]"; } sendUDPPacket(reply,IPAddress,port,name); } else if(split_command1[0].trim().equals("deregister")) { int index = -1; for(int i=0 ; i < clientList.size(); i++ ) { client c = clientList.get(i); if(c.username.equals(currentuser)) { System.out.println(i); index = i; } } clientList.remove(index); sendACK(IPAddress,port); for(int i=0 ; i<clientList.size(); i++) { System.out.println("Entered broadcast"); client c = clientList.get(i); sendUDPPacket("broadcast",c.cli_IP,c.cli_port,c.username); ArrayList<String> client_info = new ArrayList<String>(); client_info = clientInfo(); System.out.println(client_info.toString()); sendUDPPacket(client_info.toString(),c.cli_IP, c.cli_port,c.username); sendUDPPacket("sent",c.cli_IP,c.cli_port,c.username); } } else if(split_command1[0].trim().equals("info")) { System.out.println("Entered info"); if(split_command1.length > 1) { int i; for(i = 0; i < itemList.size();i++) { Item it = itemList.get(i); if(Integer.parseInt(split_command1[1].trim()) == it.item_code) { String response = it.get_info(); sendUDPPacket(response,IPAddress,port,currentuser); break; } } if ( i == itemList.size()) { String response = "[Error: "+Integer.parseInt(split_command1[1].trim())+" item not found]"; sendUDPPacket(response,IPAddress,port,currentuser); } } else { if(itemList.isEmpty()) { String response = "[Error : empty]"; sendUDPPacket(response,IPAddress,port,currentuser); } else { for(int i=0; i< itemList.size();i++) { Item I = itemList.get(i); String response = I.get_info(); System.out.println(response); sendUDPPacket(response,IPAddress,port,currentuser); } } sendUDPPacket("done",IPAddress,port,currentuser); } }//else if of info ends else if(split_command1[0].trim().equals("bid")) { System.out.println("Entered bid"); for(int i = 0; i < itemList.size(); i++) { Item it = itemList.get(i); if(Integer.parseInt(split_command1[1].trim()) == it.item_code) { if(currentuser.equals(it.owner)) { String response = "[ Error : owner ]"; sendUDPPacket(response,IPAddress,port,currentuser); flag1 = true; } else if(currentuser.equals(it.buyername)) { String response = "[ Error : duplicate bid ]"; sendUDPPacket(response,IPAddress,port,currentuser); flag1 = true; } else if(Integer.parseInt(split_command1[2].trim()) < 0) { String response = "[ Error : negative bid ]"; sendUDPPacket(response,IPAddress,port,currentuser); flag1 = true; } else { int amount = Integer.parseInt(split_command1[2].trim()); amount = amount + it.current_bid; it.set_current_bid(amount); it.set_buyername(currentuser); it.transaction_count++; if((it.transaction_count == it.translimit) || (it.current_bid >= it.buynow)) { int j; String response = "[ purchased :"+it.item_code+" "+it.name+" "+it.current_bid+" ]"; sendUDPPacket(response,IPAddress,port,currentuser); for(j = 0; j< clientList.size();j++) { client c = clientList.get(j); if(it.owner.equals(c.username)) { String response1 = "[ sold :"+it.item_code+" "+it.name+" "+it.current_bid+" ]"; sendUDPPacket(response1,c.cli_IP,c.cli_port,c.username); } } itemList.remove(i); flag1 = true; } else { String response = it.item_code+" "+it.name+" "+it.current_bid; sendUDPPacket(response,IPAddress,port,currentuser); flag1 = true; } } } } if(flag1 == false) { String response = "Item not found"; sendUDPPacket(response,IPAddress,port,currentuser); } }//else if for bid ends here else if(split_command1[0].trim().equals("direct")) { System.out.println("Entered direct"); String buyerName = split_command1[2].trim(); System.out.println(buyerName); InetAddress buyer_IP = null; int buyer_port = 0; int item_Code = Integer.parseInt(split_command1[1].trim()); System.out.println(item_Code); int j; for(j=0;j<clientList.size();j++) { client c = clientList.get(j); if(buyerName.equals(c.username)) { buyer_IP = c.cli_IP; buyer_port = c.cli_port; } } System.out.println("Reached till after the for loop"); //When the seller is offline if((buyer_IP.toString().equals(IPAddress.toString())) && (buyer_port == port)) { System.out.println("This is an offline buy"); int i; int code =0; String itemName=null; int buyNowPrice=0; String itemOwner =null; for(i=0;i<itemList.size();i++) { Item I = itemList.get(i); if(I.item_code == item_Code) { code = I.item_code; itemName=I.name; buyNowPrice=I.buynow; itemOwner = I.owner; break; } } if(i == itemList.size()) { message = "[Error: "+item_Code+" not found]"; sendUDPPacket(message,IPAddress,port,currentuser); } else { itemList.remove(i); message ="[purchased "+code+" "+itemName+" "+buyNowPrice+" ]"; System.out.println(message); sendUDPPacket(message,IPAddress,port,currentuser); System.out.println("Adding seller message to offline list"); message ="Offline message :[sold "+code+" "+itemName+" ]"; System.out.println("Adding the offline message"); addOfflineMessage(itemOwner,message); sendACK(IPAddress,port); } } //Normal operation when the seller is online else { int i; int code =0; String itemName=null; int buyNowPrice=0; for(i=0;i<itemList.size();i++) { Item I = itemList.get(i); if(I.item_code == item_Code) { code = I.item_code; itemName=I.name; buyNowPrice=I.buynow; break; } } if(i == itemList.size()) { message = "[Error: "+item_Code+" not found]"; sendUDPPacket(message,IPAddress,port,currentuser); } else { itemList.remove(i); message ="purchased "+code+" "+itemName+" "+buyNowPrice; System.out.println(message); sendUDPPacket(message,buyer_IP,buyer_port,buyerName); System.out.println("Sending to seller"); message ="sold "+code+" "+itemName; sendUDPPacket(message,IPAddress,port,currentuser); } } } }//end of while loop }//end of receiver function });//end of runnable tReceiverthread.start(); System.out.println("Thread started"); }//end of startReceiver public static void main(String[] args) throws Exception { // TODO Auto-generated method stub String[] split_commands = new String[3]; clientList.clear(); itemList.clear(); offline_List.clear(); BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System. in) ); boolean value = false; boolean flag = true; System.out.println("Please enter the command\n"); while(!value) { String command = inFromUser.readLine(); split_commands = command.split(" "); if(split_commands.length == 3) { if((Integer.parseInt(split_commands[2]) < 1024) || (Integer.parseInt(split_commands[2]) > 65535)) { System.out.println("[Error : port number out of range ]"); } else { if(!split_commands[1].equals("-s")) { System.out.println("[Error : not a server command ]"); } else { value = true; } } } else { System.out.println("[Error : 2 arguments required ]"); } } serverSocket = new DatagramSocket(Integer.parseInt(split_commands[2])); System.out.println("Server has been started\n"); byte[] sendData = new byte[8192]; new UDPServer().startReceiving(); }//main }//class
UDPClient.java
package bidding; import java.io.*; import java.net.*; import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.*; public class UDPClient extends Thread{ /****/ /*** @param args */ public static boolean ACK; public static ArrayList<client> clientList = new ArrayList<client>(); public static DatagramSocket clientSocket; public static boolean OFFLINE_BUY=false; public static boolean REGISTER = false; public static boolean DEREGISTER = false; public static boolean ACTIVE = false; public static String direct_buy; public static String sellerName; public static String[] split_command1 = new String[20]; public static int port; public static InetAddress host; public static String name; public static void sendACK(InetAddress IP,int port) { System.out.println("Sending ack for register"); byte[] data = new byte[4096]; data = "acknowledgement".getBytes(); DatagramPacket sendPacket = new DatagramPacket(data,data.length, IP, port); try { clientSocket.send(sendPacket); } catch (IOException e) { // TODO Auto-generated catch block //e.printStackTrace(); } } public static void sendUDPPacket(String info , InetAddress IP , int port) { byte[] sendData = new byte[4096]; sendData=info.getBytes(); //The code for waiting for time out and 5 attempts is commented because it makes the //code go into an infinite loop /*int attempt_no = 0; ACK = false; while ((!ACK && attempt_no < 5) ) { */ DatagramPacket sendPacket = new DatagramPacket(sendData,sendData.length, IP, port); try { clientSocket.send(sendPacket); /*try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block //e.printStackTrace(); }*/ } catch (IOException e) { } /*} if(!ACK) System.out.println("[ Host unavailable ]");*/ } //Used to broadcast information about all clients to all the clients public static void updateTables(String[] InfoList) throws UnknownHostException { clientList.clear(); String[] split_client_info = new String[3]; for(int i=0;i<InfoList.length; i++) { split_client_info = InfoList[i].trim().split(" "); String username= split_client_info[0].trim(); InetAddress IP= InetAddress.getByName(split_client_info[1].substring(1)); int port= Integer.parseInt(split_client_info[2].trim()); client c = new client(username,IP,port); clientList.add(c); } System.out.println("sobs>[Client table updated]"); System.out.print("sobs>"); } //Receiver thread public void startReceiving() { Thread tReceiverthread = new Thread(new Runnable() { @Override public void run() { try { UDPReceiver(); } catch (Exception e) { // e.printStackTrace(); } } @SuppressWarnings("unchecked") public void UDPReceiver() throws IOException { while(true) { byte[] receiveData = new byte[8192]; DatagramPacket receivePacket =new DatagramPacket(receiveData,receiveData.length); try { clientSocket.receive(receivePacket); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } if(!ACTIVE) continue; InetAddress receiverIP = receivePacket.getAddress(); int receiver_port = receivePacket.getPort(); String reply =new String(receivePacket.getData()); // Checking if the received packet is an ack if(reply.trim().equalsIgnoreCase("acknowledgement")) { ACK = true; if(OFFLINE_BUY) { System.out.println("sobs> [ "+sellerName+" is offline. Request has been forwarded to the server ]"); System.out.print("sobs>"); OFFLINE_BUY = false; } else if(REGISTER) { System.out.println("sobs> [Welcome "+name+", you have successfully signed in.] "); System.out.print("sobs>"); REGISTER =false; } else if(DEREGISTER) { System.out.println("sobs> [You have successfully signed out. Bye!]"); System.out.print("sobs>"); DEREGISTER = false; } } //broadcasting to all clients else if(reply.trim().equals("broadcast")) { String[] clientInfoList = new String[1000]; while(!reply.trim().equals("sent")) { byte[] receiveData1 = new byte[4096]; DatagramPacket receivePacket1 =new DatagramPacket(receiveData1,receiveData1.length); clientSocket.receive(receivePacket1); String Reply = new String(receivePacket1.getData()); if(Reply.trim().equals("sent")) break; Reply = Reply.replace("[", ""); Reply = Reply.replace("]", ""); clientInfoList = Reply.split(","); } updateTables(clientInfoList); } //buy and offline buy else if(reply.contains("buy")) { int i; String[] split_buy = new String[3]; split_buy = reply.split(" "); String buyerName=null; for(i =0;i<clientList.size();i++) { client c = clientList.get(i); if(c.cli_IP.toString().equals(receiverIP.toString()) && c.cli_port == receiver_port) { buyerName = c.username; System.out.println("sobs>[ "+buyerName+" wants to buy your item "+split_buy[2].trim()+" ]"); System.out.print("sobs>"); direct_buy = "direct "+split_buy[2].trim()+" "+buyerName; sendUDPPacket(direct_buy,host,port); break; } } } else if(split_command1[0].equals("deregister")) { } else if(split_command1[0].equals("register")) { //Receiving offline messages while(!reply.trim().equals("done")) { System.out.println("sobs> [ " +reply+" ]"); byte[] receiveData2 = new byte[8192]; DatagramPacket receivePacket2 =new DatagramPacket(receiveData2,receiveData2.length); try { clientSocket.receive(receivePacket2); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } reply =new String(receivePacket2.getData()); }//end of while for receiving offline messages System.out.print("sobs>"); }//end of register else if(split_command1[0].trim().equals("info")) { if(split_command1.length == 1) { //Receiving info for all items while(!reply.trim().equals("done")) { System.out.println("sobs>" +reply); byte[] receiveData2 = new byte[8192]; DatagramPacket receivePacket2 =new DatagramPacket(receiveData2,receiveData2.length); try { clientSocket.receive(receivePacket2); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } reply =new String(receivePacket2.getData()); } System.out.print("sobs>"); } else { System.out.println("sobs>" +reply); System.out.print("sobs>"); } }//end of info else { System.out.println("sobs>" +reply); System.out.print("sobs>"); } }//end of while loop }//end of receiver function });//end of runnable tReceiverthread.start(); //System.out.println("Thread started"); }//end of startReceiver public static void main(String[] args) throws Exception { new UDPClient().startProgram(); // TODO Auto-generated method stub } public void startProgram() throws Exception { String[] split_commands = new String[10]; String command = ""; Pattern pattern = Pattern.compile("^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + "([01]?\\d\\d?|2[0-4]\\d|25[0-5])$"); BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System. in) ); clientSocket = new DatagramSocket(); boolean value = false; startReceiving(); System.out.println("Please enter your command\n"); //Validating the first input while(!value) { command = inFromUser.readLine(); split_commands = command.split(" "); if (split_commands[0].equals("sobs")) { if(split_commands.length == 4) { if((Integer.parseInt(split_commands[3]) < 1024) || (Integer.parseInt(split_commands[3]) > 65535)) { System.out.println("[ Error : port number out of range ]"); } else { if(split_commands[1].equals("-c")) { port = Integer.parseInt(split_commands[3]); Matcher match = pattern.matcher(split_commands[2]); if (match.matches()) { host = InetAddress.getByName(split_commands[2]); value = true; } else { System.out.println("[Error : Invalid IP ]"); } } else { System.out.println("[Error : No a client command ]"); } } } else { System.out.println("[ Error : arguments ]"); } } else { System.out.println("[ Error : Incorrect command ]"); } } System.out.print("sobs>"); while(true) { command = inFromUser.readLine(); split_command1 = command.split(" "); if(split_command1[0].equals("buy")) { if(!ACTIVE) { System.out.println("sobs>[Error : Not registered]"); System.out.print("sobs>"); } else if(split_command1.length != 3) { System.out.println("sobs> [Error : incorrect number of arguments ]"); System.out.print("sobs>"); } else { sellerName = split_command1[1]; InetAddress seller_IP = null; int seller_port = 0; int i; for(i=0;i<clientList.size();i++) { client c = clientList.get(i); if(sellerName.trim().equals(c.username)) { seller_IP = c.cli_IP; seller_port = c.cli_port; break; } } if(i == clientList.size()) { OFFLINE_BUY = true; direct_buy = "direct "+split_command1[2]+" "+name; sendUDPPacket(direct_buy,host,port); } else { sendUDPPacket(command,seller_IP,seller_port); } } } else if(split_command1[0].equals("register")) { if(split_command1.length != 2) { System.out.println("sobs> [Error : incorrect number of arguments ]"); System.out.print("sobs>"); } else { name = split_command1[1]; REGISTER = true; ACTIVE = true; sendUDPPacket(command,host,port); } } else if(split_command1[0].equals("deregister")) { if(!ACTIVE) { System.out.println("sobs>[Error : Not registered]"); System.out.print("sobs>"); } else if(split_command1.length != 1) { System.out.println("sobs> [Error : incorrect number of arguments ]"); System.out.print("sobs>"); } else { DEREGISTER = true; ACTIVE = false; sendUDPPacket(command,host,port); } } else if(split_command1[0].equalsIgnoreCase("sell")) { if(!ACTIVE) { System.out.println("sobs> [Error : Not registered]"); System.out.print("sobs>"); } else if(split_command1.length != 6) { System.out.println("sobs> [Error : incorrect number of arguments"); System.out.print("sobs>"); } else { sendUDPPacket(command,host,port); } } else if(split_command1[0].equalsIgnoreCase("bid")) { if(!ACTIVE) { System.out.println("sobs>[Error : Not registered]"); System.out.print("sobs>"); } else if(split_command1.length != 3) { System.out.println("sobs> [Error : incorrect number of arguments ]"); System.out.print("sobs>"); } else { sendUDPPacket(command,host,port); } } else if(split_command1[0].equalsIgnoreCase("info")) { if(!ACTIVE) { System.out.println("sobs>[Error : Not registered]"); System.out.print("sobs>"); } else if(split_command1.length > 3) { System.out.println("sobs> [Error : incorrect number of arguments ]"); System.out.print("sobs>"); } else { sendUDPPacket(command,host,port); } } else { System.out.println("sobs>[Error : Unknown command ]"); System.out.print("sobs>"); } } //clientSocket.close(); } }
UDPServer :
This class performs all the operations of the server.
There are two threads running : One is the main thread and the other one is just for receiving data.
UDPClient:
This class performs all the operations of the client.
There are two threads running:One is the main thread and the other one is just for receiving data.
Item:
It contains all the required details of an Item.
item_code
name
owner
translimit
startbid
buynow
description
current_bid
transaction_count
buyername
client:
It contains the necessary details of the client.
username
cli_IP
cli_port
offline_user:
It contains the details of an offline message.
name
message
Features Implemented :
The start commands on the server as well as the client :
sobs -s port_no
sobs -c IP port_no
Errors thrown :
Port number out of range.
Invalid IP.
Less or more number of arguments.
Anything other than –s on the server.
Anything other than –c on the client.
Client commands :
register and deregister
All the requested features have been implemented.
When the commands are entered the server sends acknowledgement and appropriate messages are printed on the client window.
The client information tables are broadcasted and updated.
No information can be sent or received after deregister.
Sends offline message if any are present.
sell
Results printed on the window :
[Error :arguments]
[<item-name> added with number <item-code>]
The description for the item needs to be entered separated by underscores. Example can be seen in the test cases mentioned after this section.
info
[Error : Empty]
[Error : Item not found]
[Details of a particular item]
Details of all the items.
bid
[Error : arguments]
[Error:owner]
[Error:duplicate bid]
[Error:item not found]
[<item number> <item name> <current bid>]
Sold [<item number> <item name> <current bid>]
Purchased [<item number> <item name> <current bid>]
Adds to offline messages if the client is not online anymore.
buy
Implemented like the diagram shown.
Customer to seller, seller to the server and then sold and purchased indications to both.
offline-buy
Customer to server, purchased and seller offline indication to customer and offline message saved for the seller.
Feature not implemented:
I could not successful ly implement the sending of acknowledgement from client to server and server to client everytime it receives a packet . If the acknowledgement is not received even after 5 times the message is stored in the offline messages for that user. Everytime I added this portion of my code the program went into an infinite loop on the register command itself. I could not successfully debug it. I have commented that portion of the code in my program.
Testing
The program has been tested with one server and three client running on the clic lab machine.
Makefile contents :
JFLAGS = -g
JC = javac
JCLASSPATH = -cp .:../../bin
.SUFFIXES: .java .class
.java.class:
$(JC) $(JFLAGS) $(JCLASSPATH) $*.java
CLASSES = \
Item.java \
client.java \
offline_user.java
SOME = UDPClient.java \
UDPServer.java
default:classes
classes :$(CLASSES:.java=.class)
main :$(SOME:.java=.class)
clean:
$(RM) *.class
SubmissionFolder/FinalUDPServerClient/src/bidding : make classes (builds the dependency classes)
SubmissionFolder/FinalUDPServerClient/src/bidding : make main (builds the Server and Client classes)
To run the code you need to come back one folder to src and execute java bidding.UDPServer(for server) , java bididng.UDPClient(for client)
Test Cases:
Server:
sobs -s 3567869
[Error : port number out of range ]
sobs -s
[Error : 2 arguments required ]
sobs -s 1236
Server has been started
Client 1:
sobs -c 767838 1234
[Error : Invalid IP ]
sobs -c 127.0.0.1 1236
sobs>register nandita
sobs> [Welcome nandita, you have successfully signed in.]
sobs>sobs>sobs>[Client table updated]
sobs>info
sobs>[Error : empty]
sobs>sell pen 3 200 600 fountain_pen
sobs>[pen added with number 1]
sobs>sell pencil 2 500 800 new_pencil
sobs>[pencil added with number 2]
sobs>sobs>[Client table updated]
sobs>bid 1 100
sobs>[ Error : owner ]
sobs>sobs>[Client table updated]
sobs>sobs>[ sold :1 pen 600 ]
sobs>sobs>[ geetha wants to buy your item 2 ]
sobs>sobs>sold 2 pencil
sobs>sobs>[Client table updated]
sobs>sobs>[Client table updated]
sobs>
Client 2:
sobs>register geetha
sobs> [Welcome geetha, you have successfully signed in.]
sobs>sobs>sobs>[Client table updated]
sobs>info
sobs>1 pen nandita 200 600 fountain_pen
sobs>2 pencil nandita 500 800 new_pencil
sobs>bid 1 300
sobs>1 pen 500
sobs>bid 1 200
sobs>[ Error : duplicate bid ]
sobs>sobs>[Client table updated]
sobs>buy nandita 2
sobs>purchased 2 pencil 800
sobs>sobs>[Client table updated]
sobs>info
sobs>3 pan satish 400 600 frying_pan
sobs>buy satish 3
sobs>[purchased 3 pan 600 ]
sobs> [ satish is offline. Request has been forwarded to the server ]
sobs>sobs>[Client table updated]
sobs>
Client 3:
Please enter your command
sobs -c 127.0.0.1 1236
sobs>info
sobs>[Error : Not registered]
sobs>register satish
sobs> [Welcome satish, you have successfully signed in.]
sobs>sobs>sobs>[Client table updated]
sobs>info
sobs>1 pen nandita 500 600 fountain_pen
sobs>2 pencil nandita 500 800 new_pencil
sobs>bid 1 100
sobs>[ purchased :1 pen 600 ]
sobs>sell pan 2 400 600 frying_pan
sobs>[pan added with number 3]
sobs>deregister
register satish
sobs> [Welcome satish, you have successfully signed in.]
sobs>sobs> [ Offline message :[sold 3 pan ]
sobs>sobs>[Client table updated]
sobs>