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

2019-03-25 13:35|来源: 网路

数据只能从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文件: import java.util.Scanner; public class GameA_B { public static void main(String[] args) { Scanner reader=new Scanner(System.in); int area; System.out.println("Game Start…………Please enter the area:(1-9)" + '\n'+"1,2,3 means e ...
  • 我有个多线程聊天的程序,不过不能传文件,如果需要可以给你,需要的话给我发站内消息
  • 用Jreport生成报表的,具体的用法网上去查查
  • 应该不支持吧`````一般的程序后面都是jad或者jar的。这两个是最普遍的,诺基亚的专用格式是SIS 多普达的专用格式是 exe 和 cab
  • package com.kum.im.hrserver.test; import java.net.*; import java.nio.*; import java.nio.channels.*; import java.nio.charset.*; import java.awt.*; import java.awt.event.*; public class ChatClient { private SocketChannel sc = null; private String name = null ...
  • 这个非常简单,Spring官方提供很多示例,简单的宠物商店等,你可以到spring官网,下载spring roo这个工具 ,安装后它的smaple目录有很多示例,你把示例脚本执行一次,就自动生成spring mvc的示例程序,如果你不想使用示例,你可以使用spring roo工具根据提示,自动创建spring mvc的增删改查小程序。 非常简单哦,只需要根据spring roo的向导提示进行就可以快速的创建spring mvc程序。
  • 此代码适用于我。 如果我输入目标IP作为本地机器的IP,那么我得到弹出窗口。 如果我在网络上输入另一台机器,我也会弹出一个窗口。 我的猜测是,您的任一台计算机都有防火墙运行,阻止了传入的UDP数据包,或者您的计算机有多个网络接口,并且您检测到的IP不是与另一台计算机在同一网络中的IP。 在前一种情况下,您可以禁用防火墙(如果您的计算机不在具有防火墙的路由器之后,或者位于您没有完全控制的网络上,则不是个好主意),也可以打开输入和输出UDP的特定端口在两台机器上。 在后一种情况下,您希望查看在同一子网上的两台机 ...
  • 是的,理论上它应该是一样的。 它仍然是IP。 实际上,存在具有NAT的路由器。 例如,如果您将UDP数据包发送到家用电脑的公共IP地址,则实际上会在您的路由器上寻址。 路由器不知道他应该向哪个本地IP寻址数据包并丢弃该数据包。 解决方案:为两端的路由器配置UDP端口转发。 Yes, in theory it should be working just the same. It's still IP. In reality, routers with NAT exist. For example, if y ...
  • 当然 - 这是一个例子 。 这是DatagramPacket的Javadoc。 Sure - here's an example. And here's the Javadoc for DatagramPacket.