實驗五 基於UDP程式設計實驗
阿新 • • 發佈:2019-02-02
實驗五 基於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");
}
}
}
}