1. 程式人生 > >實驗五 基於UDP程式設計實驗

實驗五 基於UDP程式設計實驗

實驗五 基於UDP程式設計
實驗目的:
1、理解UDP及基於資料報通訊的基本原理;
2、學會基於UDP程式設計的程式碼編寫及理解各語句內容;
3、掌握基於UDP程式設計的具體應用。
實驗要求:
1、建立兩個獨立的基於UDP程式設計的Java工程,用於伺服器和客戶端系統;
2、建立UDP的JAVA類,並能正確執行且能實現資料報通訊;
3、對JAVA類的功能進行拓廣,使基於UDP程式設計用於某一具體的應用 。
3、除錯使以上兩個工程能正常執行,使服務端和客戶端能正常通訊。
4、對伺服器端和客戶端的程式程式碼進行閱讀和理解,要求做到每條語句都能明白其具體含義,每個類都瞭解其功能。
5、對以上程式進行適當的修改,要求資料報通訊功能保持實現。
(注:修改的方向有:圖形化介面、多臺電腦通訊、結合線程程式設計等。)

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package myinteaddress1;
import java.io.*;
import java.net.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
/**
 *
 * @author
Administrator */
public class UDPChat implements Runnable,ActionListener{ JTextArea showArea; JLabel lbl1,lbl2,lbl3; JTextField msgText,sendPortText,receivePortText,IPAddressText; JFrame mainiJframe; JButton sendBtn,startBtn; JScrollPane JSPane; JPanel Pane1,Pane2; Container con; Thread thread=null
; DatagramPacket sendPack,receivePack; DatagramSocket sendSocket,receiveSocket; private InetAddress sendIP; private int sendPort,receivePort; private byte intBuf[],outBuf[]; public static final int BUFSIZE=1024; public UDPChat(){ mainiJframe=new JFrame("聊天---UDP協議"); con=mainiJframe.getContentPane(); showArea=new JTextArea(); showArea.setEditable(false); showArea.setLineWrap(true); lbl1=new JLabel("接受埠號"); lbl2=new JLabel("傳送埠號"); lbl3=new JLabel("對方的地址"); sendPortText=new JTextField(); sendPortText.setColumns(5); receivePortText=new JTextField(); receivePortText.setColumns(5); IPAddressText=new JTextField(); IPAddressText.setColumns(8); startBtn=new JButton("開始"); startBtn.addActionListener(this); Pane1=new JPanel(); Pane1.setLayout(new FlowLayout()); Pane1.add(lbl1); Pane1.add(receivePortText); Pane1.add(lbl2); Pane1.add(sendPortText); Pane1.add(lbl3); Pane1.add(IPAddressText); Pane1.add(startBtn); JSPane=new JScrollPane(showArea); msgText=new JTextField(); msgText.setColumns(40); msgText.setEditable(false); msgText.addActionListener(this); sendBtn=new JButton("傳送"); sendBtn.setEnabled(false); sendBtn.addActionListener(this); Pane2=new JPanel(); Pane2.add(msgText); Pane2.add(sendBtn); con.add(Pane1,BorderLayout.NORTH); con.add(JSPane,BorderLayout.CENTER); con.add(Pane2,BorderLayout.SOUTH); mainiJframe.setSize(600,400); mainiJframe.setVisible(true); mainiJframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main (String[] args){ new UDPChat(); } public void actionPerformed(ActionEvent e) { try{ if(e.getSource()==startBtn) { intBuf=new byte[BUFSIZE]; sendPort=Integer.parseInt(sendPortText.getText()); sendIP=InetAddress.getByName(IPAddressText.getText()); sendSocket=new DatagramSocket(); receivePort=Integer.parseInt(receivePortText.getText()); receivePack=new DatagramPacket(intBuf,BUFSIZE); receiveSocket=new DatagramSocket(receivePort); thread=new Thread(this); thread.setPriority(Thread.MIN_PRIORITY); thread.start(); startBtn.setEnabled(false); sendBtn.setEnabled(true); msgText.setEditable(true); } else{ outBuf=msgText.getText().getBytes(); sendPack=new DatagramPacket(outBuf,outBuf.length,sendIP,sendPort); sendSocket.send(sendPack); showArea.append("我說:"+msgText.getText()+"\n"); msgText.setText(null); } }catch(UnknownHostException el){ showArea.append("無法連線到指定的地址\n"); }catch(SocketException el){ showArea.append("無法開啟指定埠\n"); }catch(IOException el){ showArea.append("傳送資料失敗\n"); } } public void run(){ String msgstr; while(true){ try{ receiveSocket.receive(receivePack); msgstr=new String(receivePack.getData(),0,receivePack.getLength()); showArea.append("對方說:"+msgstr+"\n"); }catch(IOException el){ showArea.append("接受資料出錯\n"); } } } }

效果截圖