解决方案 »

  1.   


    是不是要用到多线程?
    我也试着加过while(true)
    但是 循环体里面是先等待输入 然后 发送输入的内容  然后显示从另一端接收到的东西
    这样的话每次都必须先输入个什么循环体才能走下去 不然会卡在等待输入
    这就成了必须 你一句 我一句 了
      

  2.   

    nio
    建立socket连接之后可以做两个线程一个负责发送 一个负责接收吧?
      

  3.   


    是不是要用到多线程?
    我也试着加过while(true)
    但是 循环体里面是先等待输入 然后 发送输入的内容  然后显示从另一端接收到的东西
    这样的话每次都必须先输入个什么循环体才能走下去 不然会卡在等待输入
    这就成了必须 你一句 我一句 了
    是用多线程,这种情况下就不分客户端和服务端了,客户端和服务端都包含 监听端口,接收消息和发送消息
      

  4.   

    建立个长连接发去呗。 telnet、ssh、ftp都是长连接。
      

  5.   

    还是没太弄明白楼主具体要的是什么效果。要客户端和服务端自己通信?客户端自动给服务端发信息,服务端返回,然后客户端继续自己发?
    while(true)足够可以实现了的。服务端等待本身就用while(true)就行,客户端在接到服务端信息后也可以做一样处理的。
    如果可以,还是把你现在不能自己通信的代码贴出来,大家一起改改。这样简洁些。
      

  6.   


    我现在可以实现这这样:
    客户端发送一条信息
    服务器端收到
    服务器端返回一个信息给客户端我也加while(true)了
    所以现在实现了上面这三个过程的不断重复如果我要做可以彼此互相发信息的 正如上面一位朋友所说 就部分客户端和服务器端了 这儿我懂
    但这样的话,我只能实现“必须 你一句我一句”  而 不能我连续说三句话而你一句话也不说但你收到我这三句话了------就像两个人在qq上那样随意聊天
    因为在while(true)里  有 System.in 这个步骤  所以必须输入东西才能继续往下我现在有两个想法:
    要么多线程(上面几位朋友都这么说了)
    要么监听键盘输入,即
    if(键盘有输入) {
    System.in
    }
    c或者c++的话 有kbhit 这个函数可以监听键盘
    java的话要监听键盘事件 这个我还不太了解 也不知道可行不可行
      

  7.   

    按照你说的还是很容易实现的。建议用下udp协议试试。
    两端分别建立一个等待对方发送消息的线程,和一个发送给对方消息的线程。这样你就可以想输入多少就输入多少。如果想看代码的话,你可以下载java实现的简洁qq功能,里面肯定是这个样子的代码。
      

  8.   


    其实我这两天就是在学用udp和tcp实现互相传输数据的
    我现在的代码还正好就是udp既然现在大家意见一致了 都用多线程  那我就继续了
    谢谢哈
      

  9.   

    +1  如果用TCP ,可以客户端既是服务器又是客户端,两端都有socket和serverSocket,一个发送,一个接收,不过用UDP会省事些
      

  10.   

    +1  如果用TCP ,可以客户端既是服务器又是客户端,两端都有socket和serverSocket,一个发送,一个接收,不过用UDP会省事些
    是不是这样:
    class Receive implements Runnable{}
    class Send implements Runnable{}
    class Client {
        Receive r = new Receive();
        Send s = new Send();
        new Thread(r).start();
        new Thread(s).start();
    }同上再做个Client类
    然后这两个client就可以互发了?
      

  11.   

    +1  如果用TCP ,可以客户端既是服务器又是客户端,两端都有socket和serverSocket,一个发送,一个接收,不过用UDP会省事些
    是不是这样:
    class Receive implements Runnable{}
    class Send implements Runnable{}
    class Client {
        Receive r = new Receive();
        Send s = new Send();
        new Thread(r).start();
        new Thread(s).start();
    }同上再做个Client类
    然后这两个client就可以互发了?
    这样可以
      

  12.   

    package com.softeem.java1307se.net.many2many;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 M2MClient {

    public static void main(String[] args) {

    try {

    //构建客户端对象
    Socket s = new Socket("localhost",1234);

    //先从键盘接收信息
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    //写入到 Socket 中
    PrintWriter pw = new PrintWriter(s.getOutputStream());

    //启动线程
    M2MReceive receive = new M2MReceive(s);
    receive.start();

    while(true){

    //用户输入信息
    String info = null;

    if((info=br.readLine()) != null){

    //写出
    pw.println(info);
    pw.flush();
    }

    }





    } catch (UnknownHostException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }

    }

    }
      

  13.   

    package com.softeem.java1307se.net.many2many;import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.ArrayList;/**
     * 多对多 服务器
     * 
     *
     */
    public class M2MServer {

    //用户集合
    private static ArrayList<Socket> list = new ArrayList<Socket>();

    public static void main(String[] args) {

    //上线用户
    Socket s = null;

    //用户 
    String ip = null;

    try {

    //构建服务器对象
    ServerSocket ss = new ServerSocket(1234);

    //构建 用户集合
    list = new ArrayList<Socket>();

    System.out.println("服务器准备就绪 ...");

    //循环监听
    while(true){

    //上线用户
    s = ss.accept();

    //上线的人都添加到 集合中
    list.add(s);

    //获取 Socket IP
    ip = s.getInetAddress().getHostAddress();
    System.err.println( ip + " 用户上线了 , 当前在线用户为: " + list.size() + "人 !" );

    //构建 发送信息线程
    M2MSend send = new M2MSend(s);
    send.start();

    }

    } catch (IOException e) {
    //用户下线
    list.remove(s);
    System.err.println(ip + " 已下线 , 当前在线人数为: " + list.size() + " 人 !");
    }

    } public static ArrayList<Socket> getList() {
    return list;
    } public static void setList(ArrayList<Socket> list) {
    M2MServer.list = list;
    }

    }
      

  14.   

    package com.softeem.java1307se.net.many2many;import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.Socket;/**
     * 接收信息
     * 
     *
     */
    public class M2MReceive extends Thread {

    private Socket s;

    public M2MReceive(Socket s){
    this.s = s;
    }

    public void run(){

    try {

    //构建输入流
    BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));

    //不断的接收信息
    while(true){

    String info = null;

    //接收信息
    if((info=br.readLine()) != null){
    System.out.println(info);
    }

    }


    } catch (IOException e) {
    e.printStackTrace();
    }

    }


    }
      

  15.   

    package com.softeem.java1307se.net.many2many;import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.util.ArrayList;/**
     * 发送线程
     * 
     *
     */
    public class M2MSend extends Thread {

    //用户集合
    private ArrayList<Socket> list = M2MServer.getList();
    //当前用户
    private Socket s;

    public M2MSend(Socket s){
    this.s = s;
    }

    public void run(){

    //获取该用户 IP
    String ip = s.getInetAddress().getHostAddress();

    try {

    //读取用户信息
    BufferedReader reader = new BufferedReader(new InputStreamReader(s.getInputStream()));

    //不断的读取写出数据
    while(true){

    //接收数据
    String info = null;

    //如果读取信息不为空
    if((info=reader.readLine()) != null){

    //遍历所有的在线用户,并且把信息发送过去
    for(Socket ss : list){

    //获取对象的输出流
    PrintWriter pw;
    pw = new PrintWriter(ss.getOutputStream());
    //写入信息
    pw.println(ip + " 说: " + info);
    pw.flush();

    }

    }
    }

    } catch (IOException e1) {
    //用户下线
    list.remove(s);
    System.err.println(ip + " 已下线 , 当前在线人数为: " + list.size() + " 人 !");
    }


    }}
      

  16.   

     DWORD  WINAPI FunThread(LPVOID);
     while(TRUE)    
     {     
     char   data[11];   //收发缓冲区  
     int     ReciveBytes;   //接收字节的个数       
     if((ret=select(0,&fdread,NULL,NULL,NULL))==SOCKET_ERROR)  //这里阻断程序,知道缓冲区内有可读数据才返回       
     {                   //套接字错误               
     break;    
     }             
     if(ret> 0)   
     {                  
     if(FD_ISSET(client,&fdread))//c中是否属于fdread集合                          
                      {         
     do//循环读取,每次接收100个字符,直到把缓冲区中全部取完      
     {       
     ReciveBytes=recv(client,data,100,0);      
     if(ReciveBytes==SOCKET_ERROR)       
     {         //SOCKET错误         
     break;         
     }         
     data[ReciveBytes]=0;//加上结束符
     我这里感觉遇到了相同的问题,只能一个回一个达,无法实现自由通信  求帮帮忙吧