java课内趣味小实验--DatagramSocket网络编程
实验八 DatagramSocket编程
一、实验目的
掌握DatagramSocket和Datagrampacket编程的方法。
二、实验环境
PC系列微机,Windows XP。
JDK150或更高版本。
三、实验步骤
编写一个简单的2人聊天程序,可以采用图形界面,也可以采用字符界面。
1、利用DatagramSocket和DatagramPacket类的编写客户A程序:
客户A通过DatagramSocket类在本机的3000端口收发数据。
客户端A向客户B的5000端口发送字符串,并接收客户B发来的字符串,从而开始聊天,当输入bye或接收到bye时停止。
2、利用DatagramSocket和DatagramPacket类的编写客户B程序:
客户B通过DatagramSocket类在本机的5000端口收发数据。
客户端B在5000端口处接收客户A的数据,并在5000端口向客户A的3000端口发送字符串,从而开始聊天,当输入bye或接收到bye时停止。
四、实验报告
写出合格的实验报告,至少包括实验目的、实验内容(程序代码)、出现的问题、学到的知识等。
code:
两主机程序:
package Network;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class DatagramPacketDemo extends JFrame {
int localhost,remotehost;
JLabel lblInput=new JLabel("输入:");
JTextField jtfInput=new JTextField(20);
JButton btnSend=new JButton("发送");
JTextArea jtaContent=new JTextArea(30,30);
Container c=this.getContentPane();
Panel pUP=new Panel();
DatagramSocket ds;
DatagramPacket dp;
private void init(){
pUP.add(lblInput);
pUP.add(jtfInput);
pUP.add(btnSend);
btnSend.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
String temp=jtfInput.getText();
jtaContent.append("我说:"+temp+"\n");
byte[] buffer=temp.getBytes();
try {
dp=new DatagramPacket(buffer,buffer.length,InetAddress.getByName("localhost"),remotehost);
ds.send(dp);
jtfInput.setText("");
if(temp.equals("bye")){
ds.close();
}
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
pUP.setLayout(new FlowLayout());
c.add(pUP,BorderLayout.NORTH);
c.add(jtaContent,BorderLayout.CENTER);
}
public DatagramPacketDemo(String title,int l,int r){
super(title);
this.localhost=l;
this.remotehost=r;
try {
ds=new DatagramSocket(localhost);
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
init();
Receiver r1=new Receiver(jtaContent,localhost,remotehost,ds);
r1.start();
this.setSize(400,400);
this.setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args) {
DatagramPacketDemo dpd1=new DatagramPacketDemo("主机A",5000,3000);
DatagramPacketDemo dpd2=new DatagramPacketDemo("主机B",3000,5000);
}
}
多线程接收器:
package Network;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import javax.swing.JTextArea;
public class Receiver extends Thread{
JTextArea jtaContent;
boolean flag=true;
int localhost,remotehost;
DatagramSocket ds;
public Receiver(JTextArea jta,int l,int r,DatagramSocket ds){
jtaContent=jta;
localhost=l;
remotehost=r;
this.ds=ds;
}
public void run(){
while(flag){
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
try {
ds.receive(dp);
String temp=new String(buf,0,dp.getLength());
jtaContent.append("对方说:"+temp+"\n");
if(temp.trim().equals("bye")){
this.setFlag(false);
ds.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void setFlag(boolean f){
flag=f;
}
}
PS:跟Socket差不多,另一种连接方式,还需多加联系……