利用线程分离发送和接受,这样每个客服端都可以分离

这个代码是用线程实现建立连接

这样就可以实现发送和接受分离,大家互相不会影响到彼此

package com.udpcom;

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

public class SendThread implements Runnable {
    InetAddress ia;
    int port;
    DatagramPacket dp;
    DatagramSocket ds;

    Scanner in = new Scanner(System.in);
    public SendThread(InetAddress ia, int port) {
        this.ia = ia;
        this.port = port;
        try {
            ds = new DatagramSocket();
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        do{
        System.out.println("please input here:");
        String str = in.nextLine();
        //包装
        dp = new DatagramPacket(str.getBytes(),str.getBytes().length,ia,port);
        try {
            ds.send(dp);
        } catch (IOException e) {
            e.printStackTrace();
        }   
        }while(true);
    }

}
package com.udpcom;

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

public class ReceiveThread implements Runnable {
    InetAddress ia;
    int port;
    DatagramPacket dp;
    DatagramSocket ds;  
    byte buff[]=new byte[2014];
    public ReceiveThread(int port) {
        this.port = port;
        dp = new DatagramPacket(buff,2014);
        try {
            ds =new DatagramSocket(port);
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    @Override
    public void run() {
        do {
        try {
            ds.receive(dp);
            System.out.println(new String(dp.getData(),0,dp.getLength()));          
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        }while(true);

    }

}
package com.udpcom;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Scanner;

public class ClientA {
    public static void main(String[] args) {
        int port = 20000;
        String ip = "localhost";
        try {
            InetAddress ia = InetAddress.getByName(ip);
            Thread a = new Thread(new SendThread(ia,port));
            Thread b = new Thread(new ReceiveThread(20001));
            b.start();  
            a.start();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }

}

package com.udpcom;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Scanner;

public class ClientB {
/**
 * 只要输入对方的地址,加上一个端口号,我就可以发送
 * 根据地址和端口号,包装成为数据报,然后利用套接字发送
 * 发送利用20001 接受用20000端口,错开和另外一个main进程交互
 */
    public static void main(String[] args) {
        int port = 20000;
        String ip = "localhost";
        try {
            InetAddress ia = InetAddress.getByName(ip);
            Thread a = new Thread(new SendThread(ia,20001));
            Thread b = new Thread(new ReceiveThread(port));
            a.start();  
            b.start();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/mrcharles/p/4731759.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值