用Java完成一个简单的网络聊天(使用udp协议)

Udp协议 发送端和接受端的代码实现(socket编程)
发送端:
构造方法:
DatagramSocket datagramSocket = new DatagramSocket();
发送:
datagramSocket.send(数据报包);
创建数据报包的方法:
DatagramPacket datagramPacket = new DatagramPacket(byte[] length,address,port);
参数1:将内容转换为字节数组
参数2:字节数组长度
参数3:ip地址对象
参数4:端口号

接受端:
构造方法:
DatagramSocket datagramSocket = new DatagramSocket();
接受:
datagramSocket.receive( datagramPacket );
创建接受器:
DatagramPacket datagramPacket = new DatagramPacket( bytes, bytes.length );
接受真实数据:
byte[] data = datagramPacket.getData();
接受实际字节数组的长度
int length = datagramPacket.getLength();
获取发送的ip地址
String ip=datagramPacket.getAddress().getHostAddress();

那么在这些基础上,去写出一个既可以接受也可以发送的,那么可以考虑使用多线程的方法,来进行操作,具体如下:

package com.bxq.demo1.udpjieshou;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class Test {
    public static void main(String[] args) throws IOException {
        ExecutorService executorService = Executors.newFixedThreadPool( 2 );
        //建立线程池,线程池可以放两个线程,一个发送线程,一个接受线程
        Future<?> submit = executorService.submit( new Test1() );
        Future<?> submit1 = executorService.submit( new Test2() );
    }
}
class Test1 implements Runnable{
    public void run() {
        DatagramSocket datagramSocket = null;
        try {
            datagramSocket = new DatagramSocket();//创建发送的构造器
        } catch (SocketException e) {
            e.printStackTrace();
        }
        Scanner scanner = new Scanner(System.in);
        while(true){
            String s = scanner.next();
            byte[] b=s.getBytes();		//吧输入的字符串转换为字节数组
            InetAddress byName = null;
            try {
                byName = InetAddress.getByName( "xx.xx.xxx.xx" );//填上想要发送的对象的ip地址
            } catch (UnknownHostException e) {
                e.printStackTrace();
            }
            DatagramPacket datagramPacket = new DatagramPacket(b,b.length,byName,10086);
			//创建数据报包,内容为发送内容,发送内容大小,发送的地址,以及端口号
            try {
                datagramSocket.send( datagramPacket );
                //吧数据包发送出去
            } catch (IOException e) {
                e.printStackTrace();
            }
            if(s.equals( "886" )){
                break;
            }
        }
        datagramSocket.close();
    }
}
class Test2 implements Runnable{
    public void run() {
        DatagramSocket ds = null;
        try {
            ds = new DatagramSocket(10086);//创建接受构造器
        } catch (SocketException e) {
            e.printStackTrace();
        }
        byte[] bts = new byte[1024];
        int length = bts.length;
        DatagramPacket dp = new DatagramPacket(bts,length);	创建接受的包
        while(true){
            try {
                ds.receive (dp);	//在构造器中放入包
            } catch (IOException e) {
                e.printStackTrace();
            }
            byte[] bts2 = dp.getData();	//获取实际的对方发送的内容
            int length2 = dp.getLength();//获取对方实际发送的大小
            String receiveMes = new String(bts2,0,length2);//接受对方发送的内容,并转换为字符串
            String ip = dp.getAddress().getHostAddress();
            System.out.println(receiveMes+"ip:"+ip);
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值