【发布时间】: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 来确定是否有任何消息到达您的“服务器”?