/************************************客户端*************************************/package wuhe.chat.client;import javax.swing.*;
import java.net.*;
import java.nio.*;
import java.nio.channels.*;
import java.io.*;
import java.util.*;public class Login extends JFrame
{
public Login()
{
try
{
SocketChannel sc=SocketChannel.open(new InetSocketAddress("www",9000));
PrintWriter pw=new PrintWriter(sc.socket().getOutputStream(),true);
BufferedReader br=new BufferedReader(new InputStreamReader(sc.socket().getInputStream()));

pw.println("注册");
pw.println("personnel");
pw.println("1234");

//下面这里死活接收不到数据
String reMsg=br.readLine();

if(reMsg==null)
{
System.out.println("对方已断开");
}
else
{
System.out.println("返回的是:" + reMsg);
}

}
catch(Exception err)
{
err.printStackTrace();
}
}

public static void main(String[] args)
{
new Login();
}
}

解决方案 »

  1.   

    你这个Login类中又没有循环一直临听运行一次就远了,怎么能读出数据????
      

  2.   

    //下面这里死活接收不到数据
    String reMsg=br.readLine();我只需要读取一次数据就行。无需循环。理论上:如果没有数据可读时,br.readLine();会一直停在这里,直到有数据可以读取,或对方关闭时。
      

  3.   

    我现在发现如果我把接收的线程中的while(true)改为if(true),就是不循环接收,这样就可以了。
    可是我不明白为什么会这样???
    //接收的数据
    class Receive extends Thread
    {
    private Vector<String> data;
    private String msg;
    public Receive()
    {
    data=new Vector<String>();
    }

    public void run()
    {
    try
    {
    if(true)          //原来的是while(true)
    {
    msg=br.readLine();

    if(msg.equals("注册"))
    {
    data.removeAllElements();
    data.addElement("注册");
    data.addElement(br.readLine()); //用户名
    data.addElement(br.readLine()); //密码

    addReceiveData(data);

    //如果在这里输出,这样客户端就可以收到了
    //pw.println("abc");
    }
    else
    {
    }
    }

    }
    catch(Exception err)
    {
    err.printStackTrace();
    }

    }
    }
      

  4.   

    啊/这样啊  是不是和run()里侦听有关系啊 while不断的的循环 释放不掉端口 就读不进来流中的内容啊
      

  5.   

    我测了半也天,也做不到啊,可能还是不能用一个Socket处理接收和发送;
      

  6.   

    是不是服务器端在执行:
    msg=br.readLine(); 时
    如果在服务器端另一个发送线程中执行:
    pw.println("数据"); //这个数据根本就发不出去的。我刚刚又试了另一种方法,我在服务器端的接收类Receive线程中的while(true)中加了一个sleep(2000);while(true)
    {
        ........    sleep(2000);
    }这样客户端也能收到消息.
    我想可能是服务器端在读取数据时:msg=br.readLine();不能同时在发送数据吧。
      

  7.   

    你是用tcp/ip协议做得,tcp/ip是单信道的,不能一条连接同时收发信息,要么你就开一条线层,在建立一条连接,然后做一下消息同步的处理;或者用多线层,这个我没有做过。