我刚接触SOCKET
网上的通过SOCKET连接的C/S结构的简单聊天程序
大多是采取一问一答形式
即client对server说完话后,要等待server回应才可以继续说
反之亦然如何可以做到双方可以随时发话?(不用UDP连接方式实现)设想是client建两个socket分别进行收和发
但发现server好象很难识别哪个socket是做什么的。谁有好的方法,告诉一下,谢谢!

解决方案 »

  1.   

    你写程序的时候要写一个 socket 还要写一个 socketserver 
    一个用来发,一个用来收。socketserver 写在循环里,让他永远不停的接收
    然后socket 写在触发里
    这样就可以了~
      

  2.   

    就是 socket 和socketserver 写在一个程序里~
      

  3.   

    给个我的程序参考下:程序能实现你所要的要求,自己理解吧
    服务器:
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.net.InetAddress;
    import java.io.IOException;
    import java.io.DataInputStream;
    import java.io.DataOutputStream;public class ServerTest implements Runnable
    {
    Thread thread;

    public void run()
    {
    try
    {
    String str;
    //创建服务器Socket并侦听端口8888
    ServerSocket serverSocket=new ServerSocket (8888);
    //接受客户端的连接
    Socket socket=serverSocket.accept();

    DataInputStream inStream=new DataInputStream(socket.getInputStream());
    DataOutputStream outStream=new DataOutputStream (socket.getOutputStream());
    InetAddress addr=socket.getInetAddress();
    System.out.println("接收到来自 "+addr.getHostAddress()+" 的连接");
    //发送响应信息
    outStream.writeUTF("1");

    while (true)
    {
    //接收客户端的信息
    str=inStream.readUTF();
    System.out.println("客户端信息: "+str);
    str=String.valueOf(Integer.parseInt(str)+1);
    //向客户端发送信息
    outStream.writeUTF(str);
    }
    }

    catch (IOException e)
    {
    System.out.println(e);
    }
    }

    void start ()
    {
    thread=new Thread (this);
    //线程开始
    thread.start();
    }

    public static void main(String[] args)
    {
    ServerTest app=new ServerTest();
    app.start();
    }客户端:
    import java.net.Socket;
    import java.net.InetAddress;
    import java.io.DataOutputStream;
    import java.io.DataInputStream;
    import java.io.IOException;public class ClientTest implements Runnable
    {
    Thread thread;

    public void run()
    {
    Socket socket;
    DataOutputStream outStream;
    DataInputStream inStream;

    try
    {
    //连接到本地机的8888端口
    socket=new Socket("localhost",8888);
    outStream=new DataOutputStream (socket.getOutputStream());
    inStream=new DataInputStream (socket.getInputStream());
    InetAddress addr=socket.getInetAddress();
    System.out.println("连接到服务器 "+addr.getHostAddress());

    while (true)
    {
    //从服务器读取数据
    String str=inStream.readUTF();
    System.out.println("服务器端信息: "+str);
    thread.sleep(1000);
    str=String.valueOf(Integer.parseInt(str)+1);
    //向服务器发送数据
    outStream.writeUTF(str);
    }

    }
    catch (IOException e)
    {
    System.out.println(e);
    }

    catch (InterruptedException e)
    {
    System.out.println(e);
    }
    }

    void start ()
    {
    thread=new Thread(this);
    //打开线程
    thread.start();
    }

    public static void main(String[] args)
    {
    ClientTest app=new ClientTest();
    app.start();
    }
      

  4.   

    To: afgkidy(酷斯拉迪)你这种方法还是一收一发方式的。
    我把client那的sleep设成了10秒
    那么server端还是要等client端的线程完成一个循环才会执行server端那些代码我要的效果是,例如:
    我先在client端发:“A1”回车;“B1”回车;“C1”回车。
    server端在可以输入的状态下,仍然可以显示出“A1”,“B1”,“C1”。你现在的程序是等于,在client端发了“A1”回车后,client端会阻塞,不能输入“B1”等
    输了“A1”后,server现在会马上显示“A1”,但client要等server回话才可以继续输入“B1”等。
      

  5.   

    我形容例子的也可以简单抽象成server每1秒向client发出信息,client每1秒都显示这信息
    client每10秒向server发出信息,server再刚才每1秒发出消息的同时
    每隔10秒显示client发出的信息