2014-03-28 108 views
0

我從互聯網上獲得了一個客戶端和服務器的代碼,用java進行通信。我修改了一下,以便服務器和客戶端可以相互聊天。Java客戶端服務器聊天程序

最初我的客戶端發送一條消息到服務器,然後是服務器到客戶端,然後是客戶端到服務器,然後繼續......(一個不能連續發送多個消息到另一個)。爲此,在while循環中放入一個基本代碼,以便對話繼續進行1到1.但是,當我放置while循環時,客戶端不會收到來自服務器的消息。如果沒有while循環(我在這裏的代碼中已經評論過),那麼首先消息由客戶端發送到服務器,然後服務器發送到客戶端,程序停止。

請幫助我無休止地聊天。

//SERVER 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class Server { 

    private static Socket socket; 

    public static void main(String[] args) 
    { 
     try 
     { 
      int port = 25000; 
      ServerSocket serverSocket = new ServerSocket(port); 
      socket = serverSocket.accept(); 
      System.out.println("Server Started and listening to the port 25000"); 
      //while(true){ 
       //Server is running always. This is done using this while(true) loop 
       //Reading the message from the client 

       InputStream is = socket.getInputStream(); 
       InputStreamReader isr = new InputStreamReader(is); 
       BufferedReader br = new BufferedReader(isr); 
       String number = br.readLine(); 
       System.out.println("Received from client: "+number+"\n"); 

       BufferedReader bufferRead = new BufferedReader(new InputStreamReader(System.in)); 
       String s = bufferRead.readLine(); 

       //Sending the response back to the client. 
       OutputStream os = socket.getOutputStream(); 
       OutputStreamWriter osw = new OutputStreamWriter(os); 
       BufferedWriter bw = new BufferedWriter(osw); 
       bw.write(s); 
       bw.flush(); 
       System.out.println("Sent (to " + socket + ") client: "+s+"\n"); 

       //String abc = bufferRead.readLine(); 
       //System.out.println("SAA"); 
      //} 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
     finally 
     { 
      try 
      { 
       socket.close(); 
      } 
      catch(Exception e){} 
     } 
    } 
} 


//CLIENT 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.net.InetAddress; 
import java.net.Socket; 

public class Client { 

    private static Socket socket; 

