我正在尝试学习如何在 java 中使用线程和套接字。我有一个非常简单的程序。它的功能是让用户输入一个字符串,然后由套接字在线程内运行的服务器接收并打印该消息。我让它打印出“连接已建立!”并接受用户的输入,但它们似乎从未打印出来。是否有某种原因导致收到的消息没有打印到控制台?
这是客户端类:
import java.io.IOException;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws IOException {
InetAddress host = InetAddress.getLocalHost();
TCPServer newServer = new TCPServer(5001);
Thread thread = new Thread(newServer);
thread.start();
Socket socket = new Socket(host,5001);
String outgoing_message = "";
Scanner scan = new Scanner(System.in);
PrintWriter printer = new PrintWriter(socket.getOutputStream());
while(!outgoing_message.equals("close")) {
System.out.print("Enter message: ");
outgoing_message = scan.nextLine();
printer.println(outgoing_message);
}
socket.close();
}
}
这是 TCPServer 类:
package Package_Two;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class TCPServer implements Runnable{
private Socket socket;
private ServerSocket serverSocket;
public TCPServer(int port) throws IOException{
this.serverSocket = new ServerSocket(port);
}
@Override
public void run(){
try {
this.socket = serverSocket.accept();
System.out.println("Connection established!");
Scanner scan = new Scanner(socket.getInputStream());
String incoming_message = "";
while(!incoming_message.equals("close")){
incoming_message = scan.nextLine();
System.out.println("Received message: " + incoming_message);
}
socket.close();
}
catch(IOException iex){
iex.printStackTrace();
}
}
}
最佳答案
如果您查看所使用的 PrintWriter
构造函数的源代码,您会发现它使用 autoFlush = false
调用另一个构造函数。
我想,你应该将其更改为:
PrintWriter printer = new PrintWriter(socket.getOutputStream(), true);
关于java - 简单的java套接字和线程程序的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47517507/