【问题标题】:Socket connected via the Internet but BufferedReader is not recieving any lines通过 Internet 连接的套接字,但 BufferedReader 未接收任何线路
【发布时间】:2014-08-27 04:11:23
【问题描述】:

我尝试使用 BufferedReader 和 BufferedWriter 进行基本的 Socket 通信,使用“localhost”或在本地网络中使用同一路由器连接两台 PC 时没有任何问题。让我感到麻烦的步骤是通过互联网连接。我已经在 selfhost 上设置了一个 免费域,并将该域添加到我的路由器的 动态 dns 设置中,并为使用的端口添加了一个 NAT .
之后,我能够通过该域使 ServerSocket accept 请求,并且能够使用双方套接字的 write(string + "\n") 和 flush() 方法,但是 BufferedReader 没有收到任何这些消息并抛出异常,因为几秒钟后返回“null”。使用全局 ip 时也出现同样的情况,只有本地和 hamachii ip 还有效。
我已经在我的防火墙中打开了端口以供任何 TCP 使用,并停用了我计算机上任何可能会阻止它一段时间的防病毒软件,但没有任何改变。 isConnected() 方法的两个套接字都返回 true,但是当我使用全局 ip/域时,ready() 方法始终返回 false。我真的不知道是什么导致了问题,但我认为这与我的防火墙无关,因为否则我想我什至无法连接,或者至少会有单向通信可能的。使用全局 IP 时有不同的通信协议是 java 的特殊之处吗?是什么让读者一直忙碌?

如果有人有建设性的想法或有同样的问题,我将不胜感激。

基本示例:
使用 ip = "globalhost" 时,控制台输出 "message"
使用 ip = global-ip 或 selfhost-domain 时,服务器发送线路并关闭,但客户端没有收到任何内容。

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;

public class Client {
  public static void main(String[] args) {
    try {
      Socket client = new Socket (ip, 1034);
      InputStream in = client.getInputStream();
      BufferedReader reader = new BufferedReader(new InputStreamReader(in));
      System.out.println(reader.readLine());
      client.close();
    } catch (Exception e) {
    }
  }
}

import java.io.BufferedWriter;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) {
    try {
      ServerSocket server = new ServerSocket(1034);
      Socket socket = server.accept();
      OutputStream out = socket.getOutputStream();
      BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out));
      writer.write("message\n");
      writer.flush();
      server.close();
    } catch (Exception e) {
    }
  }
}

【问题讨论】:

  • 使用代码示例更容易回答您的问题。请将您的代码发布为 minimal example,以证明您的问题。
  • 您是否尝试过使用wireshark 来确定是否有任何消息到达您的“服务器”?

标签: java sockets dns global


【解决方案1】:

试试

  writer.write("message\r\n");

【讨论】:

    猜你喜欢
    • 2012-01-05
    • 2012-02-27
    • 2011-01-16
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    相关资源
    最近更新 更多