    public static void main(String args[]) 
    { 
     try 
     { 
      String host = "localhost"; 
      int port = 25000; 
      InetAddress address = InetAddress.getByName(host); 
      socket = new Socket(address, port); 

      //while(true){ 
       //Send the message to the server 
       OutputStream os = socket.getOutputStream(); 
       OutputStreamWriter osw = new OutputStreamWriter(os); 
       BufferedWriter bw = new BufferedWriter(osw); 

       BufferedReader bufferRead = new BufferedReader(new InputStreamReader(System.in)); 
       String s = bufferRead.readLine(); 

       String sendMessage = s + "\n"; 
       bw.write(sendMessage); 
       bw.flush(); 
       System.out.println("Sent to server: " +sendMessage+"\n"); 

       //Get the return message from the server 
       InputStream is = socket.getInputStream(); 
       InputStreamReader isr = new InputStreamReader(is); 
       BufferedReader br = new BufferedReader(isr); 
       System.out.println(socket); 
       String message = br.readLine(); 
       System.out.println("Received from server: "+message+"\n"); 
      //} 
     } 
     catch (Exception exception) 
     { 
      exception.printStackTrace(); 
     } 
     finally 
     { 
      //Closing the socket 
      try 
      { 
       socket.close(); 
      } 
      catch(Exception e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 
+0

編寫代碼用於獲取輸入和輸出流之外的while循環。 –

+0

它不會影響。通過使用while循環,客戶端不會收到任何消息。 –

回答

2
Server.java 

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.*; 

public class Server implements Runnable { 

ServerSocket serversocket; 
BufferedReader br1, br2; 
PrintWriter pr1; 
Socket socket; 
Thread t1, t2; 
String in="",out=""; 

public Server() { 
    try { 
     t1 = new Thread(this); 
     t2 = new Thread(this); 
     serversocket = new ServerSocket(5000); 
     System.out.println("Server is waiting. . . . "); 
     socket = serversocket.accept(); 
     System.out.println("Client connected with Ip " +  socket.getInetAddress().getHostAddress()); 
     t1.start();; 
     t2.start(); 

    } catch (Exception e) { 
    } 
} 

public void run() { 
    try { 
     if (Thread.currentThread() == t1) { 
      do { 
       br1 = new BufferedReader(new InputStreamReader(System.in)); 
       pr1 = new PrintWriter(socket.getOutputStream(), true); 
       in = br1.readLine(); 
       pr1.println(in); 
      } while (!in.equals("END")); 
     } else { 
      do { 
       br2 = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
       out = br2.readLine(); 
       System.out.println("Client says : : : " + out); 
      } while (!out.equals("END")); 
     } 
    } catch (Exception e) { 
    } 
} 

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

Client.java 
import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.*; 

public class Client implements Runnable { 

BufferedReader br1, br2; 
PrintWriter pr1; 
Socket socket; 
Thread t1, t2; 
String in = "", out = ""; 

public Client() { 
    try { 
     t1 = new Thread(this); 
     t2 = new Thread(this); 
     socket = new Socket("localhost", 5000); 
     t1.start();; 
     t2.start(); 

    } catch (Exception e) { 
    } 
} 

public void run() { 

    try { 
     if (Thread.currentThread() == t2) { 
      do { 
       br1 = new BufferedReader(new InputStreamReader(System.in)); 
       pr1 = new PrintWriter(socket.getOutputStream(), true); 
       in = br1.readLine(); 
       pr1.println(in); 
      } while (!in.equals("END")); 
     } else { 
      do { 
       br2 = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
       out = br2.readLine(); 
       System.out.println("Server says : : : " + out); 
      } while (!out.equals("END")); 
     } 
    } catch (Exception e) { 
    } 

} 

public static void main(String[] args) { 
    new Client(); 
} 
} 
+1

你能解釋你做了什麼......或者說我做錯了什麼? –

0

首先,你必須保存在你的電腦,然後打開兩個命令提示符窗口的C盤此代碼。然後你必須在服務器窗口中寫入「javac clients.java」並在服務器窗口中輸入「java clients」和「java server」並享受聊天。

//server.java 
 
import java.io.*; 
 
import java.net.*; 
 
public class server { 
 
    public static void main(String []V){ 
 
\t try{ 
 
\t \t ServerSocket ss = new ServerSocket(1201); 
 
\t \t Socket s = ss.accept(); 
 
\t \t  
 
\t \t DataInputStream Din = new DataInputStream(s.getInputStream()); 
 
\t \t DataOutputStream Dout = new DataOutputStream(s.getOutputStream()); 
 
\t \t  
 
\t \t BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
 
\t \t  
 
\t \t String MsgIn="",MsgOut=""; 
 
\t \t  
 
\t \t while(!MsgIn.equals("end")){ 
 
\t \t \t MsgIn = Din.readUTF(); 
 
\t \t \t System.out.println(MsgIn); 
 
\t \t \t MsgOut = br.readLine(); 
 
\t \t \t Dout.writeUTF(MsgOut); 
 
\t \t \t Dout.flush(); 
 
\t \t } 
 
\t \t s.close(); \t  
 
\t }catch(Exception e){ 
 
\t  
 
\t } 
 
    
 
} 
 
} 
 
//clients.java 
 
import java.io.*; 
 

 
import java.net.*; 
 

 
import javax.xml.crypto.Data; 
 
public class clients { 
 
    public static void main(String []S){ 
 
    \t try{ 
 
    \t \t Socket s = new Socket("192.168.0.103",1201);//my pc's ip 
 
    \t \t //Socket s = new Socket("192.168.0.100",1201); 
 
    \t \t DataInputStream Din = new DataInputStream(s.getInputStream()); 
 
    \t \t DataOutputStream Dout = new DataOutputStream(s.getOutputStream()); 
 
    \t \t 
 
    \t \t BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
 
    \t \t String MsgIn="",MsgOut=""; 
 
    \t \t 
 
    \t \t while(!MsgIn.equals("end")){ 
 
    \t \t \t MsgOut = br.readLine(); 
 
    \t \t \t Dout.writeUTF(MsgOut); 
 
    \t \t \t MsgIn = Din.readUTF(); 
 
    \t \t \t System.out.println(MsgIn); 
 
    \t \t } 
 
    \t }catch(Exception e){ 
 
    \t \t 
 
    \t } 
 
    } 
 
     
 
}

0
import java.io.*; 
import java.net.*; 

class serversvi1 
{ 
    public static void main(String svi[])throws IOException 
    { 
     try 
     { 
      ServerSocket servsock=new ServerSocket(5510); 
      DataInputStream dis=new DataInputStream(System.in); 
      System.out.println("enter the file name"); 
      String fil=dis.readLine(); 
      System.out.println(fil+" :is file transfer"); 
      File myfile=new File(fil); 

      while(true) 
      { 
       Socket sock=servsock.accept(); 
       byte[] mybytearray=new byte[(int)myfile.length()]; 
       BufferedInputStream bis=new BufferedInputStream(new FileInputStream(myfile)); 
       bis.read(mybytearray,0,mybytearray.length); 
       OutputStream os=sock.getOutputStream(); 
       os.write(mybytearray,0,mybytearray.length); 
       os.flush(); 
       sock.close(); 

      } 
     } 

     catch(Exception saranvi) 
     { 
      System.out.print(saranvi); 
     } 
    } 
} 

import java.io.*; 
import java.net.*; 

class clientsvi1 
{ 
    public static void main(String svi[])throws IOException 
    { 
     try 
     { 
      Socket sock=new Socket("localhost",5510); 
      byte[] bytearray=new byte[1024]; 
      InputStream is=sock.getInputStream(); 
      DataInputStream dis=new DataInputStream(System.in); 
      System.out.println("enter the file name"); 
      String fil=dis.readLine(); 
      FileOutputStream fos=new FileOutputStream(fil); 
      BufferedOutputStream bos=new BufferedOutputStream(fos); 
      int bytesread=is.read(bytearray,0,bytearray.length); 
      bos.write(bytearray,0,bytesread); 
      System.out.println("out.txt file is received"); 
      bos.close(); 
      sock.close(); 
     } 

     catch(Exception SVI) 
     { 
      System.out.print(SVI); 
     } 
    } 
} 
+0

歡迎來到SO!請格式化您的答案,以便我們可以閱讀。編輯您的答案,然後點擊幫助鏈接查看方式。 –

+0

此外,爲了給出一個很好的答案,它有助於添加您提供的解決方案的文本評論/描述,以幫助OP(和未來的讀者!)瞭解您的答案。 – Castaglia

0

//server.java 
 
import java.io.*; 
 
import java.net.*; 
 
public class server { 
 
    public static void main(String []V){ 
 
\t try{ 
 
\t \t ServerSocket ss = new ServerSocket(1201); 
 
\t \t Socket s = ss.accept(); 
 
\t \t  
 
\t \t DataInputStream Din = new DataInputStream(s.getInputStream()); 
 
\t \t DataOutputStream Dout = new DataOutputStream(s.getOutputStream()); 
 
\t \t  
 
\t \t BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
 
\t \t  
 
\t \t String MsgIn="",MsgOut=""; 
 
\t \t  
 
\t \t while(!MsgIn.equals("end")){ 
 
\t \t \t MsgIn = Din.readUTF(); 
 
\t \t \t System.out.println(MsgIn); 
 
\t \t \t MsgOut = br.readLine(); 
 
\t \t \t Dout.writeUTF(MsgOut); 
 
\t \t \t Dout.flush(); 
 
\t \t } 
 
\t \t s.close(); \t  
 
\t }catch(Exception e){ 
 
\t  
 
\t } 
 
    
 
} 
 
} 
 
//clients.java 
 
import java.io.*; 
 

 
import java.net.*; 
 

 
import javax.xml.crypto.Data; 
 
public class clients { 
 
    public static void main(String []S){ 
 
    \t try{ 
 
    \t \t Socket s = new Socket("192.168.0.103",1201);//my pc's ip 
 
    \t \t //Socket s = new Socket("192.168.0.100",1201); 
 
    \t \t DataInputStream Din = new DataInputStream(s.getInputStream()); 
 
    \t \t DataOutputStream Dout = new DataOutputStream(s.getOutputStream()); 
 
    \t \t 
 
    \t \t BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
 
    \t \t String MsgIn="",MsgOut=""; 
 
    \t \t 
 
    \t \t while(!MsgIn.equals("end")){ 
 
    \t \t \t MsgOut = br.readLine(); 
 
    \t \t \t Dout.writeUTF(MsgOut); 
 
    \t \t \t MsgIn = Din.readUTF(); 
 
    \t \t \t System.out.println(MsgIn); 
 
    \t \t } 
 
    \t }catch(Exception e){ 
 
    \t \t 
 
    \t } 
 
    } 
 
     
 
}

+0

請編輯您的答案,以描述如何回答問題,並解釋代碼的作用。只有代碼答案是不鼓勵的。 –