导航:首页 > IDC知识 > javaudp服务器

javaudp服务器

发布时间:2021-03-27 07:25:33

1、用JAVA如何实现UDP端口扫描器?

使用 DatagramSocket(int port) 建立socket(套间字)服务。
将数据打包到DatagramPacket中去
通过socket服务发送 (send()方法)
关闭资源

public static void main(String[] args) {

DatagramSocket ds = null; //建立套间字udpsocket服务

try {
ds = new DatagramSocket(8999); //实例化套间字,指定自己的port
} catch (SocketException e) {
System.out.println("Cannot open port!");
System.exit(1);
}

byte[] buf= "Hello, I am sender!".getBytes(); //数据
InetAddress destination = null ;
try {
destination = InetAddress.getByName("192.168.1.5"); //需要发送的地址
} catch (UnknownHostException e) {
System.out.println("Cannot open findhost!");
System.exit(1);
}
DatagramPacket dp =
new DatagramPacket(buf, buf.length, destination , 10000);
//打包到DatagramPacket类型中(DatagramSocket的send()方法接受此类,注意10000是接受地址的端口,不同于自己的端口!)

try {
ds.send(dp); //发送数据
} catch (IOException e) {
}
ds.close();
}
}

接收步骤:

使用 DatagramSocket(int port) 建立socket(套间字)服务。(我们注意到此服务即可以接收,又可以发送),port指定监视接受端口。
定义一个数据包(DatagramPacket),储存接收到的数据,使用其中的方法提取传送的内容
通过DatagramSocket 的receive方法将接受到的数据存入上面定义的包中
使用DatagramPacket的方法,提取数据。
关闭资源。

import java.net.*;

public class Rec {

public static void main(String[] args) throws Exception {

DatagramSocket ds = new DatagramSocket(10000); //定义服务,监视端口上面的发送端口,注意不是send本身端口

byte[] buf = new byte[1024];//接受内容的大小,注意不要溢出

DatagramPacket dp = new DatagramPacket(buf,0,buf.length);//定义一个接收的包

ds.receive(dp);//将接受内容封装到包中

String data = new String(dp.getData(), 0, dp.getLength());//利用getData()方法取出内容

System.out.println(data);//打印内容

ds.close();//关闭资源
}
}

希望能够帮助到你,望采纳!

2、用java.net进行UDP编程服务器端和客户端的流程是怎样的?

服务器端:
import java.io.*;
import java.net.*;
import java.applet.Applet;
public class TalkServer{
public static void main(String args[]) {
try{
ServerSocket server=null;
try{
server=new ServerSocket(4700);
}catch(Exception e) {
System.out.println("can not listen to:"+e);
}
Socket socket=null;
try{
socket=server.accept();
}catch(Exception e) {
System.out.println("Error."+e);
}
String line;
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter os=new PrintWriter(socket.getOutputStream());
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
System.out.println("Client:"+is.readLine());
line=sin.readLine();
while(!line.equals("bye")){
os.println(line);
os.flush();
System.out.println("Server:"+line);
System.out.println("Client:"+is.readLine());
line=sin.readLine();
}
os.close();
is.close();
socket.close();
server.close();
}catch(Exception e){
System.out.println("Error:"+e);
}
}
}

客户端:
import java.io.*;
import java.net.*;
public class TalkClient {
public static void main(String args[]) {
try{
Socket socket=new Socket("127.0.0.1",4700);
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
PrintWriter os=new PrintWriter(socket.getOutputStream());
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String readline;
readline=sin.readLine(); //从系统标准输入读入一字符串
while(!readline.equals("bye")){
os.println(readline);
os.flush();
System.out.println("Client:"+readline);
System.out.println("Server:"+is.readLine());
readline=sin.readLine(); //从系统标准输入读入一字符串
}
os.close(); //关闭Socket输出流
is.close(); //关闭Socket输入流
socket.close(); //关闭Socket
}catch(Exception e) {
System.out.println("Error"+e); //出错,则打印出错信息
}
}
}

3、为什么JAVA中的UDP协议的服务器端和客户端运行出来时间后面有框框?

