一个关于java数据报做的简单聊天的问题

数据只能从Client端发送到Server端,Server端发送到Client端不仅重复发送,而且Client端貌似接收不到,请问问题出在哪里,怎么解决? PS:希望能在Client端之间聊天 :) [code="java"] public class Server extends JFrame implements Runnable { final static int MEMBER_COUNT = 2,PORT_NUMBER =5000;//最大连接数目 private JTextArea displayArea; // displays packets received private DatagramSocket socket; // socket to connect to client Member[] members; int number = 0;//已经连接到的client数目 // 创建 GUI 和 DatagramSocket public Server() { super( "Server" ); members =new Member[Server.MEMBER_COUNT]; displayArea = new JTextArea(); // create displayArea add( new JScrollPane( displayArea ), BorderLayout.CENTER ); setSize( 400, 300 ); // set size of windows this.addWindowListener(new WindowAdapter(){ @Override public void windowClosing(WindowEvent e) { // TODO Auto-generated method stub socket.close(); } }); setVisible( true ); // show window try // create DatagramSocket for sending and receiving packets { socket = new DatagramSocket( Server.PORT_NUMBER ); } // end try catch ( SocketException socketException ) { socketException.printStackTrace(); System.exit( 1 ); } // end catch } // end Server constructor //连接到服务器 public boolean connectTo(InetAddress address) { for(int i=0;i<server.member_count if members new member number this.displaymessage return true false private boolean isfirst a for i="0;i&lt;Server.MEMBER_COUNT;i++)" public void waitforpackets while try receive packet display contents copy to client byte data set up datagrampacket receivepacket="new" data.length socket.receive wait this.connectto system.out.printf string sendpackettoclient send end catch ioexception displaymessage ioexception.tostring ioexception.printstacktrace method echo throws create sendpacket receivepacket.getlength socket.send manipulates displayarea in the event-dispatch thread final messagetodisplay swingutilities.invokelater runnable run updates displayarea.append message anonymous inner class call todo auto-generated stub server extends jframe implements jtextfield enterfield entering messages jtextarea displaying datagramsocket socket connect name gui and myname super here enterfield.addactionlistener actionlistener actionperformed actionevent event get from textfield message.getbytes convert bytes inetaddress.getlocalhost enterfield.settext addactionlistener add borderlayout.north jscrollpane borderlayout.center setsize window size setvisible show sending receiving packets socketexception socketexception.printstacktrace system.exit constructor arrive system.out.println ok receivepacket.getdata exception exception.tostring exception.printstacktrace int port inetaddress address this.port="port;" this.address="address;" servertest static main args application="new" client1="new" executorservice e="Executors.newFixedThreadPool(3);" e.execute></server.member_count>


问题补充:代码太乱了- -再发一遍
public class Server extends JFrame implements Runnable
{
final static int MEMBER_COUNT = 2,PORT_NUMBER =5000;//最大连接数目
   private JTextArea displayArea; // displays packets received
   private DatagramSocket socket; // socket to connect to client
   Member[] members;
   int number = 0;//已经连接到的client数目
   // 创建 GUI 和 DatagramSocket
   public Server()
   {
      super( "Server" );
      members =new Member[Server.MEMBER_COUNT];
      displayArea = new JTextArea(); // create displayArea
      add( new JScrollPane( displayArea ), BorderLayout.CENTER );
      setSize( 400, 300 ); // set size of windows
      this.addWindowListener(new WindowAdapter(){

@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
socket.close();
}

      });
      setVisible( true ); // show window

      try // create DatagramSocket for sending and receiving packets
      {
         socket = new DatagramSocket( Server.PORT_NUMBER );
      } // end try
      catch ( SocketException socketException )
      {
         socketException.printStackTrace();
         System.exit( 1 );
      } // end catch
   } // end Server constructor
   //连接到服务器
   public boolean connectTo(InetAddress address)
   {
for(int i=0;i<Server.MEMBER_COUNT;i++)
{
if(members[i]==null)
{
members[i] = new Member(Server.PORT_NUMBER,address);
number++;
this.displayMessage("连接成功");
return true;//连接成功
}
}
return false;//连接失败
   }
   private boolean isFirst(InetAddress a)//是否存在这个ip
   {
   for(int i=0;i<Server.MEMBER_COUNT;i++)
   {
   if(members[i]!=null&&a.equals(members[i].address)) return false;//已经存在
   }
   return true;//是第一次发送
   }
   // 等待接收并将接收到的包发送
   public void waitForPackets()
   {
      while ( true )
      {
         try // receive packet, display contents, return copy to client
         {
            byte data[] = new byte[ 100 ]; // set up packet
            DatagramPacket receivePacket =
               new DatagramPacket( data, data.length );

            socket.receive( receivePacket ); // wait to receive packet
     
            if(isFirst(receivePacket.getAddress()))//第一次发送
            this.connectTo(receivePacket.getAddress());//连接
            System.out.printf("send \"%s\" to client\n", new String(receivePacket.getData(),
            0,receivePacket.getLength()));
            sendPacketToClient( receivePacket ); // send packet to client
         } // end try
         catch ( IOException ioException )
         {
            displayMessage( ioException.toString() + "\n" );
            ioException.printStackTrace();
         } // end catch
      } // end while
   } // end method waitForPackets

   // echo packet to client
   private void sendPacketToClient( DatagramPacket receivePacket )
      throws IOException
   {


      // create packet to send
      DatagramPacket sendPacket;
      for(int i=0;i<Server.MEMBER_COUNT;i++)
      {
      if(members[i]!=null)
      {
      sendPacket = new DatagramPacket(receivePacket.getData(),
      receivePacket.getLength(),members[i].address,members[i].port);
      socket.send( sendPacket );
      }
      }  // send packet to client

   } // end method sendPacketToClient

   // manipulates displayArea in the event-dispatch thread
   private void displayMessage( final String messageToDisplay )
   {
      SwingUtilities.invokeLater(
         new Runnable()
         {
            public void run() // updates displayArea
            {
               displayArea.append( messageToDisplay ); // display message
            } // end method run
         } // end anonymous inner class
      ); // end call to SwingUtilities.invokeLater
   } // end method displayMessage
@Override
public void run()
{
// TODO Auto-generated method stub
waitForPackets();
}

} // end class Server
public class Client extends JFrame implements Runnable
{
   private JTextField enterField; // for entering messages
   private JTextArea displayArea; // for displaying messages
   private DatagramSocket socket; // socket to connect to server
   String name;
   // set up GUI and DatagramSocket
   public Client(String myname)
   {
      super( myname );
      name = myname;
      enterField = new JTextField( "Type message here" );
      enterField.addActionListener(
         new ActionListener()
         {
            public void actionPerformed( ActionEvent event )
            {
               try // create and send packet
               {
                  // get message from textfield
                  String message = event.getActionCommand();
             
                  byte data[] = message.getBytes(); // convert to bytes
        
                  // create sendPacket
                  DatagramPacket sendPacket = new DatagramPacket( data,
                     data.length, InetAddress.getLocalHost(), 5000 );
                  System.out.printf("send to server\"%s\"\n", new String(sendPacket.getData(),0,sendPacket.getLength()));
                  socket.send( sendPacket ); // send packet
                  enterField.setText("");
               } // end try
               catch ( IOException ioException )
               {
                  displayMessage( ioException.toString() + "\n" );
                  ioException.printStackTrace();
               } // end catch
            } // end actionPerformed
         } // end inner class
      ); // end call to addActionListener

      add( enterField, BorderLayout.NORTH );

      displayArea = new JTextArea();
      add( new JScrollPane( displayArea ), BorderLayout.CENTER );

      setSize( 400, 300 ); // set window size
      setVisible( true ); // show window

      try // create DatagramSocket for sending and receiving packets
      {
         socket = new DatagramSocket();
      } // end try
      catch ( SocketException socketException )
      {
         socketException.printStackTrace();
         System.exit( 1 );
      } // end catch
   } // end Client constructor

