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,因此,服务器程序由以下代码组成: import java.io.*; 导入java.net。*; 导入java.util.*; 公共类时间服务器{ 公共静态void main(字符串[]args){ 试一试{ //创建套接字 ServerSocket ss=新的ServerSocket(60000); 套接字rs=ss.accept(); //创建流 BufferedInputStream bs=新的BufferedInputStream(rs.getInputStream()); InputS

因此,服务器程序由以下代码组成:

import java.io.*;
导入java.net。*;
导入java.util.*;
公共类时间服务器{
公共静态void main(字符串[]args){
试一试{
//创建套接字
ServerSocket ss=新的ServerSocket(60000);
套接字rs=ss.accept();
//创建流
BufferedInputStream bs=新的BufferedInputStream(rs.getInputStream());
InputStreamReader isr=新的InputStreamReader(bs);
BufferedOutputStream bos=新的BufferedOutputStream(rs.getOutputStream());
PrintWriter pw=新的PrintWriter(bos);
//设置超时
塞索蒂梅奥特卢比(20000);
int c=0;
StringBuilder sb=新的StringBuilder();
//while循环读入字符直到一个句点(包括句点)
而(((char)c!='.')){
c=isr.read();
//将每个字符附加到字符串生成器
sb.附加((char)c);
}
//将stringbuilder转换为字符串
字符串str=sb.子字符串(0);
//如果字符串等于“time.”,则返回time-else错误消息
如果(str.compareTo(“时间”)==0){
现在日期=新日期();
print(“时间是:+now.toString());
pw.flush();
}
否则{
print(“无效语法:连接已关闭”);
pw.flush();
}
//闭合插座
rs.close();
//关闭服务器套接字
ss.close();
}捕获(IOI异常){
System.out.println(i.getMessage());
}
}
}
客户端的代码为:

import java.io.*;
导入java.net。*;
导入java.util.*;
公共类时间客户端{
公共静态void main(字符串[]args){
试一试{
//创建套接字
Socket sock=新套接字(“localhost”,60000);
//创建流
BufferedInputStream bis=新的BufferedInputStream(sock.getInputStream());
InputStreamReader isr=新的InputStreamReader(bis);
BufferedOutputStream bos=新的BufferedOutputStream(sock.getOutputStream());
PrintWriter pw=新的PrintWriter(bos);
//设置超时
短袜的设置时间(20000);
//将参数写入流,参数应为“时间”。若要接收时间
pw.write(args[0]);
pw.flush();
int c=0;
StringBuilder sb=新的StringBuilder();
//while循环将每个字符读入stringbuilder
而((c!=-1)){
c=isr.read();
sb.附加((char)c);
}
//stringbuilder转换为字符串并打印
字符串str=sb.子字符串(0);
系统输出打印项次(str);
//插座闭合
sock.close();
}捕获(IOI异常){
System.out.println(i.getMessage());
}
}
}

问题是,如果我在一个单独的cmd.exe中运行每个程序,尽管使用localhost作为IP地址,但它们不会通信。我似乎在代码中找不到导致此问题的逻辑错误,并想知道是否有人可以提供帮助?

问题是您正在使用BufferedOutputStream,在PrintWriter上写入后立即关闭套接字。您所写的内容将保留在缓冲区中,并且在将任何内容发送到客户端之前,套接字将关闭

要强制发送缓冲区的内容,需要在关闭前
刷新

...
//close socket
pw.flush();
rs.close();
...

TimeClient包含一个小错误:您循环接收,直到得到一个正确的
-1
,但您将该
-1
附加到
StringBuilder
,这是错误的。应该是:

//while loop reads each character into stringbuilder
while(true){
c = isr.read();
if (c == -1) { break; }
sb.append((char) c);
}

但这永远不会阻止文本显示…

您需要关闭
pw
以便刷新它,而不是刷新套接字。不要忽略异常。没有抛出异常,代码编译良好。问题是两个程序都不通信。代码编译的精细与没有抛出异常无关,对于那些catch子句,您不知道是否抛出了一个。当然,也不知道是否打印堆栈跟踪。所以你还没有解决我在第一条评论中提到的问题。我在代码中写了所有的方法,但是我面临一个空白screen@ABC123我再也不能繁殖了。我已经为客户端和服务器获取了您的代码。我确保两个jar都是在一个cmd窗口
java-jar timeserver.jar
中生成的,在第二个窗口
java-jar timeclient.jar time.
中生成的,然后进入后者:
时间是:Wed Jul 10 15:08:48 CEST 2019?
。最后一个
'\uffff'
的表示形式。我正在准备一个关于这个的编辑。