Java - 使用套接字发送对象并使用localhost之外的地址

时间:2014-02-12 17:02:51

标签: java sockets

所以我开始学习插座,我发现了两个问题 1。

   InetAddress address = InetAddress.getByName("75.73.111.104");
    @SuppressWarnings("resource")
    Socket socket = new Socket(address, 57823);
    ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    out.writeObject("string");

所以我有那个代码,但每当我尝试连接它时,它会说“Connection refused: connect”但是这个代码在localhost上运行正常并且它被端口转发,所以这有什么不对。
2。

@SuppressWarnings("resource")
ServerSocket serverSocket = new ServerSocket(57823);
Socket clientSocket = serverSocket.accept();
ObjectOutputStream out = new ObjectOutputStream(clientSocket.getOutputStream());                                   
BufferedInputStream in = new BufferedInputStream(clientSocket.getInputStream());
if(in.toString() != null)
{
    System.out.println(in.toString());
}

当我使用该代码时,它不会打印我之前输入的“字符串”,它会为我提供classname@random个数字。并且它不会将结果视为字符串而是作为对象,因此如何保存我发送的对象?

3 个答案:

答案 0 :(得分:1)

刷新输出流

out.writeObject("string");
out.flush();

在服务器端读取流中的数据

 String data = in.readLine();// read data from stream sent by client
System.out.println(data);

如果您使用ObjectOutputStream撰写文字,请阅读ObjectInputStream

ObjectInputStream in = new ObjectInputStream(clientSocket.getInputStream());

String data = in.readUTF();// reading String Object

答案 1 :(得分:1)

你的麻烦不是java,而是网络。您通常无法从内部网络访问外部IP。

尝试使用外部代理服务器或请求网络外的其他人托管客户端或服务器。

Here您可以看到如何在java中配置代理。你应该使用袜子代理。

Here你有一个公共袜子代理列表。

答案 2 :(得分:1)

由于您使用ObjectOutputStream序列化对象,因此您需要使用补充ObjectInputStream来反序列化另一方的对象。

我认为ObjectInputStream.readObject()方法应该可以解决问题。

我自己没有测试过,但试一试看看会发生什么:

@SuppressWarnings("resource")
ServerSocket serverSocket = new ServerSocket(57823);
Socket clientSocket = serverSocket.accept();
ObjectInputStream in = new ObjectInputStream(clientSocket.getInputStream());
System.out.println(in.readObject());