2010-11-15 53 views
1

嘿,我一直在玩数据报类,我只是无法弄清楚为什么我的“服务器”不会从“客户端”接收数据包。数据报包和套接字的未知错误 - Java网络

我已经测试过服务器和客户端同时在我自己的PC上运行,它的工作原理完美,但如果我尝试将服务器移到另一台PC上,它不会。

现在我知道我必须做一些错误的套接字/地址/端口bleh ...我没有与网络工作过,所以我不知道很多。

这里的服务器代码:

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.net.UnknownHostException; 
import java.io.IOException; 
import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetAddress; 
import java.net.InetSocketAddress; 
import java.net.SocketException; 
import java.sql.Connection; 
import java.util.ArrayList; 

public class ServerThread extends Thread { 

    private boolean needsToRun; 
    private DatagramSocket socket; 

    public ServerThread() { 
     super(); 
     needsToRun = true; 
     try { 
      socket = new DatagramSocket(4446); 
     } 
     catch (SocketException ex) { 
      ex.printStackTrace(); 
     } 
    } 

    @Override 
    public void run() { 
     while(needsToRun) { 
      byte[] buf = new byte[265]; 
      DatagramPacket packet = new DatagramPacket(buf,buf.length); 
      try { 
       socket.receive(packet); 
      } 
      catch(IOException e) { 
       e.printStackTrace(); 
      } 
      String data = new String(packet.getData(),0,packet.getLength()); 
      if(data != null) 
       System.out.println(data); 
     } 
     socket.close(); 
    } 
} 

你会看到一些未使用的进口,但我只是剥离下来的代码,使其基本(大部分来自什么其实我是想在服务器做数据一旦收到,但我有这部分工作)。

这里的客户端代码:

import java.io.IOException; 
import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetAddress; 
import java.net.SocketException; 
import java.net.UnknownHostException; 

public class Main { 

     public static void main(String[] args) throws SocketException, UnknownHostException, IOException { 

      // get a datagram socket 
     DatagramSocket socket = new DatagramSocket(); 

      // send request 
     String testInfo = "Hi"; 
     byte[] buf = testInfo.getBytes(); 

     /*This could possible be a point at which the code won't work. 
     *to get the bytes of the IP address of the computer I'm trying to run the server 
     *on I just did 
     * byte[] address = InetAddress.getLocalHost().getAddress(); 
     * on the computer I was running the server on. I'm 95% sure that the IP addresses 
     * match. 
     */ 
     byte[] inet = {-64,-88,1,5}; 
     InetAddress address = InetAddress.getByAddress(inet); 
     DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 4446); 
     try { 
      socket.send(packet); 
     } 
     catch(Exception e) { 
      e.printStackTrace(); 
     } 

     socket.close(); 
    } 
} 

代码的明显的部位,我检查,如端口和地址(见代码注释)。

所以我真正想要的是,如果你不明白为什么代码不会工作,那么你能告诉我一些可能出错的端口和什么东西(端口可能被关闭等等(除了我也很确定港口是开放的))。

感谢您的任何建议。

+0

也许防火墙阻止了数据包?您是否尝试禁用每台计算机上的防火墙? – cdhowie 2010-11-15 03:49:28

回答

1

我已经测试过它与服务器和客户端一起运行在我自己的PC上,它的工作原理完美,但如果我尝试将服务器移到另一台PC上,它不会。

我期望这种网络或防火墙问题,而不是您的Java客户端和服务器应用程序的问题。 (有证据表明,当在同一台机器上运行的点这样他们可以谈...)

检查这些东西:

  • 检查客户端解析服务器的IP地址;例如尝试ping它或连接到一些已知服务器支持的其他端口上。

  • 检查在客户机和服务器软件的防火墙允许端口4446.

  • UDP流量如果是两台机器之间的桥梁和/或路由器,请检查其没有阻止UDP流量端口4446.

+0

我最近不得不这样做,并遇到了多个网络接口(一些虚拟)的麻烦。因此,请检查您使用的IP是否适用于您正在使用的网络。另外,安装Wireshark。 – 2010-11-15 04:22:15

+0

@Stephen,谢谢你的回应。我能够成功ping通我尝试连接的IP地址。我进入了服务器计算机上的Windows防火墙,并为端口4446添加了UDP通信异常。我不太清楚第三个建议的意思,如果你能说明它会很棒。另外,@迈克尔,就像斯蒂芬的第三个建议,我不太清楚你的意思。我对网络相当陌生,所以很抱歉,如果我的速度有点缓慢。至于Wireshark,我不知道如何才能成功使用它。它似乎可以告诉我,如果服务器PC是 – 2010-11-16 00:18:25

+0

实际接收数据包,如果它是,将在服务器应用程序中被注意到? – 2010-11-16 00:22:07