Гнездо никогда не подключалось
Я пытался использовать сокет для подключения к серверу, но когда я установил параметр для localhost, он работает. но когда я помещаю туда свой IP-адрес, он никогда не работает, поэтому я не знаю, что было не так, IP-адрес, который я получил, был от http://whatismyipaddress.com/
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
public class Client {
public static void main( String [] arg ) throws Exception
{
Socket socket;
BufferedReader stdIn;
BufferedReader fromServer;
PrintWriter toServer;
String s;
String result;
socket = new Socket( "96.63.208.240", 5000 );
stdIn = new BufferedReader( new InputStreamReader( System.in ) );
fromServer = new BufferedReader( new InputStreamReader( socket.getInputStream() ) );
toServer = new PrintWriter( new OutputStreamWriter( socket.getOutputStream() ), true );
while ( (s = stdIn.readLine()) != null )
{
toServer.println( s );
result = fromServer.readLine();
System.out.println( "reverse: " + result );
}
socket.close();
}
}
Северная сторона
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main( String [] arg ) throws Exception
{
ServerSocket serverSocket = new ServerSocket( 5000, 10 );
Socket socket;
serverSocket.setReuseAddress( true );
while ( (socket = serverSocket.accept()) != null )
{
System.out.println( "Accepted an incoming connection" );
new SessionThread( socket ).start();
}
serverSocket.close();
}
}
3 ответа
Вы, вероятно, забыли установить переадресацию портов, потому что вы указали, что глобальный IP-маршрутизатор по умолчанию не знает, какому устройству в локальной сети оно должно отправлять (устройства в локальной сети имеют локальный ip, который вы можете найти с помощью cmd: ipconfig
). Таким образом, вы вручную указываете маршрутизатору отправлять каждый пакет, поступающий на порт 5000, из Интернета, чтобы направить его на устройство с IP, например. 192.168.1.5
Попробуйте этот код: может быть, более полезным для вас.
import java.net.*;
import java.io.*;
public class Client {
public static void main (String args[]) {
// arguments supply message and hostname of destination
Socket s = null;
try{
int serverPort = 7896;
s = new Socket(args[1], serverPort);
DataInputStream in = new DataInputStream( s.getInputStream());
DataOutputStream out =
new DataOutputStream( s.getOutputStream());
out.writeUTF(args[0]); // UTF is a string encoding see Sn 4.3
String data = in.readUTF();
System.out.println("Received: "+ data) ;
}catch (UnknownHostException e){
System.out.println("Sock:"+e.getMessage());
}catch (EOFException e){System.out.println("EOF:"+e.getMessage());
}catch (IOException e){System.out.println("IO:"+e.getMessage());}
if (s != null)
try {
s.close();
} catch (IOException e) {
System.out.println("close:" + e.getMessage());
}
}
}
И для серверной стороны используйте этот.
import java.net.*;
import java.io.*;
public class Server {
public static void main(String args[]) {
try {
int serverPort = 7896;
ServerSocket listenSocket = new ServerSocket(serverPort);
while (true) {
Socket clientSocket = listenSocket.accept();
Connection c = new Connection(clientSocket);
}
} catch (IOException e) {
System.out.println("Listen :" + e.getMessage());
}
}
}
class Connection extends Thread {
DataInputStream in;
DataOutputStream out;
Socket clientSocket;
public Connection(Socket aClientSocket) {
try {
clientSocket = aClientSocket;
in = new DataInputStream(clientSocket.getInputStream());
out = new DataOutputStream(clientSocket.getOutputStream());
this.start();
} catch (IOException e) {
System.out.println("Connection:" + e.getMessage());
}
}
public void run() {
try { // an echo server
String data = in.readUTF();
out.writeUTF(data);
} catch (EOFException e) {
System.out.println("EOF:" + e.getMessage());
} catch (IOException e) {
System.out.println("IO:" + e.getMessage());
}
try {
clientSocket.close();
} catch (IOException e) {
/* close failed */}
}
}
Вам нужно понять поток запросов, чтобы решить вашу проблему. С localhost вы делаете запрос непосредственно на свой компьютер, он не попадает в сеть. Когда вы добавите свой внешний IP-адрес (который вы нашли через whatismyipaddress.com), запрос выйдет из вашего компьютера и спросит ваш маршрутизатор, где находится машина с этим IP-адресом. Тем не менее, поток запросов будет:
- Твой компьютер
- Ваш роутер
- Интернет-провайдер DNS
- Ваш маршрутизатор снова (потому что ваш провайдер знает ваш IP)
- Ваш компьютер снова
Но на этом последнем шаге есть проблема. По соображениям безопасности ваш маршрутизатор заблокирует любой внешний запрос на доступ к вашей частной сети. Есть часть, где вы должны настроить переадресацию портов вашего маршрутизатора (как упомянуто выше) и сказать ему, что любой запрос из-за пределов вашей частной сети должен быть перенаправлен на ваш локальный IP, таким образом будет работать. Чтобы настроить переадресацию портов, просто подключитесь к маршрутизатору через браузер (например, 192.168.1.1), войдите в систему и перейдите к переадресации портов или что-то подобное. Этапы настройки должны быть очень явными. Но не забывайте, что ваш локальный IP-адрес и внешний IP-адрес события могут измениться, поэтому, если он снова прекратит работу, проверьте, не изменились ли IP-адреса.