qq_34475098 2017-11-26 11:26 采纳率: 0%
浏览 1253

关于java的UDP通信问题。。。。。。。

我建立了两个客户端和一个服务端,一个客户端发消息给服务器,然后服务器转发给另一个客户端。问题是这样的,客户端1发了一个消息1给服务器然后转发给客户端2,然后这时候要是客户端2要给客户端1发个消息2的话,客户端1却是收到刚刚发出去的消息1,客户端2再发消息的时候就正常了,消息2不知道哪里去了,调试的时候客户端2发的消息2是有传送到服务器的,可是服务器再发出去的时候就变了
图片说明

服务器程序:
import java.net.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.*;
import java.sql.*;

public class UDPServerService {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) throws SQLException {
    // TODO code application logic here
   // if(args.length<1)
    // {
    // System.out.println("请输入用于mail服务的本地端口号");
    //    System.exit(0);
   // }
     int i=8000;
   //  String s=Integer.toString(i);
     UDPServerThread myUDPServer=new UDPServerThread(8000);//创建邮件服务器监听线程
     myUDPServer.init();
     Thread th=new Thread(myUDPServer);
    th.start();
}

}
class UDPServerThread extends Frame implements Runnable
{
private DatagramSocket UDPServerSocket=null,UDPServerSocket1=null;
PreparedStatement ps;
TextArea ta=new TextArea(10,50);
JButton close;
Connection con;
Statement stmt;
ResultSet rs;
String sql;
int flag=0;
int ports;
void init(){
close=new JButton("close");
setTitle("服务监听器");
setSize(400,300);
setLayout(new FlowLayout());
add("center",ta);
add(close);
close.addActionListener(new Close());
setVisible(true);

}
UDPServerThread(int Port){

ports=Port;
try{
UDPServerSocket=new DatagramSocket(Port);
UDPServerSocket1=new DatagramSocket(Port+1);
ta.append("邮件服务监听器在端口"+UDPServerSocket.getLocalPort()+"\n");
}catch(Exception e){
System.err.println(e);
}
}

public void run(){

if(UDPServerSocket==null)
return;
while(true){
try{

    byte[] dataBuf=new byte[512];
    DatagramPacket ServerPacket;
    InetAddress remoteHost;

    int remotePort;
    String datagram,s;

    ServerPacket =new DatagramPacket(dataBuf,512);
    UDPServerSocket.receive(ServerPacket);//接受
    remoteHost=ServerPacket.getAddress();
    remotePort=ServerPacket.getPort();

    datagram=new String(ServerPacket.getData());

       String sql="SELECT * FROM biao1";
 try{
 Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
con=DriverManager.getConnection("jdbc:ucanaccess://D:\\access\\db1.mdb","","");
stmt=con.createStatement();
rs=stmt.executeQuery(sql);

}catch(Exception e1){
e1.printStackTrace();
} 
 if(datagram.contains("#dl#")){
 while(rs.next()){                         //验证帐号密码是否正确
    if((datagram.indexOf(rs.getString("username"))!=-1)&&(datagram.indexOf(rs.getString("password")))!=-1){
       String pass="connect";
       dataBuf=pass.getBytes();
       ServerPacket=new DatagramPacket(dataBuf,dataBuf.length,remoteHost,remotePort);
       UDPServerSocket.send(ServerPacket);
        ta.append("用户"+remoteHost+"已登录"+'\n');
       flag=1;
       sql="UPDATE biao1 SET connection=?  WHERE username=?";        
       ps=con.prepareStatement(sql);
       ps.setInt(1,1);
       ps.setString(2, rs.getString("username"));
       ps.executeUpdate();                                            //表1中设置该用户为在线状态
       sql="UPDATE biao1 SET remoteHost=?  WHERE username=?";
       ps=con.prepareStatement(sql);

       ps.setString(1,remoteHost.toString());
       ps.setString(2, rs.getString("username"));
       ps.executeUpdate();                                             
       sql="UPDATE biao1 SET remotePort=?  WHERE username=?";
       ps=con.prepareStatement(sql);
       ps.setInt(1, remotePort);     

       ps.setString(2, rs.getString("username"));
       ps.executeUpdate();                                           //修改表中用户的登录地址,登录端口

       con.commit();
       con.close();

    }



 }
 if(flag==0){
     String lost="lost";
    dataBuf=lost.getBytes();
       ServerPacket=new DatagramPacket(dataBuf,dataBuf.length,remoteHost,remotePort);
       UDPServerSocket.send(ServerPacket);

 }
 }
    else{
     sql="SELECT * FROM biao1";
     ResultSet rt;
    rt=stmt.executeQuery(sql);
    int port=0;
    //ta.append('\n'+"收到如下主机发来的邮件"+remoteHost.getHostName()+":\n"+datagram);
    while(rt.next()){

        if(datagram.indexOf(rt.getString("username"))!=-1){
            if(rt.getString("connection").indexOf("1")!=-1){

                InetAddress remoteHost1=InetAddress.getByName(rt.getString("remoteHost").substring(1));

                int remotePort1=rt.getInt("remotePort");
                 port=remotePort1+1;
                 dataBuf=new byte[512];
               dataBuf=datagram.getBytes();
               System.out.print(datagram);
               ServerPacket=new DatagramPacket(dataBuf,dataBuf.length,remoteHost1,port);
               UDPServerSocket1.send(ServerPacket);

            }
            else{
              datagram=new String("unconnect.");
              dataBuf=new byte[512];
              //remoteHost=InetAddress.getByName("QH-20150828KDPO");

              dataBuf=datagram.getBytes();
              ServerPacket=new DatagramPacket(dataBuf,dataBuf.length,remoteHost,remotePort);
              UDPServerSocket.send(ServerPacket);

            }

    }

    }

 }


 }catch(Exception e){
 System.err.println(e);
 }

}

}

protected void finalize(){
if(UDPServerSocket!=null){
UDPServerSocket.close();
UDPServerSocket=null;
ta.append("关闭服务器端的数据报连接!");
}

}

}

