基于UDP实现多台电脑通信

在学习JAVA的网络编程时学到了UDP,这个东西可以实现不同电脑之间进行数据传输,我就想做一个最简单的聊天窗口,弄了一整天在和老师讨论了一下之后终于做出了一个勉强可以用来聊天的。写了一个比较形象的比喻,应该都能看懂
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
UDP思路:

  • 可以把UDP的思路想象成发快递和收快递的过程,我准备了一份数据想要发给小明,就要先把它打包成一个包裹,然后填上小明的收货地址和门牌号,这样之后包裹就可以通过网络寄给小明,同理,小明想要给我发数据也需要经过同样的流程,而此时的收货地址跟门牌号就应该填我的信息
  • DatagramPacket类创建的对象就是用来打包包裹的,构造函数 DatagramPacket(byte data[], int length, InetAddtress address, int port) 其中的参数data[]就是你要发送的内容,length是内容的长度,address是对方的收获地址(IP地址),port是对方的门牌号(端口)
  • DatagramSocket类创建的对象就是快递公司,负责发货和送货,发货就是把打包好的数据发送出去,使用send()函数即可,参数为DatagramPacket类的对象;送货需要将包裹准确交到正确的人手中,为了能够收货成功,需要验证一下门牌是否一致,则此时的构造函数应为DatagramSocket(int port)参数为收货人的门牌号(端口),若门牌一致则收获成功

细节:

  • 发送数据时IP地址和端口一定要填接收方的,接收数据时端口一定要填自己的
  • 接收数据时要用一个新线程
  • IP地址可通过查看网络的属性查看 ipv4的那一个地址

通信失败可能出现的问题:

  • IP地址和端口没有填写对或者填成了自己主机的
  • 发送时的端口和接收时的端口不一致
  • 电脑打开了防火墙发送过来的数据被阻隔了
  • 两台电脑的无法连接起立,ping 通不过,若是此情况需要进行打洞
  • 网络本身的问题,类似校园网之类的网络可能限制比较多容易连接不上

完整代码如下:
主机1

package 网络;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.net.*;
import java.io.*;
public class UDP主机1 {
	public static void main(String[] args) {
		new A() ;
	}
}
class A extends JFrame implements Runnable, ActionListener {
	JTextField outMessage = new JTextField(30) ;		//输入发送内容的文本框
	JTextArea inMessage = new JTextArea(12, 20) ;		//输出收到内容的文本区
	JButton button = new JButton("发送") ;
	JPanel panel = new JPanel() ;
	A() {
		setBounds(50, 50, 600, 900) ;
		setVisible(true) ;
		setTitle("一号机");
		button.addActionListener(this) ;				//点击“发送”按钮进行发送
		panel.add(outMessage) ;
		panel.add(button) ;
		add(new JScrollPane(inMessage), BorderLayout.CENTER) ;
		add(panel, BorderLayout.NORTH) ;
		Thread thread = new Thread(this) ;
		validate() ;
		thread.start() ;
	}
	public void actionPerformed(ActionEvent e) {		//发送数据
		byte b[] = outMessage.getText().trim().getBytes() ;	//将输入到文本框中的内容变为byte类型
		try {
			InetAddress address = InetAddress.getByName("192.168.43.143") ;	//接收方的IP地址
			DatagramPacket data = new DatagramPacket(b, b.length, address, 10086) ;	//接收方的端口
			DatagramSocket mail = new DatagramSocket() ;	//快递公司
			mail.send(data) ;		//发货
		}
		catch(Exception ee) {}
	}
	public void run() {				//收货
		DatagramPacket pack = null ;
		DatagramSocket mail = null ;
		byte b[] = new byte [8192] ;
		try {
			pack = new DatagramPacket(b, b.length) ;
			mail = new DatagramSocket(10011) ;		//收货要验证门牌是否相同
		}
		catch(Exception e) {}
		while(true) {
			try {
				mail.receive(pack) ;	//收获
				String message = new String(pack.getData(), 0 ,pack.getLength()) ;	//将收到的数据从byte型变为string型
				inMessage.append("收到数据来自:"+pack.getAddress()+"\n") ;	//将数据输出到文本区
				inMessage.append(message+"\n") ;
				inMessage.setCaretPosition(inMessage.getText().length()) ;	//将光标移动到最后便于下次接收数据从最后开始
			}
			catch(Exception e) {}
		}
	}
}

主机2(代码与主机1几乎一致,只需注意IP地址和端口处的不同即可)

