下边的代码,如果我去掉红色部分,client端就能执行通过,只是不能所收到server的返回值,但是如果我加上红色部分,程序就卡死在那里了,请问,我如何才能既发送到服务器端,又能接收到服务器的返回信息呢?
void beginlogin()
    {   
        String send_info=Main.sessionno.toString().trim()+","+Main.sessionpwd.toString().trim();
        
        try{
        link_server_ip=java.net.InetAddress.getByName("www.abc.net").getHostAddress().toString();
        link_sa=new java.net.InetSocketAddress(link_server_ip,java.lang.Integer.parseInt(link_sports));        link_server.connect(link_sa);
        link_sosw=new OutputStreamWriter(link_server.getOutputStream());
        link_bwout=new BufferedWriter(link_sosw);
        link_in=new BufferedReader(c_isr=new InputStreamReader(link_server.getInputStream()));
        
        link_bwout.write(Main.flag.toString().trim()+","+Main.sessionno.toString().trim()+","+Main.sessionpwd.toString().trim());
        link_bwout.flush();
        
        String readstr=null;
       while(true)
       {
            
            if((readstr=link_in.readLine())==null)
            {
            break;
            }
            else
            {
                jLabel1.setText((readstr=link_in.readLine()));
            }
       }
       
        
        link_server.close();
        }
        catch(Exception e)
        {
            
        }
        
    }

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【cqandy】截止到2008-07-28 03:21:23的历史汇总数据(不包括此帖):
    发帖的总数量:14                       发帖的总分数:450                      每贴平均分数:32                       
    回帖的总数量:13                       得分贴总数量:1                        回帖的得分率:7%                       
    结贴的总数量:13                       结贴的总分数:400                      
    无满意结贴数:1                        无满意结贴分:50                       
    未结的帖子数:1                        未结的总分数:50                       
    结贴的百分比:92.86 %               结分的百分比:88.89 %                  
    无满意结贴率:7.69  %               无满意结分率:12.50 %                  
    值得尊敬
      

  2.   

    写两个方法就可以啊,比如客户端发送过去,
    server收到然后再作为一个方法的参数,客户端再用流得到不就好了。
      

  3.   

    link_in.readLine 服务器端流关了才能读到
    你可以换成按字节读取,或字符读取应该没有阻塞.
      

  4.   

    首先 , jLabel1.setText((readstr=link_in.readLine())); 这个,我觉得应该改成 jLabel1.setText(readstr); 
    其次 , while循环,其循环条件尽量不要用常量true .
    第三 , GUI编程,同时又涉及到IO操作的,一般要做成异步处理模式的.因为,void beginlogin() 这个方法,是图形绘制线程来调用的,所以,当你这个方法无法及时返回的情况下,用户的界面会处于僵死状态.
    第四 , 楼主应该设计一个比较好的结构,将通讯,数据通道和图形显式分成三部分来完成,这样,结构清晰,也容易排错.当然,这就涉及到多线程了.
    第五 , 按照我的设计思路,提一下我自己的看法,看看能否给楼主启示.A.设计两个队列,一个用于存放接收过来的数据,一个存放要发送的数据.可以使用collections.synchronizedList(new LinkedList);方法来创建.
    B.设计一个接收队列的监听线程,查看接收队列中是否有数据,如果有,就调用图形界面的相关方法,将数据显式到图形界面,如果没有sleep上100毫秒继续查看.
    C.将图形界面的发送代码做一下更改,发送方法(比如beginlogin()方法)只将数据放到发送队列,设置一些辅助的显式信息(如正在发送请等待之类的),就可以了.
    D.编写两个线程,用于对Socket进行操作,一个将发送队列的内容发送出去,一个接收数据,将接收到的数据放入接收队列.这两个线程都是循环的,要注意,当没有数据处理的情况下,要进行sleep或退出循环的操作.如上所述,应该可以肆意收发消息了,只要针对发送队列和接收队列的监听线程进行编程,就可以搞定了.
      

  5.   

    我大概猜到问题了
    readLine()方法只有在读取到终结字符时才会终止(比如\n)
    你在server端发送的字符串后面加个“\n”或“\r”应该就没问题了。
      

  6.   

    下边是在下服务器端处理接入的代码,请老师指导一下,为何不能回传信息到客户端???下边红色部分代码如果不加上去,程序就可以正常执行过去,加上了,就卡死了,请老师指教public Main()
    {
        waitlink();
    }void waitlink()
        {
            try
            {
                ss=new ServerSocket(9871);
                
                    servers=ss.accept();                sdis=new BufferedReader(isr=new InputStreamReader(servers.getInputStream()));
                    
                                    String lineStr = sdis.readLine();
                    System.out.println(lineStr);
                    jta1.setText(lineStr);jta1.repaint();
                    if(lineStr.toString().startsWith("注册"))
                    {
                        
                            String reginsert="insert into info values('";                        for(int i=1;i<lineStr.toString().split(",").length;i++)
                            {
                                reginsert+=lineStr.toString().split(",")[i].toString()+"','";
                            }                           reginsert+="否','";
                               String clientip=servers.getInetAddress().toString();
                               reginsert+=clientip+"','";                           String clientport=String.valueOf(servers.getPort());                                           reginsert+=clientport+"','";                           try{
                                Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
                                String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=hc";
                                    String user="sa";
                                    String password="abcde";
                                    Connection con=java.sql.DriverManager.getConnection(url,user,password);
                                    Statement stmt=con.createStatement();
                                    String sql="SELECT MAX(CONVERT(int, hhno)) AS no FROM info";
                                    rs=stmt.executeQuery(sql); 
                                    while(rs.next())
                                    {
                                        if(rs.getString(1)==null)
                                        {
                                            reginsert+="1')";
                                        }
                                        else
                                        {
                                            int newno=Integer.parseInt(rs.getString(1))+1;
                                            reginsert+=String.valueOf(newno)+"')";
                                        }
                                    }
                                    ss.close();
                                    stmt.executeUpdate(reginsert);
                                   }
                                   catch(Exception err)
                                   {
                                       err.printStackTrace();
                                   }
                       ss.close(); 
                       
                    }
                    else
                    {
                        ss.close();
                        jta1.setText("服务器返回值:"+lineStr);jta1.repaint();
                        bw=new java.io.BufferedWriter(osw=new OutputStreamWriter(servers.getOutputStream()));
                        bw.write("从server返回的数据\n");
                        
                        
                    }
                    
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
            
        }
      

  7.   

    把ss.close(); 
    放到jta1.setText("服务器返回值:"+lineStr);jta1.repaint(); 
    bw=new java.io.BufferedWriter(osw=new OutputStreamWriter(servers.getOutputStream())); 
    bw.write("从server返回的数据\n"); 
    后面试试.
      

  8.   

    还是一样的锁死,要命呀!!!
    preferme 兄说的,我也知道,应该这样做,但关于synchronize还没有学到这里来,我只是想成功一次socket及serversocket收发通讯而以还请各位老师指教
      

  9.   

    写两个方法,一个发送,一个接受,while(true)用于接受 
      

  10.   


    server
    package com.half.socket;import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    public class ServerSocketImpl {
    public static void main(String[] args){
    try {
    ServerSocket serverS=new ServerSocket(1234);
    Socket socketC=null;
    while(true){
    socketC=serverS.accept();
    DealSocket cl=new DealSocket(socketC);
    new Thread(cl).start();
    }
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }}
      

  11.   


    Thread
    package com.half.socket;import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.io.DataInputStream;public class DealSocket implements Runnable{
    private Socket socketC;
    public DealSocket(Socket socketC) {
    // TODO Auto-generated constructor stub
    this.socketC=socketC;
    } public void run() {
    // TODO Auto-generated method stub
    File f=new File("C:\\test.txt");
    DataInputStream data;
    StringBuffer bb=new StringBuffer();
    try {
    data = new DataInputStream(new FileInputStream(f));
    byte b[]=new byte[(int)f.length()];
    data.read(b,0,(int)f.length());
    PrintWriter pw=new PrintWriter(socketC.getOutputStream());
    BufferedReader br=new BufferedReader(new InputStreamReader(socketC.getInputStream()));
    if(true){
    String str1=br.readLine();
    System.out.println("accept"+str1);
    bb.append(str1);
    }
    pw.print(new String(b)+"\r\n");
    pw.flush();
    pw.close();
    br.close();
    this.socketC.close();
    } catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    }
    }
      

  12.   


    client
    package com.half.socket;import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.net.UnknownHostException;public class ClientSocketImpl { public static void main(String[] args){
    try {
    Socket c=new Socket("127.0.0.1",1234);
    deal(c);

    } catch (UnknownHostException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    } private static void deal(Socket c) {
    // TODO Auto-generated method stub
    StringBuffer b=new StringBuffer();
    try {
    BufferedReader br=new BufferedReader(new InputStreamReader(c.getInputStream()));
    PrintWriter pw=new PrintWriter(c.getOutputStream());
    pw.print("test中文\r\n");
    pw.flush();
    if(true){
    String str=br.readLine();
    System.out.println("accept"+str);
    b.append(str);
    }
    pw.close();
    br.close();
    c.close();

    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }}