您好,我是编程新手,在这里我尝试在 Android Studio 上使用 Java 创建客户端-服务器套接字连接,在一部 Android 手机上使用客户端套接字,在另一部手机上使用服务器套接字。当我在同一路由器上连接两部手机时,无论我使用哪个端口,代码都可以工作,并且使用内部 IP (192.168.1.4) 作为客户端套接字而不是全局 IP (183.90.37.22)。但是,如果我打开 4G 连接并在我的代码中使用全局 IP,则客户端套接字无法连接到另一部手机上的服务器套接字。但是,当使用端口 80 时,我设法看到 toasts 一直显示到“消息已发送”ALTHOUGH 在使用服务器套接字编码的电话中没有显示任何消息/toasts。我非常感谢我能得到的所有帮助,如果能给出关于如何将 TCP 端口分配给客户端和服务器套接字的详尽解释,那就太好了! =)
Client Socket 首先出现:
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
MessageSenderThread messageSender = new MessageSenderThread("messageSender");
messageSender.start();
}
});
}
class MessageSenderThread extends Thread {
private String threadName;
private Thread t;
MessageSenderThread(String s) {
threadName = s;
}
@Override
public void run() {
try {
showToast("Connecting to server...");
Socket socket = new Socket("183.90.37.22", 80);
showToast("Connection established");
OutputStream outputStream = socket.getOutputStream();
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
PrintWriter printWriter = new PrintWriter(outputStreamWriter);
printWriter.println("MESSAGE");
printWriter.flush();
showToast("Message sent");
outputStream.close();
outputStreamWriter.close();
printWriter.close();
socket.close();
showToast("Socket closed");
}
catch (IOException e) {
showToast("Connection FAILED");
}
}
@Override
public void start() {
if (t == null) {
t = new Thread(this, threadName);
t.start();
}
}
}
服务器端代码如下:
MessageReceiverThread messageReceiverThread = new MessageReceiverThread("messageReceiver");
messageReceiverThread.start();
class MessageReceiverThread extends Thread {
private String threadName;
private Thread t;
MessageReceiverThread(String s) {
threadName = s;
}
@Override
public void run() {
try {
while (true) {
ServerSocket serverSocket = new ServerSocket(5000);
showToast("Server is listening...");
Socket socket = serverSocket.accept();
showToast("Connection established");
InputStream inputStream = socket.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String message = bufferedReader.readLine();
showToast(message);
inputStream.close();
inputStreamReader.close();
bufferedReader.close();
socket.close();
serverSocket.close();
}
} catch (IOException e) {
showToast("Connection FAILED");
}
}
最佳答案
您的移动服务提供商会阻止传入连接。
因此在无法访问的设备上运行服务器是没有意义的。
关于java - 当客户端套接字连接到本地 IP 而不适用于全局 IP 时,客户端-服务器套接字连接有效。 (超过 4G 连接),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49339807/