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 套接字问题-readline赢了';我不能正常工作_Java_Sockets - Fatal编程技术网

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.