所以我用Java中的套接字创建了一个服务器和客户端。我正在尝试让服务器从套接字读取/写入,但只有在客户端断开连接时才会读取:
System.out.println("Server initialized");
clientSocket = server.accept();
System.out.println("Client connected");
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
for(int loop = 0;loop<5;loop++){
out.write("Hello");
System.out.println(in.readLine());
} //end for
问题是,一旦客户端连接,它会显示“客户端连接”,但它不会通过for循环运行。但是,一旦客户端断开连接,服务器就会执行for循环并返回
null
null
null
null
null
我在这里缺少什么?这是我的完整服务器代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public ServerSocket server;
public Server(int port){
try {
server = new ServerSocket(port);
} catch (IOException e) {
System.out.println("Cannot bind to port: "+ port);
System.exit(-1);
}
} //end constructor
public void WaitForClient() throws IOException{
Socket clientSocket = null;
try {
System.out.println("Server initialized");
clientSocket = server.accept();
System.out.println("Client connected");
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
for(int loop = 0;loop<5;loop++){
out.write("Hello");
System.out.println(in.readLine());
} //end for
} //end try
catch (IOException e) {
System.out.println("Accept failed");
System.exit(-1);
} //end catch
clientSocket.close();
server.close();
} //end method
} //end class
(我的主要方法是从另一个类调用的。)
答案 0 :(得分:1)
如果要立即查看结果,则必须刷新服务器上的流。该流在close()
上自动刷新,这就是您看到输出的原因。
答案 1 :(得分:1)
乍一看,你对in.readLine()的调用似乎是阻塞的,因为它还没有遇到换行符。
因此,它会阻塞,直到您的连接断开。
尝试BufferedReader的读取方法:
public int read(char[] cbuf,
int off,
int len)
并传入固定长度的数组,例如:
char[] cbuf = new char[1024];
使用读取调用的返回值来查看上次读取的字节数(0-1024) 如果您阅读1024,则可能会阅读更多内容。如果您读为0,则可能无法阅读。
答案 2 :(得分:1)
你正在读行,但你没有写它们。 write()不会写一个换行符,readLine()会阻塞,直到收到换行符。
答案 3 :(得分:-1)
它是服务器端用于接受来自客户端的字符串的代码,但根据我的代码,您将使用DataInputStream和DataOutputStream而不是PrintWriter和BufferedReader。
此代码完全适用于一对一客户..
代码“jta”是JTextArea ..
soc = server.accept();
而(真)
{
String data="";
try
{
dis = new DataInputStream(soc.getInputStream());
dos = new DataOutputStream(soc.getOutputStream());
data = dis.readUTF();
}
catch(Exception e)
{ }
jta.append(data + "\n");
}