2016-02-14 27 views
0

因此,我正在製作一個簡單的聊天應用程序來獲得Java Networking中的kick-start。我正在使用TCP/IP。問題在於客戶端不從服務器發送/接收數據,也沒有服務器。我在做錯了什麼? 這裏是我的服務器類:在java中使用TCP/IP的服務器客戶端。無法發送/接收消息

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.net.InetAddress; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.ArrayList; 

public class Server implements Runnable { 
static InetAddress address; 
static ArrayList<Integer> clients=new ArrayList<Integer>(); 
static ArrayList<Socket> s=new ArrayList<Socket>(); 
static String message; 
static byte[] mess=new byte[2048]; 
static DataOutputStream toClient; 
public Server(InetAddress address){ 
    this.address=address; 

} 
public static void main(String[] args) throws IOException 
{ 
    ServerSocket socket=new ServerSocket(8000); 
    System.out.println("Server started on port 8000"); 

    while(true) 
    { 
     Socket socketNew=socket.accept(); 
     s.add(socketNew); 
     address=socketNew.getInetAddress(); 
     System.out.println("connected to client at address: "+address); 
     InputStream is=socketNew.getInputStream(); //receiving from client 
     InputStreamReader isr=new InputStreamReader(is); 
     BufferedReader br=new BufferedReader(isr); 
     message=br.readLine(); 

     Server server=new Server(address); 
     //new Thread(server).start(); 


    } 
} 


public void run() { 

for(Socket socket:s) //to send message to all clients 
{ 
    OutputStream os; 
    try { 
     os = socket.getOutputStream(); 
     OutputStreamWriter osw=new OutputStreamWriter(os); 
     BufferedWriter bw=new BufferedWriter(osw); 
     bw.write(message); 
     bw.flush(); 
     socket.close(); 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

} 

} 

這裏是我的客戶端類的發送和接收功能:

private void send_data() { 
    try { 
     OutputStream os = socket.getOutputStream(); 
     OutputStreamWriter osw=new OutputStreamWriter(os); 
     BufferedWriter bw=new BufferedWriter(osw); 
     String sendMessage=this.getName()+": "+textField.getText(); 

     bw.write(sendMessage); 
     bw.flush(); 
    } catch (IOException e) { 

     e.printStackTrace(); 
    } 


} 



private void receive_data() 
{ 

    try { 
     InputStream is = socket.getInputStream(); 
     InputStreamReader isr=new InputStreamReader(is); 
     BufferedReader br=new BufferedReader(isr); 
     String toConsole=br.readLine(); 

     console(toConsole); 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 


} 
+0

我不確定,但是不應該將ServerSocket綁定到IP上嗎?嘗試使用獲取IP地址的ServerSocket構造函數。 – Michael

+0

您使用未綁定的ServerSocket綁定。這一個不會要求。 – Learner

回答

0

我不知道你們是怎麼寫你的客戶端代碼連接到Server ,我不知道你是否設置了ip-configuratoin對或錯。

通常有小動作通過SocketServerSocket寫的東西,它是在郵件的末尾添加行分隔符,以使從插座對方readLine()

這可以通過在消息中附加\n來實現。但是我自己更喜歡使用PrintWriter代替BufferedWriter,因爲它有一組優雅的重載println方法,其中自動爲您做到這一點:

PrintWriter p = new PrintWriter(bw); 
p.println(message); 

希望這將是有益的。

0

您的服務器正在等待從客戶端接收/ n終止的消息。

服務器代碼:

package general; 

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.net.InetAddress; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.ArrayList; 

public class ChatServer implements Runnable { 
static InetAddress address; 
static ArrayList<Integer> clients=new ArrayList<Integer>(); 
static ArrayList<Socket> s=new ArrayList<Socket>(); 
static String message; 
static byte[] mess=new byte[2048]; 
static DataOutputStream toClient; 

public ChatServer(InetAddress address){ 
    this.address=address; 
} 

public static void main(String[] args) throws IOException 
{ 
    ServerSocket socket=new ServerSocket(9000); 
    System.out.println("Server started on port 9000"); 

    while(true) 
    { 
     Socket server=socket.accept(); 
     s.add(server); 
     address=server.getInetAddress(); 
     System.out.println("connected to client at address: "+address); 
     BufferedReader br = new BufferedReader(new InputStreamReader(server.getInputStream())); 
     String resp = br.readLine(); 
     System.out.println("Server received from Client:" + resp); 
     server.close(); 

     /* 
     DataInputStream in = new DataInputStream(socketNew.getInputStream()); 
     System.out.println(in.readUTF()); 
     DataOutputStream out = 
       new DataOutputStream(socketNew.getOutputStream()); 
     out.writeUTF("Thank you for connecting to " 
      + socketNew.getLocalSocketAddress() + "\nGoodbye!"); 
     */ 
    } 
} 


public void run() { 

    for(Socket socket:s) //to send message to all clients 
    { 
     OutputStream os; 
     try { 
      os = socket.getOutputStream(); 
      OutputStreamWriter osw=new OutputStreamWriter(os); 
      BufferedWriter bw=new BufferedWriter(osw); 
      bw.write(message); 
      bw.flush(); 
      socket.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 
} 

} 

客戶端代碼:

public static void main(String[] args) { 
    try { 
     client=new Socket("127.0.0.1",9000); 
     System.out.println("connected to: " + client.getRemoteSocketAddress()); 
     BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); 
     String sendingMessage = "Hello Server - This is the client!\n"; 
     bw.write(sendingMessage); 
     bw.flush(); 

     System.out.println("Message sent to the server : "+ sendingMessage); 

     /* 
     OutputStream outToServer = client.getOutputStream(); 
     DataOutputStream out = new DataOutputStream(outToServer); 

     out.writeUTF("Hello from \n" + client.getLocalSocketAddress()); 
     InputStream inFromServer = client.getInputStream(); 
     DataInputStream in = new DataInputStream(inFromServer); 
     System.out.println("Server says " + in.readUTF()); 
     */ 
     client.close();   
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

輸出:

服務器: 服務器上的地址連接到客戶端端口9000 開始:/127.0.0.1 從客戶端收到的服務器:Hello Server - 這是客戶端!

客戶端: 連接到:/127.0.0.1:9000 發送到服務器的消息:Hello Server - 這是客戶端!

+0

你的問題解決了嗎? – Learner

相關問題