[英]Server Client Socket Programming
我已经建立了一个android TCP连接,其中服务器是用java编写的,而客户端是用android编写的。 它基本上是服务器客户端聊天。 该代码很好,并且运行良好。 问题是当我关闭android客户端时,服务器会忘记该客户端并且不会再次检索该客户端,但是服务器和客户端都需要再次启动。我希望在我关闭客户端但服务器仍在运行并且再次运行客户端,然后服务器应搜索其最近的客户端并恢复服务器客户端聊天。 我正在提供我的代码。 如果有人帮助尽快修改我的代码,请。 谢谢
import javax.swing.*;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* The class extends the Thread class so we can receive and send messages at the same time */
public class TCPServer extends Thread {
public static final int SERVERPORT = 4444;
private boolean running = false;
private PrintWriter mOut;
private OnMessageReceived messageListener;
public static void main(String[] args) {
//opens the window where the messages will be received and sent
ServerBoard frame = new ServerBoard();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
/**
* Constructor of the class
* @param messageListener listens for the messages
*/
public TCPServer(OnMessageReceived messageListener) {
this.messageListener = messageListener;
}
/**
* Method to send the messages from server to client
* @param message the message sent by the server
*/
public void sendMessage(String message){
if (mOut != null && !mOut.checkError()) {
mOut.println(message);
mOut.flush();
}
}
@Override
public void run() {
super.run();
running = true;
try {
System.out.println("S: Connecting...");
//create a server socket. A server socket waits for requests to come in over network.
ServerSocket serverSocket = new ServerSocket(SERVERPORT);
Socket client = serverSocket.accept();
System.out.println("S: Receiving...");
try {
//sends the message to the client
mOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())), true);
//read the message received from client
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
//in this while we wait to receive messages from client (it's an infinite loop)
//this while it's like a listener for messages
while (running) {
String message = in.readLine();
if (message != null && messageListener != null) {
//call the method messageReceived from ServerBoard class
messageListener.messageReceived(message);
}
}
} catch (Exception e) {
System.out.println("S: Error");
e.printStackTrace();
} finally {
client.close();
System.out.println("S: Done.");
}
} catch (Exception e) {
System.out.println("S: Error");
e.printStackTrace();
}
}
//Declare the interface. The method messageReceived(String message) will must be implemented in the ServerBoard
//class at on startServer button click
public interface OnMessageReceived {
public void messageReceived(String message);
} }
我认为关键是如何识别客户端,以便一旦它回来,您就希望服务器记住它。 我看不到服务器代码中跟踪客户端的逻辑。
话虽如此,一种识别TCP客户端的方法是使用客户端的IP地址和端口号。 如果我们关闭该TCP客户端并重新启动,则可能无法保证该客户端的端口号,因为大多数TCP客户端都不调用bind(),而只是使用connect()来获取临时端口号。 或者,您可以使用应用程序层逻辑(请记住应用程序位于TCP之上),客户端可以在其中使用唯一标识符,也可以要求服务器为其提供唯一标识符。 因此,当客户端返回时,它会告诉服务器它具有标识符,并且希望恢复该连接。 为此,服务器可以将新的fd与它先前发布的标识符相关联。 请注意,如果服务器发布标识符,则更容易保证标识符的唯一性-例如,服务器可以递增地发布标识符。
我假设有一种聊天应用程序-当用户单击其Android设备上的应用程序时-将最近的消息显示为历史记录。
识别客户的部分是您必须从设计方面考虑到数据隐私等问题的考虑。 让我解释一些替代方法:
client.getInetAddress().getHostAddress()
获得的字符串。 由于IP地址是可以在DHCP环境中重用的内容,并且Android设备的主机名是由Android定义的,因此用户无法更改,因此此标识方法可能是一个好方法,但不一定总是同一客户端。 当意外识别出另一个Android设备并获取了另一个用户的历史记录时,您的应用程序会发生什么? getDeviceId()
信息,请参见TelephonyManager 。 最后,您需要存储消息的历史记录。 我将扩展messageListener.messageReceived(message);
行messageListener.messageReceived(message);
以及方法sendMessage(String message)
来保存消息,例如,将消息保存在每个客户端的文件中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.