java课内趣味小实验--DatagramSocket网络编程

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差不多,另一种连接方式,还需多加联系……




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值