java网络编程-双机通信

UDP双机通信

双机通信本案例就是双方可以互相发信息。
没有真正意义上的Client和Service。因为,我把这两部分代码写的大差不差。
其中设计到知识还是不少的。
Client和Service我为他们分别创建了两个线程。一个接受信息的线程。和一个发送信息的线程。
线程通过实现Runnable接口。
为了做区分,我还是为双方起名吧。
我们先看看Client的代码。

package com.itheima.netUDP;

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

public class ClientDemo2 {
    
    
    public static void main(String[] args) throws IOException {
    
    
        int Client_port =8866;
        int Service_port=8888;
        DatagramSocket socket = new DatagramSocket(Client_port);
        Runnable sendtask = new sendThread(socket,Service_port);
        Thread send_thread = new Thread(sendtask);
        Runnable revicetask=new serviceThread(socket,Service_port);
        Thread reviceThread = new Thread(revicetask);
        send_thread.start();
        reviceThread.start();
    }
}

细节啊,两个线程只创建了一个socket管道。目前没有出问题哈。


看看Service的代码,是不是一样滴。

package com.itheima.netUDP;

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


public class ServiceDemo2 {
    
    
    public static void main(String[] args) throws IOException {
    
    
        int Client_port =8888;
        int Service_port=8866;
        DatagramSocket socket = new DatagramSocket(Client_port);
        Runnable sendtask = new sendThread(socket,Service_port);
        Thread send_thread = new Thread(sendtask);
        Runnable revicetask=new serviceThread(socket,Service_port);
        Thread reviceThread = new Thread(revicetask);
        send_thread.start();
        reviceThread.start();
    }
}

接下来就是线程类。

package com.itheima.netUDP;

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

public class sendThread implements Runnable {
    
    
    private DatagramSocket socket;
    private int port;

    public sendThread(DatagramSocket socket, int port) {
    
    
        this.socket = socket;
        this.port = port;
    }

    @Override
    public void run() {
    
    
        while (true) {
    
    
            Scanner sc = new Scanner(System.in);
            String message = sc.nextLine();
            byte[] buffer = message.getBytes();
            try{
    
    
                DatagramPacket sendPacket  = new DatagramPacket(buffer, buffer.length,
                        InetAddress.getLocalHost(), port);
                socket.send(sendPacket);
            } catch (IOException e) {
    
    
                throw new RuntimeException(e);
            }
        }
    }
}

通过不停的检测输入,一有输入就发送。


接受线程

package com.itheima.netUDP;

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

public class serviceThread implements Runnable {
    
    
    private DatagramSocket socket;
    private int port;

    public serviceThread(DatagramSocket socket, int port) {
    
    
        this.socket = socket;
        this.port = port;
    }

    @Override
    public void run() {
    
    
        while (true) {
    
    
            byte[] buffer = new byte[1024];
            try {
    
    
                DatagramPacket recevicePacket = new DatagramPacket(buffer, buffer.length, InetAddress.getLocalHost(), port);
                socket.receive(recevicePacket);
                int length = recevicePacket.getLength();

                String message = new String(buffer, 0, length);
                System.out.println(Thread.currentThread().getName()+":"+message);
            } catch (IOException e) {
    
    
                throw new RuntimeException(e);
            }
        }
    }
}

也是不停的检测,一接受到数据,就显示出来。
看一下效果哈。
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zmm0628/article/details/127112850