class Close implements ActionListener{
public void actionPerformed(ActionEvent e){
System.exit(0);
}

}

客户端程序:

import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import static java.lang.Thread.sleep;
import java.util.Scanner;
import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
public class UDPClientService1 {

/**
 * @param args the command line arguments
 */
public static void main(String[] args){
    // TODO code application logic here
     Dl d=new Dl(args);

}
}
class UDPClientService extends Frame implements ActionListener,Runnable{
DatagramSocket UDPClientSocket;
DatagramPacket ClientPacket;
InetAddress remoteHost;
int remotePort;
byte[] dataBuf;
String datagram;
private String send="";
String args[]=new String[3];
Scanner in;
TextArea ta_receive=new TextArea(10,60),ta_send=new TextArea(5,60);
JButton ok=new JButton("ok"),close =new JButton("close"),test=new JButton("test");
JPanel p3=new JPanel(),p1=new JPanel(),p2=new JPanel();

void Init_Frame(){
    setTitle("服务器端口1");
   setSize(500,450);
   setLayout(new BorderLayout());

   ta_receive.setEditable(false);
   ta_send.requestFocus();
   add(p1,BorderLayout.NORTH);
   add(p2,BorderLayout.CENTER);
   add(p3,BorderLayout.SOUTH);
   p1.add(ta_receive);
   p2.add(ta_send);
   p3.add(ok);
   p3.add(close);
   p3.add(test);
   ok.addActionListener(this);
   close.addActionListener(this);
   test.addActionListener(this);
   setVisible(true);


}

void Init(String args[]){
this.args=args;
if(args.length<3){
ta_receive.append("请输入本地端口号,远程服务器主机号及端口名");
System.exit(0);

}

try{

UDPClientSocket =new DatagramSocket(Integer.valueOf(args[0])+1);

remoteHost=InetAddress.getByName(args[1]);
remotePort=Integer.parseInt(args[2]);


}catch(Exception e){
System.err.println(e);
}

}
public void run(){
while(true){
try {
dataBuf=new byte[512];
ClientPacket=new DatagramPacket(dataBuf,512);
UDPClientSocket.receive(ClientPacket);//接受
datagram=new String(ClientPacket.getData());
System.out.print(datagram);
ta_receive.append('\n'+"Server:"+'\n');
ta_receive.append(" "+datagram+'\n');

     } catch (IOException ex) {
         Logger.getLogger(UDPClientService.class.getName()).log(Level.SEVERE, null, ex);
     }

}
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==ok){
try{

        in=new Scanner(ta_send.getText());
        //int port=Integer.valueOf(args[0])+2;
        ta_receive.append('\n'+"Client:"+'\n'+""+ta_send.getText()+'\n'+'\n');
       // UDPClientSocket1 =new DatagramSocket(port);

        datagram=send+in.nextLine();

        dataBuf=datagram.getBytes();
        ClientPacket=new DatagramPacket(dataBuf,dataBuf.length,remoteHost,remotePort);
        UDPClientSocket.send(ClientPacket);//发送
    ta_send.setText("");


    }catch(IOException e1){
        System.err.println(e1);
    }

}
else if(e.getSource()==close){

 dispose();
 System.exit(0);
}
else if(e.getSource()==test){
send="lijing";
}

}
}

