62,625
社区成员
发帖
与我相关
我的任务
分享
package com.udp;
import java.io.IOException;
import java.net.DatagramSocket;
public class Start {
public static void main (String[] args) throws IOException {
DatagramSocket dsReceive = new DatagramSocket(2020);
UDPServer rt= new UDPServer(dsReceive);
Thread t1 = new Thread(rt);
t1.start();
}
}
package com.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPServer implements Runnable {
private DatagramSocket socket;
// 创建接收和发送UDP的Socket实例
public UDPServer(DatagramSocket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
while (true) {
byte[] data = new byte[1024];
DatagramPacket request = new DatagramPacket(data,data.length);
socket.receive(request); //接受UDP数据包
System.out.println("Addr:"+request.getAddress()+"port:"+request.getPort());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // 接受UDP数据包
}
}
package com.tcptest;
import java.io.IOException;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.charset.Charset;
import java.util.Iterator;
import com.tcptest.Server;
public class start {
static DatagramChannel channel;
static Selector selector;
public static void main (String[] args) throws IOException {
try
{
// 打开一个UDP Channel
channel = DatagramChannel.open();
channel.socket().setReuseAddress(true);//允许绑定同一个端口
// 设定为非阻塞通道
channel.configureBlocking(false);
// 绑定端口
channel.socket().bind(new InetSocketAddress(8080));
// 打开一个选择器
selector = Selector.open();
channel.register(selector, SelectionKey.OP_READ);
} catch (Exception e)
{
e.printStackTrace();
}
Server rt= new Server(selector);
Thread t1 = new Thread(rt);
t1.start();
System.out.println("请输入:");
while(true){
char val = (char)System.in.read();
System.out.println("Your char is :" + val + "\r");
}
}
下面是Server.class
package com.tcptest;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.util.Iterator;
public class Server implements Runnable {
DatagramChannel channel;
Selector selector;
public Server(Selector selector) {
this.selector = selector;
}
@Override
public void run() {
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
while (true)
{
try
{
// 进行选择
int n = selector.select();
if (n > 0)
{
// 获取以选择的键的集合
Iterator iterator = selector.selectedKeys().iterator();
while (iterator.hasNext())
{
SelectionKey key = (SelectionKey) iterator.next();
// 必须手动删除
iterator.remove();
key.isWritable();
if (key.isReadable())
{
DatagramChannel datagramChannel = (DatagramChannel) key
.channel();
byteBuffer.clear();
// 读取
InetSocketAddress address = (InetSocketAddress) datagramChannel
.receive(byteBuffer);
int length = byteBuffer.position();
int i;
byte rec[]=new byte[length];
for (i=0;i<length;i++)
{
rec[i]=byteBuffer.get(i);
}
// 删除缓冲区中的数据
byteBuffer.clear();
byteBuffer.put(rec);
byteBuffer.flip();
// 发送数据
datagramChannel.send(byteBuffer, address);
}
}
}
} catch (Exception e)
{
e.printStackTrace();
}
}
}
}