Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java服务器将单词列表发送回客户端_Java_Sockets - Fatal编程技术网

Java服务器将单词列表发送回客户端

Java服务器将单词列表发送回客户端,java,sockets,Java,Sockets,实际上,我有一个客户端,它向服务器发送一个单词列表。服务器将删除重复的单词。我将“remmoved duplicate”字存储在一个新的集合中,但无法将新字从该数据结构发送回客户端。该程序似乎卡在服务器类的“while((clientSession=inFromClient.readLine())!=null)”循环中,因此我无法将新单词集写回客户端。有人能帮我吗 有人能帮我吗 以下是服务器代码: import java.io.*; import java.net.*; import java

实际上,我有一个客户端,它向服务器发送一个单词列表。服务器将删除重复的单词。我将“remmoved duplicate”字存储在一个新的集合中,但无法将新字从该数据结构发送回客户端。该程序似乎卡在服务器类的“while((clientSession=inFromClient.readLine())!=null)”循环中,因此我无法将新单词集写回客户端。有人能帮我吗

有人能帮我吗

以下是服务器代码:

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请参见编辑。。您可以从上面一次应用一个解决方案。不要把它们放在一起。