導航:首頁 > 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伺服器相關的知識