http://download.csdn.net/detail/longyangyangyang/4442165

解决方案 »

  1.   

    没有用哦,是要连续通话,多线程貌似还会读写阻塞。例如:
    服务端:
    import java.io.*;
    import java.net.*;
    import java.util.*;public class InteractiveServer 
    { /**
     * @param args
     */
    public static void main(String[] args) 
    {
    // TODO Auto-generated method stub
              try {
    ServerSocket server=new ServerSocket(7809);
    Socket socket;

    PrintWriter print;
    Scanner scan;
    while(true)
     {
    socket=server.accept();
    System.out.println("服务器收到");

        scan=new Scanner(socket.getInputStream());
        if(scan.hasNext()){System.out.println("服务器收到信息是:"+scan.next());}
        scan.close();
        System.out.println("服务器开始返回信息···");
        print=new PrintWriter(socket.getOutputStream());
        print.println("ok");
        print.flush();
        print.close();
        socket.close();
     }
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
              
    }}客户端:
    import java.net.*;
    import java.io.*;
    import java.util.*;public class IteractiveClient 
    { /**
     * @param args
     */
    public static void main(String[] args) 
    {
    // TODO Auto-generated method stub
    Socket soc = null;
    PrintWriter print = null;

            try {
    soc=new Socket("localhost",7809);
    System.out.println("客户端建立连接");
    print=new PrintWriter(soc.getOutputStream());

    Thread t1=new Thread(new OutThread(print));
    t1.start();

    Thread t2=new Thread(new InThread(soc));
    t2.start();
    } catch (UnknownHostException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    }}
    class OutThread implements Runnable
     {
    PrintWriter out;
    public OutThread(PrintWriter out)
     {
    this.out=out;
     }
    public void run()
     {
    System.out.println("客户端发送J2EE到服务器:");
    out.print("j2ee");
    out.flush();
     }
     }class InThread implements Runnable
     {
     Socket soc;
     Scanner in = null;
    public InThread(Socket soc)
     {
    this.soc=soc;
     }
    public void run()
     {
    try {
    in=new Scanner(soc.getInputStream());
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    try {
    Thread.sleep(4000);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    System.out.println("客户端接收:");
    if(in.hasNext()) 
    {
    System.out.println(in.next());
    }
    else{System.out.println("服务器无返回");}
    in.close();
    try {
    soc.close();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
     }
     }
    --------------------------------------------------------------------------------
    阻塞了···
      

  2.   

    不知道你要表达什么意思
    InputStream当然是阻塞的了,不阻塞那你让他读什么东西?
    这和连续传送数据并没有冲突
    一边写另一边读,有什么问题那?
      

  3.   

    老生长谈的问题。要达到你的效果,客户端和服务端分别要有两个socket,一个负责写,一个负责读。不能在一个socket既读又写的,因为会阻塞。
      

  4.   

    这个就是我的问题,其实我是最想问是否可以在同一个socket实现无阻塞。能不能控制时间片来达到无阻塞效果,而不是采用两个socket?或者运用线程优先级?
    真的没办法解决么?
      

  5.   

    我要表达的是:在服务器端和客户端都在一个socket既读又写,而又不形成阻塞。有没有解决这个问题的办法?
      

  6.   

    哥们,要达到通话效果需要将对数据流的操作封装在一个while循环里使得服务器发出流数据后刷新流,再重新处理输入流,显示客户反馈的数据;客户端处理输出流后及时刷新,再处理输入流。你客户端没有采用循环处理,因此只能通话一次,不能实现连续通话。具体代码不用说了吧,修改一下客户端就行了。
      

  7.   

    实际上,我测试过很多次,客户端也使用过你说的while循环,甚至使用过多线程不同步···结果仍令人失望。
    出现的都是我在10楼说的问题。(现在解决了问题,可是我用了两个serverSocket,用数据集把他们连接起来了)
    我试试nio,行的话我把代码贴出来,让大家明白我的意思,也解决以后看到这个问题的同学~
      

  8.   

    在一条socket上是可以达到通话的效果的,做成长连接形式即可。服务器和客户端各开两个线程,分别负责读和写,但这样还不够,必须定义数据包结构,也就是要告诉对方什么时候可以不必读数据了,本次消息已经发送完毕,数据包结构很重要,不然会一直阻塞读取
      

  9.   

    tcp是双工的,跟几个socket没有关系,关键是底层链路负载状况
    如果链路超载,再开多少个socket都是徒然
      

  10.   

    咳! 弱弱的补充一句: 服务端InputStream和OutputSteam的话,客户端应该是OutputSteam和InputSteam吧?服务端和客户端同事getInputSteam,我觉得肯定阻塞啊? 得一个写,一个读,不能两个都读吧?