我正在尝试通过Socket编程编写一个程序,我从中发送消息 客户端和服务器显示它们。 但是服务器只在我键入" STOP"之后才显示单词。 当我按下回车时,它没有同时显示它。
另外,为什么我必须明确写import java.net.Socket;
和import java.net.ServerSocket;
,因为java.net.*;
给了我错误。
这是我的客户代码:
import java.util.*;
import java.io.*;
import java.net.Socket;
public class SocketTest {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("localhost", 6666);
OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream());
Scanner sc = new Scanner(System.in);
String str = "";
while(!(str = sc.nextLine()).equals("STOP"))
writer.write(str);
writer.close();
socket.close();
}
}
这是我的服务器代码:
import java.util.*;
import java.net.Socket;
import java.net.ServerSocket;
import java.io.*;
public class ServerTest{
public static void main(String[] args) throws Exception{
ServerSocket socket = new ServerSocket(6666);
Socket s = socket.accept();
InputStreamReader reader = new InputStreamReader(s.getInputStream());
Scanner sc = new Scanner(new BufferedReader(reader));
System.out.println(sc.nextLine());
sc.close();
socket.close();
}
}
答案 0 :(得分:0)
当您致电write()
时,您实际上是在写缓冲区。如果缓冲区已满,它会刷新内容。在您的情况下,当您键入STOP时会刷新并调用close(),然后在关闭之前刷新。要立即写,您需要调用flush()
方法。并在字符串末尾添加新行字符。
while(!(str = sc.nextLine()).equals("STOP")) {
writer.write(str + "\n");
writer.flush();
}
答案 1 :(得分:0)
你的while循环没有起始大括号。因此,while循环基本上会占用所有输入,直到输入字符串为" STOP"。
public static void main(String[] args) throws Exception {
Socket socket = new Socket("localhost", 6666);
OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream());
Scanner sc = new Scanner(System.in);
String str = "";
while(!(str = sc.nextLine()).equals("STOP")){ //The while loop's starting brace is missing
writer.write(str);
writer.close();
socket.close();
}
}
您还必须在最后为整个类定义添加另一个右括号。