本人初学JAVA,练习写段代码:基于SOCKET的多线程(有一个连接进来就生成一个通信线程,每个通信线程又有一个接收线程和一个发送线程)聊天程序。
现在的问题是:服务端提示已连接,但是不能互相通信。
估计在把SOCKET对象传递到接收线程和发送线程时出现问题。望各位达人帮小弟看看!
/////////////////////////服务端代码////////////////////////////////////
import java.io.*;
import java.net.*;
class SocketThread extends Thread
{    Recv r;
    Send send;
    private Socket server1;
    

SocketThread(Socket s)
{
server1 = s;
r=new Recv(server1);
send=new Send(server1);

     start();

}


public void run()
{

  
System.out.println("欢迎进入聊天室");
System.out.println(server1.getInetAddress().getHostAddress() + "已经连接!");

  
            r.start();
send.start();

while(true){
;
}
 
 }
 }class Recv extends Thread
{
    String ClientString;
BufferedReader bf;
boolean done;
Socket sock;
Recv(Socket s)
{
 sock=s;
 done=true;
 ClientString=new String();
    
     
 try{
 
 bf=new BufferedReader(new InputStreamReader(sock.getInputStream()));
 }
 catch(IOException e){
 }
 
}
public void run()


    
     while(!ClientString.equals("88"))
     {
      try{
    
      ClientString=bf.readLine();
      System.out.println("CLIENT:"+ClientString);

     }
   catch(IOException e){
    System.out.println("输入输出异常:未发现客户端输入流!" + e.getMessage());
                        }
 }
try{
 
sock.close();;
   }
catch(IOException e){
}
}
}class Send extends Thread
{
String SrvString;
PrintWriter pw;
BufferedReader bf;
Socket sock;
Send(Socket s){

sock=s;
SrvString=new String();
try{

bf= new BufferedReader(new InputStreamReader(System.in));
pw=new PrintWriter(new OutputStreamWriter(sock.getOutputStream()));

   }
catch(IOException e){
}
}

public void run()
{   
    
while(!SrvString.equals("88"))
   {
   
   try{
   
SrvString=bf.readLine();
System.out.println(SrvString);

    pw.println("SREVER:"+SrvString);
   
       }
    catch(IOException e){
     System.out.println("输入输出异常: 未发现服务端输出流!" + e.getMessage());
                        }
   }
   try{
   
   sock.close();
   }
   catch(IOException e){
   }
   
}
}
public class qqServer 
{
public static void main(String args[]) //throws IOException
{   Socket server2 = null;
    ServerSocket serverSocket = null;
try {
     serverSocket = new ServerSocket(1024);
    }catch(IOException eq){
                          }
 
System.out.println("欢迎进入TESTQQ服务器端");
  try{

while(true)
{   
 try{
    server2 = serverSocket.accept();
    }catch(IOException ew){
                              }
 
    try{
    
    new SocketThread(server2);
    
   }catch(Exception ea){
                       System.out.println("多线程异常1!" + ea);
                       try{
                        server2.close();
                            }catch(IOException ez){
                                    System.out.println("Socket关闭异常:" + ez);
                                      }
                       }
}

    }catch(Exception ed){
                       System.out.println("多线程异常2!");
                      
                       }  
  finally{
          try{
               serverSocket.close();
              }catch(IOException es){
                              System.out.println("ServerSocket关闭异常:" + es);
                                }
     }                                               
}
}///////////////////////////////////客户端代码///////////////////////////////////////////import java.net.*;
import java.io.*;class Recv extends Thread
{
    String SrvString;
BufferedReader bf;
boolean done;
Socket sock;
Recv(Socket s)
{
sock=s;
 done=true;
 SrvString=new String();
 try{
 
 bf=new BufferedReader(new InputStreamReader(sock.getInputStream()));
 }
 catch(IOException e){
 }
 
}
public void run()


    
     while(!(SrvString.equals("88")))
     {
    try{
   
SrvString=bf.readLine();
    
System.out.println("CLIENT:"+SrvString);


   }
   catch(IOException e){
    System.out.println("输入输出异常:" + e.getMessage());
   }
}
 try{
 
sock.close();
}
catch(IOException e){
}
}
}class Send extends Thread
{
String ClientString;
PrintWriter pw;
BufferedReader bf;
Socket sock;
Send(Socket s){

sock=s;
ClientString=new String();
try{

bf= new BufferedReader(new InputStreamReader(System.in));
pw=new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
}
catch(IOException e){
}
}

public void run()
{
while(!(ClientString.equals("88")))
   {
   try{
   
ClientString=bf.readLine();
    pw.println("SREVER:"+ClientString);
       }
    catch(IOException e){
     System.out.println("输入输出异常:" + e.getMessage());
                        }
   }
   try{
  
   sock.close();
    }catch(IOException e){
    }
}
}
public class qqClient1
{
        public static void main(String args[]) throws Exception
        {
        
          Socket client1 = null;
          client1 = new Socket(InetAddress.getLocalHost(),1024);
          Send send=new Send(client1);
          Recv recv=new Recv(client1);
          String ps = null;
          String name = new String();
         BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
 
  
        send.start();
        recv.start();
    
     while(true)
       {  
      
     ;
          
       }
     }          
}

解决方案 »

  1.   

    代码太长,给你个简单的参考:
    import java.net.*;
    import java.io.*;public class Servicer implements Runnable {
    private Socket s;

    public Servicer(Socket s){

    this.s = s;
    }

    public void run(){

    try{
    InputStream ips = s.getInputStream();
    OutputStream ops = s.getOutputStream();

    BufferedReader br = new BufferedReader( new InputStreamReader(ips));
    PrintWriter pw = new PrintWriter(ops,true);
    while(true){

    String strLine = br.readLine();

    if(strLine.equalsIgnoreCase("quit")){

    TCPServerDemo.count--;
    if(TCPServerDemo.count==0)
    TCPServerDemo.bRunning = false;
    break;
    }
    System.out.println(strLine+"From"+s.getInetAddress().toString()+":"+s.getPort());
    String strEcho = (new StringBuffer(strLine).reverse()).toString();
    pw.println(strLine +"------>"+strEcho);
    }

    br.close();
    pw.close();

    s.close();
    }
    catch(IOException e){
     
    e.printStackTrace();
    }
    }
    }-------------import java.net.*;
    import java.io.IOException;
    public class TCPServerDemo {
    static int count=0;
    static boolean bRunning = true;
    public static void main(String[] args){

    try{
    ServerSocket ss = new ServerSocket(8003);

    //boolean bRunning = true;

    while(bRunning){

    Socket s = ss.accept();
    if(s!=null)
    count++;
    new Thread( new Servicer(s)).start();
    }

    ss.close();
    }
    catch(IOException e){

    e.printStackTrace();
    }
    }
    }运行后,可以执行telnet 127.0.0.1 8003与程序通信!同时可再打开cmd窗口,再输入
    telnet 127.0.0.1 8003 两个通信互不干扰!