Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我的连接器没有接收主机';什么消息? 总结_Java_Sockets - Fatal编程技术网

Java 为什么我的连接器没有接收主机';什么消息? 总结

Java 为什么我的连接器没有接收主机';什么消息? 总结,java,sockets,Java,Sockets,我正在用Java制作一个简单的点对点国际象棋游戏。主机已成功连接,但连接器未收到其消息。我正在使用PrintWriter和BufferedReader发送和接收消息。我怀疑PrintWriter有问题,但我不确定 前期研究 我搜索了“客户端未接收服务器的消息”,但每个人都遇到的问题是没有使用println和他们的PrintWriter。我确实使用了println,所以它们都不适用于我。我还将输入和输出字段从方法中移到类中,一个答案说可以这样做,但它并没有解决问题 一些代码 监听码 try(Ser

我正在用Java制作一个简单的点对点国际象棋游戏。主机已成功连接,但连接器未收到其消息。我正在使用
PrintWriter
BufferedReader
发送和接收消息。我怀疑
PrintWriter
有问题,但我不确定

前期研究 我搜索了“客户端未接收服务器的消息”,但每个人都遇到的问题是没有使用
println
和他们的
PrintWriter
。我确实使用了
println
,所以它们都不适用于我。我还将输入和输出字段从方法中移到类中,一个答案说可以这样做,但它并没有解决问题

一些代码 监听码
try(ServerSocket ServerSocket=newserversocket(this.port)){
//我们需要连接另一台计算机
if(this.other==null | | this.other.isClosed()){
System.out.println(“在端口上查找连接”+serverSocket.getLocalPort());
this.in=null;
this.out=null;
//监听连接器
this.other=serverSocket.accept();
//有人试图连接,处理连接
System.out.println(“播放器连接”);
this.in=new BufferedReader(新的InputStreamReader(this.other.getInputStream());
this.out=新的PrintWriter(this.other.getOutputStream(),true);
//自动刷新已启用^^^^
//这不会到达客户端
此.sendMessage(“连接主机”);
}
//我们目前已连接到另一台计算机,无需查找更多信息
否则{
字符串输入=this.in.readLine();
System.out.println(“已接收“+”输入“+””);
如果(输入!=null){
//处理输入
}
}
}捕获(ioe异常ioe){
ioe.printStackTrace();
}
发送代码
if(this.out!=null){
//看,它是println,所以我不需要调用.flush()。。。
this.out.println(消息);
System.out.println(“已发送“+”消息“+””);
}
连接命令代码
试试看{
//主持人注意到了这一点
this.other=新插座(ip,端口);
this.in=new BufferedReader(新的InputStreamReader(this.other.getInputStream());
this.out=新的PrintWriter(this.other.getOutputStream(),true);
//工作
本文件为发送消息(“测试”);
}捕获(ioe异常ioe){
ioe.printStackTrace();
}
问题 它应该在连接器上打印出
收到的“connectHost”
,但这不会发生。相反,它阻止在未接收数据的情况下调用.readLine()中的
in
。如果我在.ready()中插入一个
检查,它将始终返回
false

连接器控制台
正在端口57479上查找连接
connectlocalhost 57478//用于连接到主机的命令
已发送“test”//成功转到主机
//现在它阻塞了。这是有意的,但它应该事先说“已收到‘connectHost’”。
主机控制台
正在端口57478上查找连接
播放器连接
已发送“连接主机”
接收到“test”//主机获取它
//这也会阻塞,等待更多消息,但这是有意的。
更新: 我只是尝试在连接后直接发送一条消息(请参阅更新的代码),主机收到了消息。连接器仍然无法从主机获取连接器。

很明显。。。
serverSocket.accept()
被阻塞,导致连接器无法读取输入。因此.readLine()中的
不是问题所在。我这样做是为了用户必须告诉程序监听连接。现在它起作用了

新代码 监听码
try(ServerSocket ServerSocket=newserversocket(this.port)){
if(this.listening&(this.other==null | | this.other.isClosed()){
System.out.println(“在端口上查找连接”+serverSocket.getLocalPort());
this.in=null;
this.out=null;
this.other=serverSocket.accept();
this.in=new BufferedReader(新的InputStreamReader(this.other.getInputStream());
this.out=新的PrintWriter(this.other.getOutputStream(),true);
}如果(this.in!=null){System.out.println(“查找输入”);
字符串输入=this.in.readLine();
System.out.println(“已接收“+”输入“+””);
如果(输入!=null){
//过程输入
}
}
}捕获(ioe异常ioe){
ioe.printStackTrace();
}
发送代码未更改

连接代码
if(input.contains(“connect”)){
字符串[]args=input.replaceAll(“connect”,“”)。拆分(“”);
字符串ip=args[0];
int port=Integer.parseInt(args[1]);
试一试{
this.other=新插座(ip,端口);
this.in=new BufferedReader(新的InputStreamReader(this.other.getInputStream());
this.out=新的PrintWriter(this.other.getOutputStream(),true);
此.sendMessage(“连接”);
}捕获(ioe异常ioe){
ioe.printStackTrace();
}
}else if(input.contains(“listen”)){
这是真的;
}

打印您标记为“连接器控制台”的代码在哪里?如果您同时从服务器和客户端发送(和接收),则每个侦听套接字都需要单独的线程“连接代码”不设置this.in或this.out,这是故意的吗?@Thrarry Wombat有两个相同代码的实例在运行。@immibis看到你的评论,我试过了,但没有区别。