今天尝试java socket ,碰到了问题,服务器端和客户端可以连通,服务器端收到客户端链接后,给客户端发送一个信息,但是客户端不知道为什么收到这个信息,貌似开在readline那里了。
有人能帮忙看看吗:
客户端import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;
public class mainJava { //static String ip = "127.0.0.1";//
static int port = 8888; 
/**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Socket sc= new Socket ("127.0.0.1",8888);
if(sc!=null)
{
sc.setKeepAlive(true);
OutputStreamWriter os = new OutputStreamWriter(sc.getOutputStream()); 
            BufferedWriter bw = new BufferedWriter(os); //将字节流包装为字符流(根据大家需求而定) 
            bw.write("发送一个请求给服务器"); //写入请求信息 
            BufferedReader br = getReader(sc);
            //sc.
            String tmpstr = "";
            boolean isFinish = false;
            while(isFinish==false)
            {
             tmpstr=br.readLine();
            
             if(tmpstr!=null)
             {
             if(tmpstr=="end")
             {
             isFinish = true;
             }else
             {
             System.out.println(tmpstr);
             }
             }else
             {
            
             }
             System.out.println("收到消息");
            }
}

            
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}  catch(SocketException e)
{
System.out.println("连接失败");
//e.printStackTrace();
e.getCause();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static BufferedReader getReader(Socket socket) throws IOException {  
        InputStream in = socket.getInputStream();  
        return new BufferedReader(new InputStreamReader(in));  
    }  }服务器import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class testSocket { /**
 * @param args
 */
static int port = 8888;
public static void main(String[] args) {
// TODO Auto-generated method stub
 try {
ServerSocket listensocket = new ServerSocket(port);
Socket tmp = null;
int counter = 1;
boolean flag = true;
System.out.println("-------->Server");
while(flag)
{
tmp = listensocket.accept();
OutputStreamWriter os = new OutputStreamWriter(tmp.getOutputStream()); 
BufferedWriter bw = new BufferedWriter(os); 
bw.write("发送给客户端一个相应"); 
bw.flush();
//BufferedReader br = getReader(sc);
counter++;
if(counter == 10)
{
flag = false;
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}   
}}

解决方案 »

  1.   

    socket的outputstream是向服务器发送信息,
    socket的inputstream是读取服务器返回的信息,
    你的getreader方法中取的就是inputstream
      

  2.   


     bw.write("发送给客户端一个相应"); 
    bw.writr("\n");加上bw.writr("\n");试试
      

  3.   

    我在server端添加了bw.close();就可以收到了,但是出现了新的问题,读取第一次服务端返回后,readLine()函数就一直返回null,为什么会出现这种情况,如果能够实现服务器与客户端的来回多次数据传输。
    客户端import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.Socket;
    import java.net.SocketException;
    import java.net.UnknownHostException;
    public class mainJava { //static String ip = "127.0.0.1";//
    static int port = 8888; 
    /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    try {
    Socket sc= new Socket ("127.0.0.1",8888);
    if(sc!=null)
    {
    //sc.setKeepAlive(true);
    OutputStreamWriter os = new OutputStreamWriter(sc.getOutputStream()); 
                BufferedWriter bw = new BufferedWriter(os); //将字节流包装为字符流(根据大家需求而定) 
                bw.write("发送一个请求给服务器"); //写入请求信息 
               
                
                InputStream in = sc.getInputStream();  
                
                BufferedReader br = new BufferedReader(new InputStreamReader(in));
                
                //BufferedReader br = getReader(sc);
                //PrintWriter os = new PrintWriter(sc.);
                //sc.
                String tmpstr = "";
                boolean isFinish = false;
                int tmps = 0;
              /*  while((tmpstr=br.readLine())!=null)
                {
                 //tmpstr=br.readLine();
                
                 if(tmpstr!=null)
                 {
                 if(tmpstr=="end")
                 {
                 isFinish = true;
                 }else
                 {
                 System.out.println(tmpstr);
                 }
                 }else
                 {
                 System.out.println("收到消息");
                 }
                // tmpstr=br.readLine();
                 //br.;
                // br.close();
                 //br = getReader(sc);
                  //InputStream in = sc.getInputStream();  
                 //in.reset();
                 //br = new BufferedReader(new InputStreamReader(sc.getInputStream()));
                }*/
    while (true) {
    String str = br.readLine();
    System.out.println(str);
    //out.println("has receive....");
    //out.flush();
    System.out.println(tmpstr);
    if(str==null)
    {
    continue;
    }
    if (str.equals("end"))
    break;
    }
             bw.write("发送一个请求给服务器");
                if(sc.isConnected())
                {
                 System.out.println("lianjie");
                }else
                {
                 System.out.println("duankai");
                }
    }

                
    } catch (UnknownHostException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    System.out.println(e.getCause());
    }  catch(SocketException e)
    {
    e.printStackTrace();
    System.out.println(e.getCause());
    //e.printStackTrace();
    e.getCause();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    System.out.println(e.getCause());
    }
    }
    private static BufferedReader getReader(Socket socket) throws IOException {  
            InputStream in = socket.getInputStream();  
            return new BufferedReader(new InputStreamReader(in));  
        }  }服务器import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    public class testSocket { /**
     * @param args
     */
    static int port = 8888;
    public static void main(String[] args) throws InterruptedException {
    // TODO Auto-generated method stub
     try {
    ServerSocket listensocket = new ServerSocket(port);
    Socket tmp = null;
    int counter = 1;
    boolean flag = true;
    System.out.println("-------->Server");
    tmp = listensocket.accept();
    while(flag)
    {
    OutputStreamWriter os = new OutputStreamWriter(tmp.getOutputStream()); 
    BufferedWriter bw = new BufferedWriter(os); 
    bw.write("发送给客户端一个响应"); 
    //bw.flush();
    bw.close();
    //bw.write("\n");
    //BufferedReader br = getReader(sc);
    counter++;
    if(counter == 5)
    {
    flag = false;
    }
    Thread.sleep(30000);
    }
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }   
    }}
      

  4.   

    是如何能够实现服务器端与客户端的多轮交互,因为客户端接收一次后,后面就一直返回null
      

  5.   

    3楼的都已经说了,楼主你没做测试吧?你客户端用readLine,那么服务器端不发送“\n”,就意味着line没有结束,当然持续阻塞。
    bw.write("发送给客户端一个响应\n");
      

  6.   

    不好意思,我做过测试,不过因为我后面的代码改过了(因为自己也在网上找解决方法,把bw.flush()去掉了,你可以看我第二次贴的代码),仅仅加个“\n”是还是不行的。把bw.flush补上后,就可以了。但是我用了bw.close()也可以了,但是引发了返回null的问题,就是我的第二次提问。
    现在我有两个问题:1. 我用了bw.close()也可以,为什么readline在接收一次之后,就开始返回null
    2. 我使用3楼的方法,传输几次之后,就出现了connection reset的错误哦
      

  7.   

    1. 我用了bw.close()也可以,为什么readline在接收一次之后,就开始返回null
    2. 我使用3楼的方法,传输几次之后,就出现了connection reset的错误
      

  8.   

    抱歉,“2. 我使用3楼的方法,传输几次之后,就出现了connection reset的错误”可能是我自己计数的问题,草率了
      

  9.   

    1. 我用了bw.close()也可以,为什么readline在接收一次之后,就开始返回null
    bw.close() 意味着都关闭流了,readLine当然啥都读不到了