套接字编程 - 客户端(linux),服务器(Windows)

时间:2014-01-02 21:52:32

标签: java linux windows sockets

我正在尝试使用套接字创建简单的套接字应用程序,以便将来自linux(64x ArchLinux)的流发送到服务器(Windows XP)。

我正在使用的代码我在互联网上找到,只是为了检查它是否正常工作。有趣的是,如果我使用的是Windows XP(服务器)和Win 8(客户端),代码可以正常工作,但是当客户端在ArchLinux上时,它不起作用。是否有一些特殊的方式来连接Windows-Linux?

Server.java

import java.lang.*;
import java.io.*;
import java.net.*;

class Server_pzm {
   public static void main(String args[]) {
      String data = "Toobie ornaught toobie";
      try {
         ServerSocket srvr = new ServerSocket(1234);
         Socket skt = srvr.accept();
         System.out.print("Server has connected!\n");
         PrintWriter out = new PrintWriter(skt.getOutputStream(), true);
         System.out.print("Sending string: '" + data + "'\n");
         out.print(data);
         out.close();
         skt.close();
         srvr.close();
      }
      catch(Exception e) {
         System.out.print("Whoops! It didn't work!\n");
      }
   }
}

Client.java

import java.lang.*;
import java.io.*;
import java.net.*;

class Client {
   public static void main(String args[]) {
      try {
         Socket skt = new Socket("192.168.224.78", 1234);
         BufferedReader in = new BufferedReader(new
            InputStreamReader(skt.getInputStream()));
         System.out.print("Received string: '");

         // while (!in.ready()) {} line removed
         System.out.println(in.readLine());  


         System.out.print("'\n");
         in.close();
      }
      /* lines removed catch(Exception e) {
         System.out.print("Whoops! It didn't work!\n");
      } */

      // added exception handling
      catch(UnknownHostException e) {
         e.printStackTrace();
      }
      catch (IOException e){
         e.printStackTrace();
      }

   }
}

修改

抱歉,我没有说明我的工作意味着什么。我的意思是我得到了一个异常,后来打印出System.out.print(“哎呀!它不起作用!\ n”);就像在捕获blok一样。 Win 8和Arch Linux安装在同一台笔记本电脑上,而代码在我的Dropbox文件夹中两个系统(所以代码是相同的) - 我会在我回到笔记本电脑后发布实际的异常

编辑2:

我更新了代码,这是我得到的例外:

java.net.ConnectException: Connection refused
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.net.Socket.connect(Socket.java:579)
        at java.net.Socket.connect(Socket.java:528)
        at java.net.Socket.<init>(Socket.java:425)
        at java.net.Socket.<init>(Socket.java:208)

2 个答案:

答案 0 :(得分:2)

  

java.net.ConnectException:拒绝连接

这有两种可能的含义。

  1. 地址上没有任何内容:您尝试连接的端口。
  2. 路上有防火墙规则。
  3. 更可能1.防火墙通常只丢弃数据包,这会导致连接超时而不是拒绝。

答案 1 :(得分:1)

您确定可以在这些系统之间建立连接吗?我已经在Virtualbox上的Windows 7和Linux Mint上编译和运行了你的代码,它运行正常。

你是什么意思“它不起作用”?它会抛出任何异常吗?如果您没有任何输出,请尝试再次运行并等待大约30秒。

对我而言,这只是一个网络问题。所以你也应该尝试从linux ping你的windows机器,然后尝试telnet到服务器。

修改

所以我们知道这是一个网络问题。首先尝试从Linux系统ping ip服务器。

ping 192.168.224.78

如果它不起作用,则应检查两台计算机是否在同一子网192.168.224.0中,假设掩码为255.255.255.0。您只需在控制台中键入ifconfig即可。

在下一步中,您应该尝试禁用Windows防火墙。 Here is an instruction how to do that.