class Dl extends Frame implements ActionListener{
JTextField t1=new JTextField(10),t2=new JTextField(10);
JButton ok=new JButton("ok"),close=new JButton("close");
JLabel l=new JLabel("tips"),username1=new JLabel("username"),password1=new JLabel("password");
String args[]=new String[3];
Panel p1=new Panel(),p2=new Panel(),p3=new Panel(),p4=new Panel();
private String name,password,s;
DatagramSocket UDPClientSocket;
DatagramPacket ClientPacket;
InetAddress remoteHost;
int remotePort;
byte[] dataBuf;
String datagram;
String flags="#dl#";
Dl(String args[]){
this.args=args;

 try{
 UDPClientSocket =new DatagramSocket(Integer.parseInt(args[0]));
 remoteHost=InetAddress.getByName(args[1]);
 remotePort=Integer.parseInt(args[2]);
 }catch(Exception e){
System.err.println(e);
}
setLayout(new BorderLayout());

setSize(200,150);
p1.add(username1);
p1.add(t1);
p1.add(password1);
p1.add(t2);
p1.add(ok);
p1.add(close);
p2.add(l);
add(p1,BorderLayout.CENTER);
add(p2,BorderLayout.SOUTH);

ok.addActionListener(this);
close.addActionListener(this);
setVisible(true);

}
public void actionPerformed(ActionEvent e){
if(e.getSource()==ok){
try{

name=t1.getText();
password=t2.getText();
s=flags+name+password;
dataBuf=s.getBytes();
 ClientPacket=new DatagramPacket(dataBuf,dataBuf.length,remoteHost,remotePort);
 UDPClientSocket.send(ClientPacket);//发送

  dataBuf=new byte[512];
  ClientPacket=new DatagramPacket(dataBuf,512);
  UDPClientSocket.receive(ClientPacket);//接受
  datagram=new String(ClientPacket.getData());

  if(datagram.contains("connect")){
   UDPClientService ucs=new UDPClientService();
    ucs.Init_Frame();
    ucs.Init(args);
    setVisible(false);
    Thread th=new Thread(ucs);
   th.start();
  }
  else{
  l.setText("error!!");

  }


 }catch(IOException e1){
     System.err.println(e1);
 }

}
else if(e.getSource()==close){

    dispose();
    System.exit(0);

}

}
}

  • 写回答

1条回答 默认 最新

  • COCO_AS 2017-11-26 13:00
    关注

    你的代码在哪里?没有代码要排错,难度太大了吧?

    评论

报告相同问题?

悬赏问题

  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示