gpt4 book ai didi

Java 客户端到服务器未知来源

转载 作者:可可西里 更新时间:2023-11-01 02:43:50 26 4
gpt4 key购买 nike

我有一个需要通过网络运行的简单乒乓球游戏,服务器将创建一个包含球和 2 个球棒位置的游戏,当客户端连接到服务器时,服务器将创建一个名为 PongPlayerThread 的新类它将处理客户端到服务器的输入和输出流,

我的服务器工作 100% 正常,没有从客户端到服务器的任何数据,服务器可以毫无问题地向客户端发送信息,但我有一个奇怪的问题,但首先这是我的代码,所以你可以看到什么我有。

乒乓服务器

try
{
serverSocket = new ServerSocket(port);
listen = true;
System.out.println("Server was setup and will try to create a socket");
}
catch(IOException e)
{
System.err.println("Could not listen on port:" + port);
System.exit(1);
}

while(listen)
{
players[idPlayer] = new PongPlayerThread(serverSocket.accept(), idPlayer, rtnInfo());
players[idPlayer].start();
System.out.println("Client Connected with ID:" + idPlayer);
players[0].passData(rtnInfo());
idPlayer++;
if(idPlayer > 1)
{
listen = false;
playing = true;
}
}

while(playing)
{
players[0].passData(rtnInfo());
players[0].sleep(25);
players[1].passData(rtnInfo());
players[1].sleep(25);
}

....//more, but not important

这是我的 PongClient

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);
}

...

while ((pos = serverInput.readLine()) != null)
{
String text = "nothing";
serverOut.println(text);
String[] posValues = pos.split(":");
model.getBall().setX(Double.parseDouble(posValues[0]));
model.getBall().setY(Double.parseDouble(posValues[1]));


/*if(PongController.moveUp == true)
{
System.out.println("Up");
serverOut.println("up");
PongController.moveUp = false;
}
else
{
serverOut.println("nothing");
}*/

}

这是我的 PongPlayerThread

try
{
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(
socket.getInputStream()));

String text = "hhh";

System.out.println(in.toString());
//System.out.println(text = in.readLine());
System.out.println("Checking readLine value");

String line;
if ((line = in.readLine()) == null)
{
System.out.println("A ok");
}
else
{
System.out.println(":" + line);
}

while(send)
{
//String temp = in.readLine();
//if(temp.equals("up"))
//{
// System.out.println("Up you say");
//}
out.println(pongData);
}

out.close();
in.close();
socket.close();
}

catch (IOException e)
{
e.printStackTrace();
}

现在,当我运行我的服务器时一切正常,然后我连接一个客户端,当一个客户端连接时,乒乓球应该在等待另一个玩家时静止不动,但球会在没有从服务器获取数据的情况下自行更新,一旦我关闭客户端程序,我的服务器就会出现这个错误

java.net.SocketException: Connection reset
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:42)

PongPlayerThread中的第42行是这样的

if ((line = in.readLine()) == null) 

这几天我一直在尝试解决这个问题,但我仍然没有找到解决方案,我感觉 inputStream 无法连接到客户端的 outputStream,我尝试使用 wireShark 但这是一个 LAN 程序,所以它不会工作,并且 wireShark 中不会显示任何内容。如果有人能对此有所启发,将不胜感激。

Canvas

iTech 更新好的,我在这里使用了你的代码,现在我的 PongPlayerThread 中有什么

public void run()
{
try
{
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(
socket.getInputStream()));

String text = "hhh";

System.out.println(in.toString());
//System.out.println(text = in.readLine());
System.out.println("Checking readLine value");

String line = null;
if ((line = in.readLine()) != null) // why you check if it is null !?
{
System.out.println("Client sent: "+line);
}

while(send)
{
out.println(pongData);
}

out.close();
in.close();
socket.close();
}

这将在控制台中显示“Client sent: Hello”,但我的客户端不会停止并继续从服务器获取数据,

如果我将你给我的 if 语句放入具有 out.println(pongData) 的 while 语句中,它可以工作,但是一旦客户端连接和断开连接,我就会收到错误消息,或者如果两个客户端连接,然后他们又会收到错误消息都离开我再次收到此错误 :(

java.net.SocketException: Connection reset
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:45)

第 45 行是

if ((line = in.readLine()) != null) // why you check if it is null !?

整理代码,但现在在我的 pongClient 代码中

 while ((pos = serverInput.readLine()) != null) 
{
String text = "nothing";
serverOut.println(text);
String[] posValues = pos.split(":");
model.getBall().setX(Double.parseDouble(posValues[0]));
model.getBall().setY(Double.parseDouble(posValues[1]));


if(PongController.moveUp == true)
{
System.out.println("Up");
serverOut.println("up");
PongController.moveUp = false;
}
else
{
serverOut.println("nothing");
}

}

一旦遇到这个,它就不会做任何事情,并且会再次导致整个错误。

我发现错误,我放的地方

 if ((line = in.readLine()) != null)
{

如果再放一次line = in.readLine(),会报错。奇怪,但现在已经修复了,数据可以从客户端发送到服务器,也可以从服务器发送到客户端:)

最佳答案

一旦客户端连接到您的服务器,if ((line = in.readLine()) == null) 将阻塞线程,直到收到来自客户端的消息。

建立连接后需要从客户端发送一些东西

PongPlayerThread 中,您可以修改以下内容并删除 else block

String line = null; 
if ((line = in.readLine()) != null) // why you check if it is null !?
{
System.out.println("Client sent: "+line);
}

PongClient 中建立 socket 连接后,您可以发送一些消息,例如serverOut.println("你好");

关于Java 客户端到服务器未知来源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14914027/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com