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);
}
}
}
}
也是不停的检测,一接受到数据,就显示出来。
看一下效果哈。