   // wait for packets to arrive from Server, display packet contents
   public void waitForPackets()
   {

      while ( true )
      {
         try // receive packet and display contents
         {
            byte data[] = new byte[ 100 ]; // set up packet
            DatagramPacket receivePacket = new DatagramPacket(
               data, data.length );

            socket.receive( receivePacket ); // wait for packet
            System.out.println("receive from server ok");
            // display packet contents
            displayMessage(new String( receivePacket.getData(),
                  0, receivePacket.getLength() ) );
         } // end try
         catch ( IOException exception )
         {
            displayMessage( exception.toString() + "\n" );
            exception.printStackTrace();
         } // end catch
      } // end while
   } // end method waitForPackets

   // manipulates displayArea in the event-dispatch thread
   private void displayMessage( final String messageToDisplay )
   {
      SwingUtilities.invokeLater(
         new Runnable()
         {
            public void run() // updates displayArea
            {
               displayArea.append( messageToDisplay );
            } // end method run
         }  // end inner class
      ); // end call to SwingUtilities.invokeLater
   } // end method displayMessage

@Override
public void run() {
// TODO Auto-generated method stub
waitForPackets();
}
}  // end class Client
public class Member
{
int port;//端口号码
InetAddress address;//地址
Member(int port,InetAddress  address)
{
this.port = port;
this.address = address;
}
}
public class Member
{
int port;//端口号码
InetAddress address;//地址
Member(int port,InetAddress  address)
{
this.port = port;
this.address = address;
}
}

