Java服务器将单词列表发送回客户端
实际上,我有一个客户端,它向服务器发送一个单词列表。服务器将删除重复的单词。我将“remmoved duplicate”字存储在一个新的集合中,但无法将新字从该数据结构发送回客户端。该程序似乎卡在服务器类的“while((clientSession=inFromClient.readLine())!=null)”循环中,因此我无法将新单词集写回客户端。有人能帮我吗 有人能帮我吗 以下是服务器代码:Java服务器将单词列表发送回客户端,java,sockets,Java,Sockets,实际上,我有一个客户端,它向服务器发送一个单词列表。服务器将删除重复的单词。我将“remmoved duplicate”字存储在一个新的集合中,但无法将新字从该数据结构发送回客户端。该程序似乎卡在服务器类的“while((clientSession=inFromClient.readLine())!=null)”循环中,因此我无法将新单词集写回客户端。有人能帮我吗 有人能帮我吗 以下是服务器代码: import java.io.*; import java.net.*; import java
import java.io.*;
import java.net.*;
import java.util.LinkedHashSet;
import java.util.Set;
class Server {
private static boolean isFinished;
public static void main(String argv[]) throws Exception
{
String clientSentence;
String capitalizedSentence;
ServerSocket welcomeSocket = new ServerSocket(6789);
Set<String> lines = new LinkedHashSet<String>(10000);
while (true) {
Socket connectionSocket = welcomeSocket.accept();
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(
connectionSocket.getInputStream()));
DataOutputStream outToClient = new DataOutputStream(
connectionSocket.getOutputStream());
while ((clientSentence = inFromClient.readLine()) != null) {
capitalizedSentence = clientSentence.toUpperCase();
lines.add(capitalizedSentence);
}
for (String string : lines) {
outToClient.writeBytes(string);
}
}
}
}
import java.io.*;
导入java.net。*;
导入java.util.LinkedHashSet;
导入java.util.Set;
类服务器{
私有静态布尔完成;
公共静态void main(字符串argv[])引发异常
{
字符串介词句;
字符串大写的插入;
ServerSocket welcomeSocket=新的ServerSocket(6789);
设置行=新LinkedHashSet(10000);
while(true){
套接字连接Socket=welcomeSocket.accept();
BufferedReader INFOROMCLIENT=新的BufferedReader(新的InputStreamReader(
connectionSocket.getInputStream());
DataOutputStream outToClient=新DataOutputStream(
connectionSocket.getOutputStream());
而((ClientSession=INFOROMCLIENT.readLine())!=null){
CapitalizedEntence=ClientSession.toUpperCase();
行。添加(大写);
}
用于(字符串:行){
outToClient.writeBytes(字符串);
}
}
}
}
客户
import java.io.*;
import java.net.*;
import java.util.LinkedHashSet;
import java.util.Set;
public class Client {
public static void main(String argv[]) throws Exception
{
String sentence;
String modifiedSentence;
File myfile = new File("C:/Users/Tudor/Desktop/test.txt");
BufferedReader inFromUser = new BufferedReader(new FileReader(myfile));
Socket clientSocket = new Socket("localhost", 6789);
DataOutputStream outToServer = new DataOutputStream(
clientSocket.getOutputStream());
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(
clientSocket.getInputStream()));
Set<String> lines = new LinkedHashSet<String>(10000);
while ((sentence = inFromUser.readLine()) != null) {
outToServer.writeBytes(sentence + "\n");
modifiedSentence = inFromServer.readLine();
lines.add(modifiedSentence);
System.out.println("FROM SERVER: " + modifiedSentence);
}
// for (String string : lines) {
// System.out.println(string);
// }
clientSocket.close();
}
}
import java.io.*;
导入java.net。*;
导入java.util.LinkedHashSet;
导入java.util.Set;
公共类客户端{
公共静态void main(字符串argv[])引发异常
{
串句;
字符串修饰句;
File myfile=新文件(“C:/Users/Tudor/Desktop/test.txt”);
BufferedReader INFOROMUSER=新的BufferedReader(新文件读取器(myfile));
套接字clientSocket=新套接字(“localhost”,6789);
DataOutputStream outToServer=新DataOutputStream(
getOutputStream());
BufferedReader INFORMServer=新的BufferedReader(新的InputStreamReader(
getInputStream());
设置行=新LinkedHashSet(10000);
while((句子=INFOROMUSER.readLine())!=null){
outToServer.writeBytes(句子+“\n”);
ModifiedSession=INFOROMSERVER.readLine();
行。添加(修改句子);
System.out.println(“来自服务器:”+修改句子);
}
//用于(字符串:行){
//System.out.println(字符串);
// }
clientSocket.close();
}
}
在客户端,您正在使用BufferedReader#readLine
进行阅读,预计会出现\n
但从服务器发送的字符串
(writeBytes(string)
)没有\n
所以readLine
将如何读取该字符串
在要发送给客户端的字符串中追加\n
主要问题是:
在客户端,您希望在将每一行发送到服务器之后从服务器获取数据
while ((sentence = inFromUser.readLine()) != null) {
outToServer.writeBytes(sentence + "\n");
modifiedSentence = inFromServer.readLine();// here you are expecting the answer from server but server is busy in listening more data
lines.add(modifiedSentence);
System.out.println("FROM SERVER: " + modifiedSentence);
}
您的服务器仍在忙于侦听数据
while ((clientSentence = inFromClient.readLine()) != null) {
capitalizedSentence = clientSentence.toUpperCase();
lines.add(capitalizedSentence);
}
在服务器端代码中做如下更改
while ((clientSentence = inFromClient.readLine()) != null) {
capitalizedSentence = clientSentence.toUpperCase();
outToClient.writeBytes(capitalizedSentence+"\n");
// imideately send data after converting it as client is expecting the data to receive and must append '\n'
}
另一个解决方案是:
更改客户端代码,如下所示:
while ((sentence = inFromUser.readLine()) != null) {
outToServer.writeBytes(sentence + "\n");
// modifiedSentence = inFromServer.readLine(); Remove this line from here
// lines.add(modifiedSentence);
// System.out.println("FROM SERVER: " + modifiedSentence);
}
创建while循环以从服务器读取数据
while ((modifiedSentence = inFromServer.readLine()) != null) {
// make 'clientlines' as a set at client side and store all lines coming from server
clientlines.add(capitalizedSentence);
}
提示:如果使用DataOutputStream
进行写入,则使用DataInputStream
进行读取。这并不能解决问题,因为循环仍然挂起。我试过使用“\n”和“\r”和“\r\n”是的,我已经测试过了,但在服务器端,我有一个集合,我在其中添加所有行,然后执行循环,我想将集合中的所有内容发送到客户端,但它只在while循环中工作,而不在while循环中工作after@user2219097对于
循环,您不需要该,因为您已经在
循环时将数据发送到了客户机。在客户端。。制作一个集合
并将来自服务器的输入线路存储在该集合
中。我需要在while循环中添加到集合中,因为我正在删除重复项,所以我想将其发送回客户端,只有非重复行,因此需要使用for循环遍历集合,然后发送新的lines@user2219097请参见编辑。。您可以从上面一次应用一个解决方案。不要把它们放在一起。