java -> UDP Server/Client

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

扫描二维码关注公众号,回复: 621581 查看本文章
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();
	}


}


Classes used :

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>

 

 

 

 

猜你喜欢

转载自mft.iteye.com/blog/2306841