tcp java实现通信

写一下写程序的时候遇到的各种问题

1.为什么要实现Runnable接口?

首先实现Runnable类可以把这个类定义成一个线程类,虽然通过继承Thread类的方式也可以完成多线程的建立。但是这种方式有一个弊端,如果一个类已经有了自己的父类就不能继承Thread类因为java单继承的局限性。可是该类中还有部分代码需要被多个线程同时执行。这时就应该对该类进行额外的功能扩展,java就提供了一个接口Runnable。这个接口中定义了run方法其实run方法的定义就是为了存储多线程要运行的代码。所以,通常创建线程通常实现Runnable接口。其实是将不同类中需要被多线程执行的代码进行抽取。将多线程要运行的代码的位置单独定义到接口中。为其他类进行功能扩展提供了前提。所以Thread类在描述线程时,内部定义的run方法,也来自于Runnable接口。继承Thread是可以对它类中方法,进行子类的复写。但是如果不需要这样的复写动作的话,只为定义线程代码存放位置,实现Runnable接口更方便一些。所以Runnable接口将线程要执行的任务封装成了对象。

还有就是run()方法在每个线程执行的时候都会首先执行。


public class TcpIp1 implements Runnable{
    DatagramSocket socker = null;
    BufferedReader reader = null;

    private String toIp;
    private int toPort;
    private int fromPort;


    public TcpIp4(String toIp, int toPort, int fromPort) {
        this.toIp = toIp;
        this.toPort = toPort;
        this.fromPort = fromPort;
        try {
            socker = new DatagramSocket(fromPort);
            //读取控制台数据
            reader = new BufferedReader(new InputStreamReader(System.in));
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        while (true) {
            String data = null;
            try {
                data = reader.readLine();
                byte[] datas = data.getBytes();
                DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress(this.toIp, this.toPort));
                socker.send(packet);
                if (data.equals("bye")) {
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        socker.close();
    }
}
public class TcpIp2 implements Runnable {
    DatagramSocket socket = null;
    private int port;
    private String msgFrom;

    public jieshou1(int port, String msgFrom) {
        this.port = port;
        this.msgFrom = msgFrom;
        try {
            socket = new DatagramSocket(port);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        while (true) {
            try {
                byte[] container = new byte[1024];
                DatagramPacket packet = new DatagramPacket(container, 0, container.length);
                socket.receive(packet);
                byte[] datas = packet.getData();
                String receiveData = new String(datas, 0, datas.length);
                System.out.println(msgFrom + ":" + receiveData);
                if (receiveData.equals("bye")) {
                    break;
                }

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        socket.close();
    }
}
  public static void main(String[] args) {
        new Thread(new TcpIp1("localhost",9999,7777)).start();
        new Thread(new TcpIp2(8888,"qinjiang")).start();
    }
  public static void main(String[] args) {
        new Thread(new TcpIp1("localhost",8888,5555)).start();
        new Thread(new TcpIp2(9999,"xuesheng")).start();
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值