Java 套接字问题-readline赢了';我不能正常工作
我尝试使用套接字编写客户端和服务器连接的代码。问题是我的客户端无法从服务器读取响应(它挂在读取线上) 下面是一些代码 服务器: 线程: 客户:Java 套接字问题-readline赢了';我不能正常工作,java,sockets,Java,Sockets,我尝试使用套接字编写客户端和服务器连接的代码。问题是我的客户端无法从服务器读取响应(它挂在读取线上) 下面是一些代码 服务器: 线程: 客户: 试试看{ //创建服务器套接字。 simSocket=新套接字(“192.168.52.27”,端口号); }捕获(ioe异常ioe){ System.out.println(“错误消息:+ioe.getMessage()); } BufferedReader in=null; PrintWriter out=null; 试一试{ in=新的Buffer
试试看{
//创建服务器套接字。
simSocket=新套接字(“192.168.52.27”,端口号);
}捕获(ioe异常ioe){
System.out.println(“错误消息:+ioe.getMessage());
}
BufferedReader in=null;
PrintWriter out=null;
试一试{
in=新的BufferedReader(新的InputStreamReader(simSocket.getInputStream());
out=新的PrintWriter(新的OutputStreamWriter(simSocket.getOutputStream());
写下(“我的信息”);
out.flush();
做{
response=in.readLine();//这是代码挂起的地方
}而(response.length()可能是因为clientResponse
(由服务器线程发送)为null
,客户端正在等待响应大小>0吗?可能是因为clientResponse
(由服务器线程发送)是null
并且客户端正在等待响应大小>0?根据javaDoc,服务器响应实际上是
"My Message:\n"+System.getProperty("line.separator")
我敢打赌,in.readLine()
至少可以正常工作一次,但是您可以忽略响应,因为print命令在循环之外。将该命令向上移动,您应该可以在控制台上看到响应
服务器println()
不真正发送\n
字符的可能性(非常小)。因此,您可以在线程代码处尝试以下操作:
out.print(clientResponse+"\n\n"); // exchanged println with an extra \n char
根据javaDoc,服务器响应实际上是
"My Message:\n"+System.getProperty("line.separator")
我敢打赌,in.readLine()
至少可以正常工作一次,但是您可以忽略响应,因为print命令在循环之外。将该命令向上移动,您应该可以在控制台上看到响应
服务器println()
不真正发送\n
字符的可能性(非常小)。因此,您可以在线程代码处尝试以下操作:
out.print(clientResponse+"\n\n"); // exchanged println with an extra \n char
好的,我已经解决了这个问题。挂起的不是客户端,而是服务器。它尝试从客户端读取一行文本,但客户端不发送行分隔符:
out.write("My message");
out.flush();
将write()替换为println()。好的,我已经解决了这个问题。挂起的不是客户端,而是服务器。它尝试从客户端读取一行文本,但客户端不发送行分隔符:
out.write("My message");
out.flush();
将write()替换为println()。好的,我对代码进行了多次编辑,现在它运行良好:
服务器:
try {
// Create the server socket.
portNumber = Integer.parseInt(myParam.get("socket.portNumber"));
mainSocket = new ServerSocket(portNumber);
} catch (IOException ioe) {
System.out.println("Error Message : " + ioe.getMessage());
}
// Accept connections
try {
clientSocket = mainSocket.accept();
} catch (IOException ioe) {
System.out.println("Error Message : " + ioe.getMessage());
}
BufferedReader in = null;
PrintWriter out = null;
while (true) {
try {
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
out = new PrintWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
//Read The Message
**StringBuffer buffer = new StringBuffer();
while (true) {
int ch = in.read();
if ((ch < 0) || (ch == '\n')) {
break;
}
buffer.append((char) ch);
}
String clientRequest = buffer.toString();**
SocketServerThread st = new SocketServerThread(clientRequest, out);
st.start();
} catch (IOException ioe) {
System.out.println("Can't accept connection. Error message :" + ioe.getMessage());
}
}
试试看{
//创建服务器套接字。
portNumber=Integer.parseInt(myParam.get(“socket.portNumber”);
mainSocket=新服务器套接字(端口号);
}捕获(ioe异常ioe){
System.out.println(“错误消息:+ioe.getMessage());
}
//接受连接
试一试{
clientSocket=mainSocket.accept();
}捕获(ioe异常ioe){
System.out.println(“错误消息:+ioe.getMessage());
}
BufferedReader in=null;
PrintWriter out=null;
while(true){
试一试{
in=new BufferedReader(新的InputStreamReader(clientSocket.getInputStream());
out=新的PrintWriter(新的OutputStreamWriter(clientSocket.getOutputStream());
//读留言
**StringBuffer=新的StringBuffer();
while(true){
int ch=in.read();
如果((ch<0)| |(ch='\n')){
打破
}
append((char)ch);
}
字符串clientRequest=buffer.toString()**
SocketServerThread st=新的SocketServerThread(clientRequest,out);
st.start();
}捕获(ioe异常ioe){
System.out.println(“无法接受连接。错误消息:”+ioe.getMessage());
}
}
我用read更改了readline,它就可以工作了,所以“\n”是问题所在的假设是正确的
线程:
线程中的一个小更改(删除读取请求部分,因为我已经在服务器中完成了此操作)
客户:
将readline更改为read,就像服务器一样
谢谢大家的帮助好的,我对代码进行了几次编辑,现在它运行得很好:
out.write("My message");
服务器:
try {
// Create the server socket.
portNumber = Integer.parseInt(myParam.get("socket.portNumber"));
mainSocket = new ServerSocket(portNumber);
} catch (IOException ioe) {
System.out.println("Error Message : " + ioe.getMessage());
}
// Accept connections
try {
clientSocket = mainSocket.accept();
} catch (IOException ioe) {
System.out.println("Error Message : " + ioe.getMessage());
}
BufferedReader in = null;
PrintWriter out = null;
while (true) {
try {
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
out = new PrintWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
//Read The Message
**StringBuffer buffer = new StringBuffer();
while (true) {
int ch = in.read();
if ((ch < 0) || (ch == '\n')) {
break;
}
buffer.append((char) ch);
}
String clientRequest = buffer.toString();**
SocketServerThread st = new SocketServerThread(clientRequest, out);
st.start();
} catch (IOException ioe) {
System.out.println("Can't accept connection. Error message :" + ioe.getMessage());
}
}
试试看{
//创建服务器套接字。
portNumber=Integer.parseInt(myParam.get(“socket.portNumber”);
mainSocket=新服务器套接字(端口号);
}捕获(ioe异常ioe){
System.out.println(“错误消息:+ioe.getMessage());
}
//接受连接
试一试{
clientSocket=mainSocket.accept();
}捕获(ioe异常ioe){
System.out.println(“错误消息:+ioe.getMessage());
}
BufferedReader in=null;
PrintWriter out=null;
while(true){
试一试{
in=new BufferedReader(新的InputStreamReader(clientSocket.getInputStream());
out=新的PrintWriter(新的OutputStreamWriter(clientSocket.getOutputStream());
//读留言
**StringBuffer=新的StringBuffer();
while(true){
int ch=in.read();
如果((ch<0)| |(ch='\n')){
打破
}
append((char)ch);
}
字符串clientRequest=buffer.toString()**
SocketServerThread st=新的SocketServerThread(clientRequest,out);
st.start();
}捕获(ioe异常ioe){
System.out.println(“无法接受连接。错误消息:”+ioe.getMessage());
}
}
我用read更改了readline,它就可以工作了,所以“\n”是问题所在的假设是正确的
线程:
线程中的微小更改(删除读取请求部分,因为我已经这样做了
do{
response = in.readLine(); //This is where the code hang
}while (response.length()<= 0);
while ((response = in.readLine()) != null) {
// if (response.length() == 0) continue; // if you must
// process the line
}
// when you get here EOS has occurred.