如何在Java客户端服务器应用程序中读写多行
我有一个多线程的Java客户机-服务器应用程序,发现自己在多线通信中苦苦挣扎。这就是我的意思 如果我编写这样的服务器:如何在Java客户端服务器应用程序中读写多行,java,multithreading,client-server,Java,Multithreading,Client Server,我有一个多线程的Java客户机-服务器应用程序,发现自己在多线通信中苦苦挣扎。这就是我的意思 如果我编写这样的服务器: private static void startHandler(final Socket socket) { Thread thread = new Thread() { @Override public void run() { t
private static void startHandler(final Socket socket)
{
Thread thread = new Thread()
{
@Override
public void run()
{
try {
Scanner inputFromUser = new Scanner(socket.getInputStream());
PrintStream outPutToUser = new PrintStream(socket.getOutputStream(), true);
outPutToUser.println("Welcome!");
System.out.println(inputFromUser.nextLine());
} catch (IOException e) {
e.printStackTrace();
}
}
};
thread.start();
}
public static void main(String[] args) throws Exception
{
Scanner inputFromUser = new Scanner(System.in);
Socket socket = new Socket("127.0.0.1", 5555);
Scanner inputFromServer = new Scanner(socket.getInputStream());
PrintStream outputToServer = new PrintStream(socket.getOutputStream());
String greetingFromServer = inputFromServer.nextLine();
System.out.println(greetingFromServer);
outputToServer.println(inputFromUser.nextLine());
}
private static void startHandler(final Socket socket)
{
Thread thread = new Thread()
{
@Override
public void run()
{
try {
Scanner inputFromUser = new Scanner(socket.getInputStream());
PrintStream outPutToUser = new PrintStream(socket.getOutputStream(), true);
outPutToUser.println("Welcome!");
sendInitialCommandsToUser(outPutToUser);
System.out.println(inputFromUser.nextLine());
} catch (IOException e) {
e.printStackTrace();
}
}
};
thread.start();
}
private static void sendInitialCommandsToUser(PrintStream writer)
{
writer.println("1 - Log In");
writer.println("2 - Sign up");
writer.println("3 - Exit");
}
然后像这样写客户机:
private static void startHandler(final Socket socket)
{
Thread thread = new Thread()
{
@Override
public void run()
{
try {
Scanner inputFromUser = new Scanner(socket.getInputStream());
PrintStream outPutToUser = new PrintStream(socket.getOutputStream(), true);
outPutToUser.println("Welcome!");
System.out.println(inputFromUser.nextLine());
} catch (IOException e) {
e.printStackTrace();
}
}
};
thread.start();
}
public static void main(String[] args) throws Exception
{
Scanner inputFromUser = new Scanner(System.in);
Socket socket = new Socket("127.0.0.1", 5555);
Scanner inputFromServer = new Scanner(socket.getInputStream());
PrintStream outputToServer = new PrintStream(socket.getOutputStream());
String greetingFromServer = inputFromServer.nextLine();
System.out.println(greetingFromServer);
outputToServer.println(inputFromUser.nextLine());
}
private static void startHandler(final Socket socket)
{
Thread thread = new Thread()
{
@Override
public void run()
{
try {
Scanner inputFromUser = new Scanner(socket.getInputStream());
PrintStream outPutToUser = new PrintStream(socket.getOutputStream(), true);
outPutToUser.println("Welcome!");
sendInitialCommandsToUser(outPutToUser);
System.out.println(inputFromUser.nextLine());
} catch (IOException e) {
e.printStackTrace();
}
}
};
thread.start();
}
private static void sendInitialCommandsToUser(PrintStream writer)
{
writer.println("1 - Log In");
writer.println("2 - Sign up");
writer.println("3 - Exit");
}
它工作得很好:
- 服务器向客户端发送“欢迎”
- 用户输入一些字符串
- 此字符串将在服务器控制台中打印
private static void startHandler(final Socket socket)
{
Thread thread = new Thread()
{
@Override
public void run()
{
try {
Scanner inputFromUser = new Scanner(socket.getInputStream());
PrintStream outPutToUser = new PrintStream(socket.getOutputStream(), true);
outPutToUser.println("Welcome!");
System.out.println(inputFromUser.nextLine());
} catch (IOException e) {
e.printStackTrace();
}
}
};
thread.start();
}
public static void main(String[] args) throws Exception
{
Scanner inputFromUser = new Scanner(System.in);
Socket socket = new Socket("127.0.0.1", 5555);
Scanner inputFromServer = new Scanner(socket.getInputStream());
PrintStream outputToServer = new PrintStream(socket.getOutputStream());
String greetingFromServer = inputFromServer.nextLine();
System.out.println(greetingFromServer);
outputToServer.println(inputFromUser.nextLine());
}
private static void startHandler(final Socket socket)
{
Thread thread = new Thread()
{
@Override
public void run()
{
try {
Scanner inputFromUser = new Scanner(socket.getInputStream());
PrintStream outPutToUser = new PrintStream(socket.getOutputStream(), true);
outPutToUser.println("Welcome!");
sendInitialCommandsToUser(outPutToUser);
System.out.println(inputFromUser.nextLine());
} catch (IOException e) {
e.printStackTrace();
}
}
};
thread.start();
}
private static void sendInitialCommandsToUser(PrintStream writer)
{
writer.println("1 - Log In");
writer.println("2 - Sign up");
writer.println("3 - Exit");
}
客户:
public static void main(String[] args) throws Exception
{
Scanner inputFromUser = new Scanner(System.in);
Socket socket = new Socket("127.0.0.1", 5555);
Scanner inputFromServer = new Scanner(socket.getInputStream());
PrintStream outputToServer = new PrintStream(socket.getOutputStream());
String greetingFromServer = inputFromServer.nextLine();
System.out.println(greetingFromServer);
getMultipleLinesFromServer(inputFromServer);
outputToServer.println(inputFromUser.nextLine());
}
private static void getMultipleLinesFromServer(Scanner scanner)
{
while(scanner.hasNextLine())
{
System.out.println(scanner.nextLine());
}
}
它被限制在getMultipleLinesFromServer(Scanner-Scanner)
方法上
客户端输出仅为
Welcome!
1 - Log In
2 - Sign up
3 - Exit
我无法提供要在服务器上打印的字符串。。有什么问题吗?如果您查看Scanner hasNextLine方法的Javadocs
打印“3-退出”后,它似乎会阻止等待来自服务器的更多数据。如果您想通过行读取,BufferedReader是一个不错的选择 试试这个,我的想法很好
package com.zhouplus;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
private static void startHandler(final Socket socket) {
Thread thread = new Thread(() -> {
try {
BufferedReader inputFromUser = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter outPutToUser = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
outPutToUser.println("Welcome!");
sendInitialCommandsToUser(outPutToUser);
System.out.println("start readline!");
System.out.println(inputFromUser.readLine());
} catch (IOException e) {
e.printStackTrace();
}
});
thread.start();
}
private static void sendInitialCommandsToUser(PrintWriter writer) {
writer.println("1 - Log In");
writer.println("2 - Sign up");
writer.println("3 - Exit");
writer.flush();
}
public static void main(String[] argv) throws IOException {
ServerSocket ss = new ServerSocket(5555);
Socket accept = ss.accept();
startHandler(accept);
}
}
客户呢
package com.zhouplus;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws Exception {
Scanner inputFromUser = new Scanner(System.in);
Socket socket = new Socket("localhost", 5555);
BufferedReader inputFromServer = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter outputToServer = new PrintWriter(socket.getOutputStream());
String greetingFromServer = inputFromServer.readLine();
System.out.println(greetingFromServer);
new Thread(() -> {
String str = inputFromUser.nextLine();
outputToServer.println(str);
outputToServer.flush();
}).start();
getMultipleLinesFromServer(inputFromServer);
}
private static void getMultipleLinesFromServer(BufferedReader br) throws IOException {
String str;
while ((str = br.readLine()) != null) {
System.out.println(str);
}
System.out.println("over");
}
}
嗯,我实际上已经尝试过这样的方法
private static void getMultipleLinesFromServer(Scanner Scanner){String lineToBePrinted;while((lineToBePrinted=Scanner.nextLine())!=null){System.out.println(lineToBePrinted);}
即使没有任何方法,我也尝试过这样做,写2-3行,但不管怎样它都会被阻塞。我尝试过使用这两种方法,但似乎都没有什么效果。在我的更新中,只需将您的输入放入一个新线程中,这样它就不会被readline()阻止:p