我在java eclipse中使用android TCP连接为服务器客户端聊天编写了一个代码。代码运行良好,客户端是android,服务器是java。问题是当我关闭客户端并重新打开它以恢复与服务器的连接时,它不起作用。服务器无法再次找到其客户端。我只想将请求发送到客户端以进行重新连接并恢复服务器客户端聊天。我正在附加有三个类的java服务器的代码。
public class TCPServer extends Thread {
public static final int SERVERPORT = 1234;
private boolean running = false;
private PrintWriter mOut;
private OnMessageReceived messageListener;
private MyThread ts1,t;
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;
ts1=new MyThread();
ts1.ts1=this;
}
/**
* 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...");
ServerSocket serverSocket = new ServerSocket(SERVERPORT);
Socket client = serverSocket.accept();
ts1.start();
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()));
//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();
}
}
//class at on startServer button click
public interface OnMessageReceived {
public void messageReceived(String message);
}
public void myfunc() throws Exception {
ServerSocket serverSocket = null;
// TODO Auto-generated method stub
Socket client = serverSocket.accept();
mOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())), true);
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
try{
while (true) {
String message = in.readLine();
// if (message != null && messageListener != null) {
//call the method messageReceived from ServerBoard class
// messageListener.messageReceived(message);
System.out.println(message);
System.out.println("S: hellError");
}
}
finally{}
}
}
## ServerBoard.java ##
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ServerBoard extends JFrame {
private JTextArea messagesArea;
private JButton sendButton;
private JTextField message;
private JButton startServer;
private TCPServer mServer;
public ServerBoard() {
super("ServerBoard");
JPanel panelFields = new JPanel();
panelFields.setLayout(new BoxLayout(panelFields,BoxLayout.X_AXIS));
JPanel panelFields2 = new JPanel();
panelFields2.setLayout(new BoxLayout(panelFields2,BoxLayout.X_AXIS));
//here we will have the text messages screen
messagesArea = new JTextArea();
messagesArea.setColumns(30);
messagesArea.setRows(10);
messagesArea.setEditable(false);
sendButton = new JButton("Send");
sendButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// get the message from the text view
String messageText = message.getText();
// add message to the message area
messagesArea.append("\n" + messageText);
// send the message to the client
mServer.sendMessage(messageText);
// clear text
message.setText("");
}
});
startServer = new JButton("Start");
startServer.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// disable the start button
startServer.setEnabled(false);
//creates the object OnMessageReceived asked by the TCPServer constructor
mServer = new TCPServer(new TCPServer.OnMessageReceived() {
@Override
//TCPServer class (at while)
public void messageReceived(String message) {
messagesArea.append("\n "+message);
}
});
mServer.start();
}
});
//the box where the user enters the text (EditText is called in Android)
message = new JTextField();
message.setSize(200, 20);
//add the buttons and the text fields to the panel
panelFields.add(messagesArea);
panelFields.add(startServer);
panelFields2.add(message);
panelFields2.add(sendButton);
getContentPane().add(panelFields);
getContentPane().add(panelFields2);
getContentPane().setLayout(new BoxLayout(getContentPane(),BoxLayout.Y_AXIS));
setSize(300, 170);
setVisible(true);
}
}
## MyThread.java ##
public class MyThread extends Thread{
public TCPServer ts1;
public void run()
{
super.run();
try {
//if(ts1!=null)
ts1.myfunc();
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("S: Error");
e.printStackTrace();
}
}
}
答案 0 :(得分:2)
您需要在循环中运行accept-read-write代码。否则,您的服务器将只接受一个客户端连接并退出。
像
while (true)
{
accept(...)
read-and-write()
}