我正在尝试使用Java从客户端向服务器发送一些数据,这里是我的PlayerThread,当一个新的客户端连接时,在服务器上运行
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
//Create a link to send data to the server
BufferedReader in = new BufferedReader(
new InputStreamReader(
socket.getInputStream()));
while(true)
{
out.println(pongData);
String temp = in.readLine();
if(temp == "up")
{
System.out.println("Up you say");
}
}
//There is a little more but no point to give it all
当客户端断开连接时,该行代码 String temp = in.readLine(); 会给我返回以下错误:
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at Pong.PongPlayerThread.run(PongPlayerThread.java:36)
这里是客户端代码。
try
{
socket = new Socket(host, port);
serverOut = new PrintWriter(socket.getOutputStream(), true);
serverInput = new BufferedReader(new InputStreamReader(socket.getInputStream()));
}
catch (UnknownHostException e)
{
System.err.println("Couold not connect to host:" + host);
System.exit(1);
}
catch (IOException e)
{
System.err.println("Could not get Input/Output from server");
System.exit(1);
}
System.out.println("Connected to Server");
while ((pos = serverInput.readLine()) != null)
{
String[] posValues = pos.split(":");
model.getBall().setX(Double.parseDouble(posValues[0]));
model.getBall().setY(Double.parseDouble(posValues[1]));
if(PongController.moveUp == true)
{
serverOut.println("up");
PongController.moveUp = false;
}
//If the client presses up or down arrow, a message will be sent to the server
//the server will then update the movement and the clients will be able to see it
}
这段代码是有效的,但似乎完全没有发送消息 :( 如果有人能帮我解决这个问题就太好了。
画布
我刚刚编辑了一些代码,并发现在PlayerThread中,这几行:
if(temp.equals("up"))
{
System.out.println("Up you say");
}
问题是,客户端流在开始时设置为无,这可能是问题吗?发送空值?
这是更新版本。
while ((pos = serverInput.readLine()) != null)
{
String[] posValues = pos.split(":");
model.getBall().setX(Double.parseDouble(posValues[0]));
model.getBall().setY(Double.parseDouble(posValues[1]));
serverOut.println("nothing");
if(PongController.moveUp == true)
{
System.out.println("Up");
serverOut.println("up");
PongController.moveUp = false;
}
else
{
serverOut.println("nothing");
}
}
但我仍然得到相同的错误
检查in.readLine是否等于任何内容,我得到了这个代码
try
{
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(
socket.getInputStream()));
System.out.println("Checking readLine value");
if(in.readLine() == null)
{
System.out.println("A ok");
}
else
{
System.out.println(":" + in.readLine());
}
while(true)
{
String temp = in.readLine();
if(temp == "up")
{
System.out.println("Up you say");
}
out.println(pongData);
}
}
catch (IOException e)
{
e.printStackTrace();
}
这是结果
Pong
400.0:301.0:60.0:300.0:740.0:300.0
Server started
Server was setup and will try to create a socket
Data sent
Checking readLine value
Connection reset, and then followed by lots of red lines
还有什么我可以做吗?
我刚刚尝试使用以下方法来检查我的 BufferedReader:
BufferedReader in = new BufferedReader(
new InputStreamReader(
socket.getInputStream()));
System.out.println(in.toString());
System.out.println(in.readLine());
我获得了java.io.BufferedReader@6262937c来读取in.toString的内容,但是对于readLine方法,我又一次收到了连接重置的错误信息...
快速更新,
在我的客户端代码中,如果我加入以下内容:
while ((pos = serverInput.readLine()) != null)
{
String[] posValues = pos.split(":");
model.getBall().setX(Double.parseDouble(posValues[0]));
model.getBall().setY(Double.parseDouble(posValues[1]));
serverOut.println("nothing"); //<---
客户端将会连接,获取乒乓球的位置,但随后就无法再从服务器接收数据,只能按照自己的意愿移动球(更新方法尚未被禁用)。服务器输出为
serverOut = new PrintWriter(socket.getOutputStream(), true);
readLine()
返回的值进行任何操作之前,你还需要检查它是否为null。如果返回null,那么对等方已经关闭了连接,你必须做同样的事情,并且当然要退出读取循环。 - user207421