我正在为我在Java编码的游戏编写服务器。由于某种原因,输出流实际上不会将信息发送回客户端。我已经尝试了所有内容,但是关闭插座最终在程序中误以为是由于套接字在写入输出流之前的插座关闭。我无法弄清楚为什么。
编辑:我已经将很多代码放在这一要旨中。另外,为了澄清,即使我没有关闭插座,响应根本没有发送。客户只是在等待一个答案,而没有收到一个。
这是我的代码。
public class ServerThread extends Thread {
private Socket clientSocket;
private List<Player> players;
public Player player = null;
public ServerThread (Socket clientSocket, List<Player> players)
{
this.clientSocket = clientSocket;
this.players = players;
}
public void run()
{
try {
BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
DataOutputStream os = new DataOutputStream(clientSocket.getOutputStream());
String req = br.readLine();
br.close();
String response = buildResponse(req);
os.writeBytes(response);
os.flush();
System.out.println("Sending [ " + response + " ] to " + clientSocket.getInetAddress().getHostAddress());
player = addPlayerFromRequest(req);
} catch (IOException ex) {
Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex);
}
try {
clientSocket.close();
} catch (IOException ex) {
Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex);
}
}
public String buildResponse(String req)
{
List<Player> plays;
plays = players;
String name = req.split(",")[0];
String response = "";
if (plays.size() <= 1) {
return response;
}
for (int i = 0; i < plays.size(); i++) {
Player p = plays.get(i);
if (!p.name.equals(name)) {
response += p.name + "," + p.x + "," + p.y + "," + p.z + "," + p.rx + "," + p.rx + "," + p.rz + ";";
}
}
return response;
}
public Player addPlayerFromRequest (String req)
{
String[] list = req.split(",");
String user = list[0];
float x = Float.parseFloat(list[1]);
float y = Float.parseFloat(list[2]);
float z = Float.parseFloat(list[3]);
float rx = Float.parseFloat(list[4]);
float ry = Float.parseFloat(list[5]);
float rz = Float.parseFloat(list[6]);
return new Player(x, y, z, rx, ry, rz, user);
}
}
由于br.close()
,此代码会抛出SocketException: Socket closed
,但是假设您已删除了该代码,我建议您的客户端正在阅读行,但您没有发送行。将线路终结器添加到消息,或使用BufferedWriter.newLine()
。