최적화된 UDP 코드 및 다중 스레드 구현

4859 단어
public class SendDemo {

	public static void main(String[] args) throws IOException {
		//      Socket  
		DatagramSocket  ds = new DatagramSocket() ;
		
		//        
		byte[] bys = "hello,udp,   ".getBytes() ;
		DatagramPacket dp = new DatagramPacket(bys, bys.length,InetAddress.getByName("192.168.0.124"),12345) ;
	
		//    
		ds.send(dp);
		
		//    
		
		ds.close();
	}
}
public class ReceiveDemo {
	
	public static void main(String[] args) throws IOException {
		
		//      Socket  
		DatagramSocket ds = new DatagramSocket(12345) ;
		
		//      
		//         1024  1024   
		byte[] bys = new byte[1024] ;
		DatagramPacket dp = new DatagramPacket(bys, bys.length);
		
		//       
		ds.receive(dp);//     
		
		//    ,         
		//  ip  
		String ip = dp.getAddress().getHostAddress() ;
		//public byte[] getData()             
		//public int getLength()             
		String s = new String(dp.getData(), 0,dp.getLength()) ;
		
		//     
		System.out.println("from"+ip+"data is:"+s);
		
		//    
		ds.close();
	}
}

상기 코드는 한 번에 한 개의 메시지를 보낼 수 있을 뿐, 여러 번 발송할 수 없다. 다음은 우리가 어떻게 여러 번 발송하고 수신하는지 배운다.
다중 스레드: Runable 인터페이스 방식 SendThread implements Runnable {} 송신단의 스레드 수신단의 스레드 주 스레드
하나의 창만 있으면 됩니다.
public class SendDemo {

	public static void main(String[] args) {

		try {
			//   Socket  
			DatagramSocket ds = new DatagramSocket();

				//     
				BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

				String line = null ; //    
				while((line=br.readLine())!=null){
	
					//       
					if("886".equals(line)) {
						break ;
					}

					byte[] bys = line.getBytes() ;
					int length = bys.length ;
					//       
					DatagramPacket dp = new DatagramPacket(bys,length,
							InetAddress.getByName("192.168.10.1"), 10086);

					//     
					ds.send(dp);

				
				}
				//     
				ds.close();

		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
public class ReceiveDemo {
	
	public static void main(String[] args) {
		
		try {
			//      Socket  
			DatagramSocket ds = new DatagramSocket(10086);
			
			while(true) {
				//        
				byte[] bys = new byte[1024] ;
				DatagramPacket dp = new DatagramPacket(bys, bys.length) ;
				
				//  
				ds.receive(dp);
				
				//    
				String ip = dp.getAddress().getHostAddress() ;
				String s = new String(dp.getData(), 0, dp.getLength()) ;
				
				System.out.println("from" +ip +"data is:"+s);
				
				//    ,          ,        
//				ds.close();
			}
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
 
다중 스레드:
Runable 인터페이스 방식 SendThread implements Runnable {} 송신단의 스레드 수신단의 스레드 메인 스레드는 하나의 창만 있으면 됩니다. 데이터가 간단한 채팅방 프로젝트의 채팅방 집합 + 다중 스레드 + IO 흐름 + 네트워크 프로그래밍 종합 응용 1) 채팅 2) 온라인 인원 4) 송신 파일
5) 오프라인 알림
public class ReceiveThread implements Runnable {

	private DatagramSocket ds;

	public ReceiveThread(DatagramSocket ds) {
		this.ds = ds;
	}

	@Override
	public void run() {
		try {

			while(true) {
				//        
				byte[] bys = new byte[1024] ;
				DatagramPacket dp = new DatagramPacket(bys, bys.length) ;
				
				//  
				ds.receive(dp);
				
				//    
				String ip = dp.getAddress().getHostAddress() ;
				String s = new String(dp.getData(), 0, dp.getLength()) ;
				
				System.out.println("from" +ip +"data is:"+s);
				
				//    ,          ,        
//				ds.close();
			}
		}catch(IOException e) {
			e.printStackTrace(); 
		}
	}

}
public class SendThread implements Runnable {

	private DatagramSocket ds ;
	public SendThread(DatagramSocket ds) {
		this.ds = ds ;
	}
	
	@Override
	public void run() {
		try {
			//         
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in)) ;
			String line = null ;
			//      
			while((line=br.readLine())!=null) {
				//       
				if("over".equals(line)) {
					break ;
				}
				
				byte[] bys = line.getBytes() ;
				//      
				DatagramPacket dp = 
						new DatagramPacket(bys, bys.length, 
									InetAddress.getByName("192.168.1.103"), 10086) ;
				
				//    
				ds.send(dp);
				
			}
			//  
			ds.close();
			
		}catch(IOException e) {
			e.printStackTrace(); 
		}
	}

}
public class ChartRoom {
	
	public static void main(String[] args) throws Exception {
		
		//            Socket  
		DatagramSocket sendSocket = new DatagramSocket() ;
		DatagramSocket receiveSocket = new DatagramSocket(10086) ;
		
		//      
		SendThread st = new SendThread(sendSocket) ;
		ReceiveThread rt = new ReceiveThread(receiveSocket) ;
		
		//      
		Thread t1 = new Thread(st) ;
		Thread t2 = new Thread(rt) ; 
		
		//    
		t1.start();
		t2.start();
		
	}
}

좋은 웹페이지 즐겨찾기