Java套接字在连接到服务器2期间发送一些数据
可能重复:Java套接字在连接到服务器2期间发送一些数据,java,sockets,Java,Sockets,可能重复: 我有两个非常简单的java程序-客户端和服务器。它们通过套接字建立连接。 服务器从流中读取字符并将其打印到控制台 import java.net.*; import java.io.*; import java.util.Date; public class DataServerSIMS { static final int LISTENING_PORT = 2002; public static void main(String[] args) {
我有两个非常简单的java程序-客户端和服务器。它们通过套接字建立连接。 服务器从流中读取字符并将其打印到控制台
import java.net.*;
import java.io.*;
import java.util.Date;
public class DataServerSIMS {
static final int LISTENING_PORT = 2002;
public static void main(String[] args) {
ServerSocket listener; //Checks the connection requests
Socket connection; //To interact with other progs
Reader incoming; //Stream
try {
listener = new ServerSocket(LISTENING_PORT);
TextIO.putln("Listening on port "+LISTENING_PORT);
while (true) {
connection = listener.accept();
try {
incoming = new InputStreamReader(connection.getInputStream());
while (true) {
int ch = incoming.read();
if (ch == 1 || ch == '\r')
break;
System.out.print((char)ch);
}
System.out.println();
incoming.close();
}
catch (IOException e) {
TextIO.putln("Error: "+e);
}//end try recieving data
}//end while
}
catch (Exception e) {
TextIO.putln("Sorry, the server has shut down.");
TextIO.putln("Error: "+e);
return;
}
}
}
客户端仅建立套接字连接
import java.net.*;
import java.io.*;
import java.util.Date;
public class TempClientSIMS {
//static final int LISTENING_PORT = 32007;
static final int LISTENING_PORT = 2002;
public static void main(String[] args) {
ServerSocket listener; //Checsk the connection requests
Socket connection; //To interact with other progs
Socket connectionToServer = null; //Socket
Reader incoming; //Stream
try {
TextIO.putln("Localhost connects to:"+LISTENING_PORT);
connectionToServer = new Socket ("localhost", 2002);
TextIO.putln("Connected ");
long i=0;
while (i<2000000000) {
i++;
}
}
catch (Exception e) {
TextIO.putln("Sorry, the server has shut down.");
TextIO.putln("Error: "+e);
return;
}
}
}
服务器打印:
Listening on port 2002
FdsfsdfsError: java.net.SocketException: Connection reset
很明显,为什么服务器控制台上会打印此字符串“Error:java.net.SocketException:Connection reset
”。
但我不知道它是什么意思:“Fdsfsdfs
”?
我是否可以阻止打印此字符串“
Fdsfsdfs
”?从服务器上的流读取时,您没有检查EOS。如果读取的结果等于-1,则应该中断while循环
大概是这样的:
while (true) {
int ch = incoming.read();
if (ch == -1)
break;
}
...
还可以使用Thread.sleep()暂停执行。在服务器上读取流时,您没有检查EOS。如果读取的结果等于-1,则应该中断while循环 大概是这样的:
while (true) {
int ch = incoming.read();
if (ch == -1)
break;
}
...
还可以使用Thread.sleep()暂停执行。当套接字关闭时,ch将<0。您的代码无法处理此问题。当套接字关闭时,ch将<0。您的代码无法处理该问题。您不需要使用Reader检查流结束。将该检查添加到代码中
您不需要使用Reader检查流的结尾。将该检查添加到代码中
谢谢你的回答。这真的很有帮助!谢谢你的回答。这真的很有帮助!好啊非常感谢。这对我来说也很有趣:如果我以后想执行另一个I/O操作,我应该在执行I/O操作后关闭套接字吗?@Vladimir如果你得到<0,或者任何除SocketTimeoutException之外的IOException。如果我想执行两个conSequentive写入,该怎么办:OutputStream outToServerStream;outToServerStream=connectionToServer.getOutputStream();write(OutputArray);outToServerStream.flush();这是正常的做法吗?或者最好在第一次写入操作后关闭套接字连接,并为下一次写入操作建立新连接?好!非常感谢。这对我来说也很有趣:如果我以后想执行另一个I/O操作,我应该在执行I/O操作后关闭套接字吗?@Vladimir如果你得到<0,或者任何除SocketTimeoutException之外的IOException。如果我想执行两个conSequentive写入,该怎么办:OutputStream outToServerStream;outToServerStream=connectionToServer.getOutputStream();write(OutputArray);outToServerStream.flush();这是正常的做法吗?或者最好在第一次写入操作后关闭套接字连接,并为下一次写入操作建立新连接?
//Try this
while (true) {
int ch = incoming.read();
if (ch == 1 || ch == '\r'||ch == -1)
break;
System.out.print((char)ch);
}