我尝试使用套接字编写客户端和服务器连接。问题是我的客户端无法读取来自服务器的响应(它挂在readline上)。
以下是部分代码。
服务器:
try {
// Create the server socket.
portNumber = Integer.parseInt(myParam.get("socket.portNumber"));
System.out.println(portNumber);
mainSocket = new ServerSocket(portNumber);
} catch (IOException ioe) {
System.out.println("Error Message : "+ioe.getMessage());
}
while(true)
{
try
{
// Accept connections
Socket clientSocket = mainSocket.accept();
SocketServerThread st = new SocketServerThread (clientSocket);
st.start();
}
catch(IOException ioe)
{
System.out.println("Error message :"+ioe.getMessage());
}
}主线:
public void run() {
BufferedReader in = null;
PrintWriter out = null;
String clientResponse = null;
try {
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
out = new PrintWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
//Read The Message
String clientRequest = in.readLine();
System.out.println("Message recieved : " + clientRequest);
//Process the message
// Send response
out.println(clientResponse+"\n");
out.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
// Clean up
try {
in.close();
out.close();
clientSocket.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}客户端:
try {
// Create the server socket.
simSocket = new Socket("192.168.52.27", portNumber);
} catch (IOException ioe) {
System.out.println("Error Message : " + ioe.getMessage());
}
BufferedReader in = null;
PrintWriter out = null;
try {
in = new BufferedReader(new InputStreamReader(simSocket.getInputStream()));
out = new PrintWriter(new OutputStreamWriter(simSocket.getOutputStream()));
out.write("My message");
out.flush();
do{
response = in.readLine(); //This is where the code hang
}while (response.length()<= 0);
System.out.print(response);
} catch (IOException ioe) {
System.out.println("Error message :" + ioe.getMessage());
} finally {
try {
in.close();
out.close();
simSocket.close();
} catch (IOException ioException) {
ioException.printStackTrace();
}
}你们能告诉我出了什么问题吗?非常感谢你的帮助
发布于 2010-12-16 15:50:08
好的,我已经弄清楚了。挂起的不是客户端,而是服务器。它尝试从客户端读取一行文本,但客户端没有发送行分隔符:
out.write("My message");
out.flush();在这里用println()替换write()。
发布于 2010-12-16 17:34:17
好了,我在代码中做了几次编辑,现在它运行得很好:
服务器:
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());
}
}我用read修改了readline,它工作了,所以"\n“是问题的假设是正确的。
线程:线程中的一个小变化(删除读取请求部分,因为我已经在服务器中完成了该部分)
客户端:将readline更改为read,就像服务器端一样。
感谢大家的帮助
发布于 2010-12-17 12:58:56
out.write("My message");这不会发送行终止符,因此它永远不会被读取。使用println()。
out.println(clientResponse+"\n");这将发送clientResponse +换行符+a \n。最后一部分可能会被解释为空行。这没有多大意义。删除\n。
do{
response = in.readLine(); //This is where the code hang
}while (response.length()<= 0);这不是读行的正确方式。它将在EOS上获得NPE;响应长度永远不能为负;为什么要给自己发送空行?正确的方法是:
while ((response = in.readLine()) != null) {
// if (response.length() == 0) continue; // if you must
// process the line
}
// when you get here EOS has occurred.https://stackoverflow.com/questions/4457975
复制相似问题