JAVA中的UDP通信(多线程)

client端的代码

package com.baidu.demo1;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class Test3_Client {
	public static void main(String[] args) throws IOException{
		InetAddress address=InetAddress.getByName("localhost");
		int port=8800;
		byte[] data="用户名:shabi;密码:555".getBytes();
		DatagramPacket packet=new DatagramPacket(data,data.length,address,port);
		DatagramSocket socket=new DatagramSocket();
		socket.send(packet);
		
		byte[] fromClient=new byte[1024];
		DatagramPacket frompacket=new DatagramPacket(fromClient,fromClient.length);//创建数据包,将会用数据包接受收到的信息
		socket.receive(frompacket);
		String fromServer=new String(fromClient,0,frompacket.getLength());
		System.out.println("我是客户端,服务器端说: "+fromServer);
	}
	
}

server端的代码

package com.baidu.demo1;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class Test3_Server {
	public static void main(String[] args) throws IOException{
		DatagramSocket socket=new DatagramSocket(8800);
		
		int count=0;
		while(true){
			byte[] data=new byte[1024];
			DatagramPacket packet=new DatagramPacket(data,data.length);//这里不清楚DatagramPacket和data的关系,为什么每次都///要创建新的byte?
			socket.receive(packet);
			count++;
			System.out.println("序号为: "+count);
			Test3_ServerThread uu=new Test3_ServerThread(packet); 
			uu.start();
		}
		
	}
}

线程的代码

package com.baidu.demo1;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class Test3_ServerThread extends Thread {
	DatagramPacket packet=null;
	public Test3_ServerThread(DatagramPacket packet){
		this.packet=packet;
	}
	public void run(){
		//System.out.println("咋回事?");
		byte[] ans=new byte[packet.getLength()];
		System.arraycopy(packet.getData(), 0, ans, 0, packet.getLength());
		//System.out.println(packet.getData());
		String info=new String(ans,0,packet.getLength());
		System.out.println("我是服务器,客户端说: "+info);
		
		
		byte[] toClient="欢迎您".getBytes();
		InetAddress address=packet.getAddress();
		int port=packet.getPort();
		DatagramPacket topacket=new DatagramPacket(toClient,toClient.length,address,port);
		DatagramSocket socket;
		try {
			socket = new DatagramSocket();
			socket.send(topacket);
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}

此代码参考学习慕课网的java socket教程。

对于不明白的地方,刚刚看了DatagramPacket的构造函数。

DatagramPacket

public DatagramPacket(byte[] buf,
                      int length)
构造  DatagramPacket,用来接收长度为  length 的数据包。 

length 参数必须小于等于 buf.length

参数:
buf - 保存传入数据报的缓冲区。
len - 要读取的字节数。
所以传入的byte数组只是为了开辟一个缓冲区给DatagramPacket,那么在接受了packet之后,也就是将数据存在了这个缓冲区后,既可以用byte数组来访问,也可以用DatagramPacket.getData()来访问,我想,应该是访问的是同一个位置。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值