如何使客户端能够随时向服务器发送多条消息,从而使服务器始终监听消息。
现在我写了一些代码,只允许我发送一次消息。我认为这是由于我关闭输入/输出流和套接字。所以我现在已经玩了一段时间,我似乎无法做到这一点!
客户端:
public class Client {
private Socket socket;
private OutputStream os;
public Client() {}
public void connectToServer(String host, int port) {
try {
socket = new Socket(host, port);
} catch (IOException e) {
e.printStackTrace();
}
sendMessage();
}
public void sendMessage() {
try {
os = socket.getOutputStream();
String string = "Anthony";
byte[] b = string.getBytes(Charset.forName("UTF-8"));
os.write(b);
os.flush();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void STOP() {
stopOutput();
stopServer();
}
public void stopServer() {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void stopOutput() {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务器:
public class ConnectionHandler implements Runnable {
private Socket clientSocket;
private BufferedReader in;
public ConnectionHandler(Socket clientSocket) {
this.clientSocket = clientSocket;
String clientAddress = clientSocket.getInetAddress().toString()
.substring(1);
System.out.println("Connected to " + clientAddress);
try {
in = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
try {
ArrayList<String> data = new ArrayList<String>();
String inputLine;
while ((inputLine = in.readLine()) != null) {
data.add(inputLine);
}
if (data.size() > 0) {
System.out.println(data.toString());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void STOP() {
stopInput();
stopConnection();
}
public void stopInput() {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void stopConnection() {
try {
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
目前在客户端,我会在套接字打开后立即发送消息,但是当我从另一个类调用send函数后,它不发送...
我该怎么做?或者我做错了什么?
提前致谢。
P.S。我猜客户端服务器和服务器客户端是一样的,所以如果我知道怎样做,我可以轻松切换它...对吗?
答案 0 :(得分:1)
原来这是一个简单的错误。
我作为OutputStream编写(发送客户端)但是我当时正在读取(接收服务器)作为BufferedReader!公顷
任何人都可以快速提示,确保以与发送邮件相同的方式接收邮件!
感谢所有尝试过帮助的人。
答案 1 :(得分:0)
您的服务器一直在接受数据,因此您只需要将客户端的OutputStream保存在某处并随时向其中写入数据。但是不要关闭它,因为那样你也关闭了Client套接字。
完成后,您需要更改其他内容,因为现在您调用in.readLine()
会阻止您的服务器,因为它等待客户端发送内容。为了防止这种情况,您可以尝试添加发送字符串,例如&#34;关闭&#34;当你想关闭你的客户端时,到服务器,类似的东西:
public void STOP() {
os.write("close".getBytes(Charset.forName("UTF-8")));
stopOutput();
stopServer();
}
并将服务器中的代码更改为
try {
ArrayList<String> data = new ArrayList<String>();
String inputLine;
while (!(inputLine = in.readLine()).equals("close")) {
data.add(inputLine);
}
if (data.size() > 0) {
System.out.println(data.toString());
}
} catch (IOException e) {
e.printStackTrace();
}