回答: 一个关于java数据报做的简单聊天的问题

  1. Server.connetTo方法不对啊
    members[i] = new Member(Server.PORT_NUMBER, address);
    这里每个member的端口都是5000?显然不对了。这样等于server不停地在给自己5000端口发,再收,再发,死循环了。
    第一次client创建连接时,可以把自己的ip和端口先发给server。

一个初学java问题,很简单的

  1. Q
    import java.util.Scanner;
    public class Za {
    private static final double sum = 0;
    public static void main(String[] args) {
            int score[]=new int[5];        
            int sum=0;       
            for (int i = 0; i < score.length; i++) {        
    System.out.println("请输入成绩:");
    Scanner input = new Scanner(System.in);
    score[i] = input.nextInt();
    sum=sum+score[i];
    }        
            System.out.println("平均分为:"+sum/5.0);
    }


    }
       为什么上面那个int sum=0放在for(;;)里面就会出错,有什么不同吗?for(int i ,sum=0;~;~)
  2. A
    你这里面有两个问题
    1.变量定义问题
    int i,sum=0;这条语句等同于
    int i;
    int sum=0;
    两条语句,显然变量i没有初值,而后面的判断i<10又用到了i,所以报错。
    解决这个问题的方法是:
    int i=0,sum=0;

    2.即便按照上面的定义,程序依然报错,原因是你在for循环外面用到了sum
    System.out.println("平均分为:"+sum/5.0);
    在Java中局部变量的范围,以代码块为准,也就是说,你在for循环之内定义的变量只能在里面用,而sum变量需要在for循环之外使用,因此,要得出结果,就不能将sum定义到for里面,正确的程序就是LZ发上来的这段。

java可以做一个软件让手机与pc视频通讯吗?

  1. Q
    java可以做一个软件让手机与pc视频通讯吗?如果可以,使用什么技术呢,哪个方向
  2. A
    wap j2me的socket ws好多了 呵呵

做个简单的测试,涉及到我们对待框架的态度

  1. Q
    struts1好像不再被人提起,但是他的伟大是不可磨灭的。在struts1的配置文件中,这一段配置估计大家到死都忘不了:
    <action path="/login" name="loginform"  type="action.login.LoginAction" scope="request">
    我的测试题目是为什么<action>标签的name属性的名字是name,而不是诸如form、actionform之类的。

    我就此问题问过好几个人,答案都是"诡异、无法理解"。真的是诡异吗?老外定义名称可不是随便的。


    问题补充:
    唉,我是想就这个问题做一个调查,我的题目很清楚,是测试,“做个简单的测试,涉及到我们对待框架的态度”,不是提问。管理员给移到这里了,希望移回讨论区。name属性的名字是有意义的,能正确回答出来的说明对框架研究过,而不仅仅是使用。我个人对框架的看法是,除了使用框架外,我们还要研究一下框架,吸取框架的精华。从下面的回答来看,都没回答这正确,说明只限于使用。

    每一个框架都包含了很多优秀的思想,除了使用外,研究一下吧。
    问题补充:
    eastone (初级程序员) 2009-07-24 回答正确。

    struts的form标签没有name属性,这个难道没有引起大家的注意吗?
    action标签的name属性的值一方面是制定一个actionform,另一方面name属性的值将作为将作为输出的html的form的name的值,如果用了form标签的话。



    问题补充:
    咱不是在这钻牛角尖,只是想看看大家对框架的使用是一种什么态度。

    比如spring的配置问题,普通的依赖注入配置和sessionfactory的配置,配置方式一样,但思想却大不一样。
    还有spring的aop中,throw advisor的处理方式,等等
  2. A
    那东西跟html里面form的name是统一的吧。struts的action之所以要叫action,应该是因为从html提交过来的时候,form是制定提交到一个url,这个url的属性名叫做action。java这边的一个action也同样,跟那边的form对应。而html中form标签的名字叫name,而不是别的。这两个东西是对应的。

    还别说,貌似我没用过struts2,哈哈。老了老了。

