【问题标题】:Socket programming - Client (linux), server (Windows)套接字编程 - 客户端 (linux)、服务器 (Windows)
【发布时间】:2014-01-02 21:52:32
【问题描述】:

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

我正在使用的代码是我在互联网上找到的,只是为了检查它是否有效。有趣的是,如果我使用的是 Windows XP(服务器)和 Win 8(客户端),代码可以完美运行,但是当客户端在 ArchLinux 上时,它就不起作用了。有什么特殊的方法可以连接 Windows-Linux 吗?

服务器.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");就像在捕获块中一样。 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)

【问题讨论】:

  • 我猜这是小端与大端的问题。
  • 如果是这种情况,是否有可能以某种方式解决它?
  • 'System.out.print("'\n");'
  • 1.定义“不起作用”。 2. 摆脱 ready() 循环。这实际上是在浪费时间。 readLine() 调用将阻塞。 3. 当你遇到异常时,打印它,而不是你自己设计的一些疯狂的文本。请修复所有这些并在此处发布实际异常。

标签: java linux windows sockets


【解决方案1】:

java.net.ConnectException:连接被拒绝

这有两种可能的含义。

  1. 在您尝试连接的地址:端口没有任何监听。
  2. 存在防火墙规则。

更有可能 1. 防火墙通常只是丢弃数据包,这会导致连接超时而不是拒绝。

【讨论】:

    【解决方案2】:

    您确定可以在这些系统之间建立连接吗?我已经在 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.

    【讨论】:

      猜你喜欢
      • 2016-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-06
      • 2013-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多