package 网络;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.net.*;
import java.io.*;
public class UDP主机2 {
	public static void main(String[] args) {
		new B() ;
	}
}
class B extends JFrame implements Runnable, ActionListener {
	JTextField outMessage = new JTextField(12) ;
	JTextArea inMessage = new JTextArea(12, 20) ;
	JButton button = new JButton("发送") ;
	JPanel panel = new JPanel() ;
	B() {
		setBounds(50, 50, 600, 900) ;
		setVisible(true) ;
		setTitle("二号机");
		button.addActionListener(this) ;
		panel.add(outMessage) ;
		panel.add(button) ;
		Container con = getContentPane() ;
		con.add(new JScrollPane(inMessage), BorderLayout.CENTER) ;
		con.add(panel, BorderLayout.NORTH) ;
		Thread thread = new Thread(this) ;
		validate() ;
		thread.start() ;
	}
	public void actionPerformed(ActionEvent e) {
		byte b[] = outMessage.getText().trim().getBytes() ;
		try {
			InetAddress address = InetAddress.getByName("192.168.43.146") ;	//IP地址是接收方的
			DatagramPacket data = new DatagramPacket(b, b.length, address, 10011) ;	//接收方的端口
			DatagramSocket mail = new DatagramSocket() ;
			mail.send(data) ;
		}
		catch(Exception ee) {}
	}
	public void run() {
		DatagramPacket pack = null ;
		DatagramSocket mail = null ;
		byte b[] = new byte [8192] ;
		try {
			pack = new DatagramPacket(b, b.length) ;
			mail = new DatagramSocket(10086) ;	//自己的端口
		}
		catch(Exception e) {}
		while(true) {
			try {
				mail.receive(pack) ;
				String message = new String(pack.getData(), 0 ,pack.getLength()) ;
				inMessage.append("收到数据来自:"+pack.getAddress()+"\n") ;
				inMessage.append(message+"\n") ;
				inMessage.setCaretPosition(inMessage.getText().length()) ;
			}
			catch(Exception e) {}
		}
	}
}

总结:

  • 第一次和老师讨论问题,在交流后找到了一直连不通的原因,以后还是要多找老师讨论
  • 这个聊天窗口还是有点问题,每运行一次该程序,关闭程序后这个端口就不能用了,应该是上一次使用后程序没有完全关闭就一直占着那个端口,第二次运行程序就用不了,只能完全关闭编译器然后重新打开或者改一个新的端口,我想的是解决方法是应该在关程序之前要先把这个端口close掉,尝试了一下但暂时做不到close,思路应该是对的但是还没学到具体的方法,等学会了再来完善
  • 学校校园网有毒,两个电脑一直连不通,最后是用手机给电脑开热点才连通了
  • 最后问一句 有人愿意用我写的东西和我聊天吗 有的话我就做个好的窗口出来
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 《03米联客2020版fpga课程(udp以太网通信篇).pdf》是一份有关FPGA课程的学习资料,主题为UDP以太网通信。其目的是帮助学习者通过FPGA开发板实现基于UDP/IP协议的通信功能。 该资料通过实例展示如何搭建网卡设计平台、使用IP核构建UDP以太网通信模块、编写Verilog代码实现网络数据包的接收与发送等。同时,它还介绍了CDMA、AXI协议以及不同设计场景下的FPGA资源管理技巧等。 对于初学者来说,《03米联客2020版fpga课程(udp以太网通信篇).pdf》提供了一个较为系统和详细的FPGA学习方案,让他们可以更轻松地理解和应用FPGA技术。同时,对于已有一定FPGA开发经验的学习者,该资料也是一份有用的参考和进一步学习的推动。 总之,《03米联客2020版fpga课程(udp以太网通信篇).pdf》是一份值得学习和掌握的资料,可以为FPGA开发爱好者提供更加全面和深入的学习体验。 ### 回答2: 《03米联客2020版fpga课程(udp以太网通信篇).pdf》是一份非常详细的FPGA课程教材,主要讲授了使用UDP协议进行以太网通信的过程。该教材从基础概念讲起,包括了FPGA的基本结构、五种计算机总线结构、电脑与FPGA之间的数据传输方式等内容。 在UDP以太网通信篇的部分,该教材详细介绍了UDP协议的概念、UDP的头部结构、IP地址的使用方法以及以太网通信的流程等内容。并通过实例演示了FPGA与电脑之间通信的具体实现,包括FPGA端的IP地址设置、以太网发送及接收的例程等。 总的来说,该教材非常适合FPGA入门者学习,通过跟随书中的实验,可以更直观地了解FPGA开发的具体步骤,提高自己的开发能力。同时,该教材对于FPGA的应用具有广泛的意义,可以扩大学生的知识面,提高其竞争力。因此,我认为《03米联客2020版fpga课程(udp以太网通信篇).pdf》是一份非常有价值的学习资料,值得广大FPGA爱好者认真学习。 ### 回答3: 《03米联客2020版fpga课程(udp以太网通信篇).pdf》是一份关于FPGA通信技术的教程。该教程主要介绍了FPGA在UDP以太网通信中的应用。该教程包含了对UDP协议、以太网协议的详细介绍,并给出了相应的设计案例。 整个教程分为六个部分。首先,作者介绍了UDP协议的特点以及与TCP协议的区别。其次,作者详细讲解了以太网协议的组成结构与工作原理。接着,作者通过实例讲解了如何在FPGA板上实现UDP以太网通信,包括对通信程序的代码实现,以及对接收端和发送端的设计。 在教程的后面,作者还对FPGA通信技术未来的发展进行了展望。他认为,未来FPGA通信技术将会更加广泛应用于5G无线通信、物联网等领域,成为现代通信技术的重要组成部分。 总的来说,该教程将FPGA通信技术的基本原理讲解得十分详细,并通过案例的实现,让读者更好地理解了其应用流程。对于学习FPGA通信技术的工程师、研究人员以及爱好者来说,该教程是一份很不错的参考资料。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值