JAVA连接oracle的简单的用swing实现界面的对表的增删改查的小实例

  1. Q


    一个JAVA连接oracle的简单的用swing实现界面的对表的增删改查的小实例。


    [email protected]
  2. A
    文件已发你邮箱

【网络】Docker给每一个启动的container指定一个ip, 这个如何做?

  1. Q
    Docker给每一个启动的container指定一个ip,  这个如何做? pipework 貌似只能在ubuntu下有效,求CentOS下的用法?

    该问题来自CSDN Docker技术交流群(303806405),由版主xinshubiao整理。
  2. A
    B: 给每个container分配一个ip方法
    宿主机配网桥,如


    /etc/sysconfig/network-scripts/ifcfg-eth1

    DEVICE='eth1'

    ONBOOT=yes
    BRIDGE=br1


    /etc/sysconfig/network-scripts/ifcfg-br1

    DEVICE='br1'

    TYPE=Bridge

    BOOTPROTO=staticONBOOT=yesIPADDR='xxx'

    NETMASK='xxx'

    GATEWAY='xxx'


    /etc/init.d/network  restart




    使用例子
    TESTID=$(docker run -d bangli/centos-sshd)
    ./pipework br1 $TESTID  10.10.1.10/[email protected]
    其中,子网掩码和默认网关需要根据实际情况指定。



    该解答来自CSDN Docker技术交流群(303806405),由版主xinshubiao整理,由于手工编辑,提问者和回答者的QQ号和昵称没有一一注明,只简单用ABCD代替提问或回复, A代表提问者。 在此,先对群里参加讨论的同学表示感谢。

有谁在java中做过事务处理(不是在EJB中)?

  1. Q
    请问哪位高手在java中做过事务处理(不是在EJB中)?
    请留几片代码!多谢!
  2. A
    to verybear(老熊):
    我们也差不多, 呵呵 ...
    不过ejb container就用的是JTA/JTS, 所以我想对中小型的应用, 是否可以考虑一个轻量级的实现 :)

JAVA程序做服务器,安卓程序做客户端,地址为127.0.0.1时服务器不能接收到数据

  1. Q
    JAVA程序做服务器,安卓程序做客户端,安卓模拟器上运行客户端,客户端上标注服务器的IP地址为127.0.0.1时服务器不能接收到数据。但是,如果IP为"ipconfig"命令里的IPv4地址就可以正常接收数据。请问,这是什么问题呢?
  2. A
    模拟器不能这样连本机,要用10.0.2.2

    模拟器是一个虚拟机,127.0.0.1/localhost都是他自己,好好理解一下吧

谁能给我一个用LoadRunner测试的很简单的例子呀

  1. Q
    谁能给我一个用LoadRunner测试的很简单的例子呀?
  2. A
    LR自带Sample,捏可以做参考!