下回来最好把图片拍清楚点,根本自看不清你的代码。输出的信息后面有乱码,一般都是有无效数据导致的,猜测是你开的buffer太大了,udp消息没有填满它,你也没有判断receive的数据长度就把整个buffer全输出了,所以后面会有一块无效数据形成乱码。

4、客户端使用UDP协议不停的向服务器发送数据,Java这边需要存储这些数据并进行处理,如何监控这个数据?

2个方法,设复置2个变量分制别记载当前处理的queue下标A,(假设你的queue是结构体数组长度200),还有个表量记载还没有操作的总数B。
1.保证每个数据都接收。即时没有处理完也接收,循环加,从0-199再循环,另一个线程处理,从当前标记A开始往下处理,没处理完一个A+1 B-1,接收线程没接收一个B+1,B一直循环,QUEUE[B]接收数据,一定要注意,这2个变量和你的数组要加锁,防止2个线程同时被修改
2.保证处理,如果没处理完就不接收,加到B到上限就停止,但数据也是循环的存储,其他方法和上面一样,就是要注意加锁
以上说的方法是数据先进先出,如果想做先进后出的话,就每次处理当前A的数据,然后向前回溯就可以了

5、Java编写基于udp的多人聊天程序,服务器接受一人信息后,怎么实现把该信息发送给所有人?

把连接过来的session存起来,群发的时候遍历发过去

6、Java的udp客户、服务器通信,有界面,用ip地址连接,服务器能保存通信的信息到一个文件夹

服务端和客户端代码:
public class Main {
public static void main(String[] args) throws Exception {

UDPServer server = new UDPServer();
server.start(6666, "logs/udpserver.txt");
Thread.sleep(500);
UDPClient client = new UDPClient();
client.start(6666);
for(int i = 0; i < 10; i++) {
client.send("Hello: " + i + "\n");
}
client.stop();
Thread.sleep(500);
server.stop();
}
}

class UDPServer implements Runnable{

private DatagramSocket ds;

private boolean running = false;

private Thread thread = null;

private FileOutputStream fos;

public void start(int port, String logFilename) throws Exception{
if(!running) {
running = true;
ds = new DatagramSocket(new InetSocketAddress("127.0.0.1", 6666));
fos = new FileOutputStream(logFilename);
thread = new Thread(this);
thread.start();
}
}

@Override
public void run() {
while(running) {
try {
byte[] buf = new byte[2048];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
ds.setSoTimeout(500);
try {
ds.receive(dp);
fos.write(dp.getData(), 0, dp.getLength());
} catch (SocketTimeoutException e) {
}
} catch (IOException e) {
e.printStackTrace();
break;
}
}
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
ds.close();
}

public void stop() {
if(running) {
running = false;
thread.interrupt();
}
}
}

class UDPClient{

private DatagramSocket ds;

public void start(int port) throws Exception{
ds = new DatagramSocket(0);
ds.connect(new InetSocketAddress("127.0.0.1", 6666));
}

public void send(String message) {
byte[] data = message.getBytes();
DatagramPacket dp = new DatagramPacket(data, data.length);
try {
ds.send(dp);
} catch (IOException e) {
e.printStackTrace();
}
}

public void stop() {
if (ds != null) {
ds.close();
}
}
}
界面代码你自己写吧

7、请问各位大神,Java中如何获取UDP服务端接收到数据包时的时间

服务端 每次接收完成后生成一个时间不行么?

long ctm = System.currentTimeMillis();

8、关于java udp编程的小问题,好像服务器和客户端都收不到

接收和发送的数据包,没有实例化。

inPacket=new DatagramPacket(inBuff,DATE_LEN);
outPacket=new DatagramPacket(outBuff,DATE_LEN);
并且
System.out.println(new String(inBuff.toString()));
写成
System.out.println(new String(inBuff);
程序还有很多可以优化的地方。

9、JAVA用udp从本地网络穿透到公网之后,从其他网络作为客户端发送udp包到服务器正常接收。

你说的还不清楚。baiduJava网络编程使用Socket,同为一个网络下的主机时是肯定没问题的,不版论同一局域权网或广域网。如果内网跨越网关,我没做过试验,按我的理解,内网主机做客户端,独立主机做服务器应该可行,反之不行。

与javaudp服务器相关的知识