做了一个小的程序,还有一个删除功能没做,实在做不出来,各位帮我加个,在此先谢谢了。程序如下

  1. Q
    做了一个小的程序,还有一个删除功能没做,实在做不出来,各位帮我加个,在此先谢谢了。程序如下email:[email protected] qq25096679
    import javax.microedition.midlet.*;
    import javax.microedition.lcdui.*;
    import java.io.*;
    import javax.microedition.rms.* ;
    public class MyGzb extends MIDlet implements CommandListener
    {
        private Display display;
        String dbname = "MyGzb" ;
        String dbgzrc="gzrcdb";
        String current = "" ;
        Form addForm = new Form("添加工作日程") ;
        
        TextField gzbxm=new TextField("姓名","",20,TextField.ANY);
        TextField gzbrq=new TextField("日期","",30,TextField.ANY);
        TextField gzbsj=new TextField("时间","",30,TextField.ANY);
        TextField gzbzhti=new TextField("主题","",200,TextField.ANY);
        public MyGzb() 
        {
            display = Display.getDisplay(this);
        }
        public void startApp() 
        {
    Command add = new Command("确定",Command.SCREEN,1) ;
    Command back = new Command("后退",Command.SCREEN,2) ;
            
    addForm.append(gzbxm) ;
    addForm.append(gzbrq) ;
            addForm.append(gzbsj);
            addForm.append(gzbzhti);
    addForm.addCommand(add) ;
    addForm.addCommand(back) ;
    addForm.setCommandListener(this) ;
    MainForm() ;

        }
       public void MainForm()
        {
    List l = new List("我的工作日程",Choice.IMPLICIT) ;
    l.append("工作日程列表",null) ;
    l.append("新增工作日程",null) ;
            l.append("删除工作日程",null);
            
    l.setCommandListener(this) ;
    current = "MainForm" ;
    display.setCurrent(l) ;
        }
       public void ListAllgzrcForm()
        {
    List l = new List("工作日程列表",Choice.EXCLUSIVE) ;
    Command back = new Command("后退",Command.SCREEN,2) ;
    l.addCommand(back) ;
            //listener1=(CommandListener)new GzrcListener();
    l.setCommandListener(this) ;
    RecordStore rs = openRSAnyway(dbname) ;
    if( rs == null )
    {
    //启动失败停止MIDlet
                    notifyDestroyed();
    }else
    {
    try
    {
    RecordEnumeration re = rs.enumerateRecords(null,null,false) ;
    GzrcData data = new GzrcData() ;
    if(re.numRecords() == 0)
    {
    l.append("没有任何数据",null) ;
    current = "ListAllgzrcForm" ;
    display.setCurrent(l) ;
    return ;
    }

    while(re.hasNextElement())
    {
    byte tmp[] = re.nextRecord() ;
    data.decode(tmp) ;
    l.append(data.name,null) ;
    }
    rs.closeRecordStore() ;
    }catch(Exception e)
    {
    }
    }
    Command info = new Command("详细",Command.SCREEN,1) ;
    l.addCommand(info) ;
    current = "ListAllgzrcForm" ;
    display.setCurrent(l) ;
        }


    /////////////////////////////////////////////////////
       public void AddgzrcForm()
       {    
            TextField gzbxm=new TextField("姓名","",20,TextField.ANY);
            TextField gzbrq=new TextField("日期","",30,TextField.ANY);
            TextField gzbsj=new TextField("时间","",30,TextField.ANY);
            TextField gzbzhti=new TextField("主题","",200,TextField.ANY);

            Command add= new Command("确定",Command.SCREEN,1) ;
    Command back= new Command("后退",Command.SCREEN,2) ;
                
           addForm.append(gzbxm) ;
    addForm.append(gzbrq) ;
            addForm.append(gzbsj);
            addForm.append(gzbzhti);
    addForm.addCommand(add) ;
    addForm.addCommand(back) ;
    addForm.setCommandListener(this) ;
           display.setCurrent(addForm);
        }
    /////////////////////////////////////////////////
        public void commandAction(Command c,Displayable s)    
        {    
    if(c == List.SELECT_COMMAND && current.equals("MainForm"))    
    {   
    List tmp = (List) s ;   
    switch(tmp.getSelectedIndex())
    {
    case 0 :
    ListAllgzrcForm() ;
    break ;
    case 1 :
    AddgzrcForm() ;
    break ;
                          // case 2:
                                   // GzrcForm();
                              //      break;
                          //case  3:
                            //     ListAllgzrcForm();
                             //    break;
    }       
    }    
    if(c.getLabel().equals("后退"))
    {
    MainForm() ;

    }
    if(c.getLabel().equals("确定"))
    {
    addgzrcData() ;
    ListAllgzrcForm() ;
    }
    if(c.getLabel().equals("详细"))
    {
    List tmp = (List) s ;
    searchgzrcData(tmp.getString(tmp.getSelectedIndex())) ;
    }
           

        }
    ////////////////////////////////////////////////////////
    public void addgzrcData()
        {
    GzrcData data = new GzrcData() ;
    data.name = gzbxm.getString() ;
    data.rq = gzbrq.getString() ;
            data.sj = gzbsj.getString();
            data.zhti=gzbzhti.getString();
    byte []tmp = data.encode() ;
    RecordStore rs = openRSAnyway(dbname) ;
    if( rs == null )
    {
    //启动失败停止MIDlet
                    notifyDestroyed();
    }else
    {
    try
    {
    rs.addRecord(tmp,0,tmp.length) ;
    rs.closeRecordStore() ;
    }catch(Exception e)
    {
    }
    }
        }       
    ///////////////////////////////////////////////////////
     public void pauseApp() 
        {
        }  
        public void destroyApp(boolean unconditional) 
        {
        }
     //////////////////////////////////////////////////////  

    /////////////////////////////////////////////////
    public void searchgzrcData(String name)
        {
    Form f = new Form("详细数据") ;
    Command back = new Command("后退",Command.SCREEN,1) ;
    f.addCommand(back) ;

    f.setCommandListener(this) ;
    RecordStore rs = openRSAnyway(dbname) ;
    if( rs == null )
    {
    //启动失败停止MIDlet
                    notifyDestroyed();
    }else
    {
    try
    {
    RecordEnumeration re = rs.enumerateRecords(null,null,false) ;
    GzrcData data = new GzrcData() ;
    while(re.hasNextElement())
    {
    byte tmp[] = re.nextRecord() ;
    data.decode(tmp) ;
    if(data.name.equals(name))
    {
    f.append("姓名: \n") ;
    f.append(data.name+"\n") ;
    f.append("日期: \n") ;
    f.append(data.rq+"\n") ;

                                            f.append("时间:\n");
                                            f.append(data.sj +"\n");
                                            f.append("主题:\n");
                                            f.append(data.zhti+"\n");
                                            display.setCurrent(f) ;
    return ;
    }
    }
    rs.closeRecordStore() ;
    }catch(Exception e)
    {
    }
    }
        }


    ////////////////////////////////////////////////////// 
        public RecordStore openRSAnyway(String rsname)
        {
    RecordStore rs = null ;
    //名称大于32个字符就不接受
    if(rsname.length() > 32)
    return null ;

    try
    {
    rs = RecordStore.openRecordStore(rsname,true) ;
    return rs ;
    }catch(Exception e)
    {
    return null ;
    }

        }
    }
    //////////////////////////////////////////////////////
    class GzrcData
    {
    String name ;
    String rq ;
            String sj;
            String zhti;
    public void GzrcData()
    {
    name = "NO NAME" ;
    rq = "NO Data" ;
                    sj="No Time";
                    zhti="No zhuti";
    }    
    public byte[] encode()
    {
    byte[] result = null ;
    try
    {
    ByteArrayOutputStream bos = new ByteArrayOutputStream() ;
    DataOutputStream dos = new DataOutputStream (bos) ;
    dos.writeUTF(name) ;
    dos.writeUTF(rq) ;
                            dos.writeUTF(sj);
                            dos.writeUTF(zhti);
    result = bos.toByteArray() ;
    dos.close() ;
    bos.close() ;

    }catch(Exception e)
    {
    }
    return result ;
    }
    public void decode(byte[] data)
    {
    try
    {
    ByteArrayInputStream bis = new ByteArrayInputStream(data) ;
    DataInputStream dis = new DataInputStream (bis) ;
    name = dis.readUTF() ;
    rq = dis.readUTF() ;
                            sj=dis.readUTF();
                            zhti=dis.readUTF();
    dis.close() ;
    bis.close() ;

    }catch(Exception e)
    {
    }
    }
    }

  2. A
    我发到你的邮箱里了,收好