2015-04-14 26 views
3

我正試圖做一個來回發送消息的程序。我似乎已經做到了;但是,爲了讓消息來回發送,客戶端必須首先發送消息以便對話啓動。聊天服務器客戶端來回郵件

我想知道如何根據誰想要先發送消息發送消息。此外,他們似乎處於交替式的對話中,如果服務器或客戶端發送兩條直接消息,它將會出現錯誤...我真的希望這是有道理的。

SERVER:

import java.io.*; 

import java.net.*; 

class Server 

public static void main(String arg[]) throws IOException { 

ServerSocket ss = null; 

try{ 

ss = new ServerSocket(1111); 

}catch(IOException e){ 

System.out.println("Failed");} 

Socket sock = null; 

try{ 

sock = ss.accept(); 

}catch(IOException io){ 
System.out.println("Socket Failed");} 

System.out.println("Connection Successful.."); 

BufferedReader input = new BufferedReader(new InputStreamReader(sock.getInputStream())); 

PrintStream output = new PrintStream(sock.getOutputStream()); 

BufferedReader ServerMessage = new BufferedReader(new InputStreamReader(System.in)); 

String Message; 

while(true){ 
message= input.readLine(); 
System.out.println("Clien: " + message); 

System.out.println("Server: "); 

message = ServerMessage.readLine(); 

output.println(message); 

System.out.println("Server: " + message); 

} 

} 

} 

客戶:

import java.io.*; 

import java.net.*; 

class Server 

public static void main(String arg[]) throws IOException { 

Socket sock = null; 

try{ 

sock = new Socket("127.0.0.1", 1111); 

}catch(IOException io){ 
System.out.println("Socket Failed");} 

System.out.println("Connection Successful.."); 

BufferedReader in = new BufferedReader(new `InputStreamReader(sock.getInputStream()));` 

PrintStream out = new PrintStream(sock.getOutputStream()); 

BufferedReader ClientMessage = new BufferedReader(new InputStreamReader(System.in)); 

String Message; 

while(true){ 

System.out.print("Client: "); 
Message = ClientMessage.readLine(); 
output.println(Message); 
System.out.println("Client: " + Message); 

Message = in.readLine(); 
System.out.println("Server: " + Message); 

} 

} 

} 
+1

這裏是我創建的一個框架,用於創建'ServerSocket's來照顧一些涉及的管道:http://sourceforge.net/p /土族/代碼/ HEAD /樹/ tjacobs/IO/ServerSocketEx。 java的。希望這對你有所幫助 – ControlAltDel

回答

1

你實際上是在尋找的解決方案是一個 「對等爲基礎」,並與一個端口上是行不通的(平紋舊的)java套接字。由於ServerSocket「主」的方法是accept()和(客戶端)Socket的一個是connect():你將不得不啓動這兩個程序(封裝每一個 Socket和一個的ServerSocket),其中acceptconnect相互(在不同的端口上)。

之一(java.net。*)MultiCastSocketDatagrammSocket也可能適合您的需求。

檢查出我的「簡單的聊天客戶端」的理念:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintStream; 
import java.net.ServerSocket; 
import java.net.Socket; 

/** 
* 
* @author xerx593 
*/ 
public class SocketPeer { 

    public static void main(String args[]) throws IOException { 
     //args: <nickName> <server port> <client port> 
     startServer(Short.valueOf(args[1])); 
     startClient(args[0], Short.valueOf(args[2])); 
    } 

    private static void startServer(short port) throws IOException { 
     final Thread st = new Thread(() -> { 
      try { 
       //start the server... 
       final ServerSocket ss = new ServerSocket(port); 
       System.out.println("Listening for connections.."); 
       //and (blockingly) listen for connections 
       final Socket sock = ss.accept(); 
       //got one! 
       final BufferedReader input = new BufferedReader(new InputStreamReader(
        sock.getInputStream()//remote input! 
       )); 
       while (true) {// as long as connected, bad exception otherwise 
        String message1 = input.readLine();// read remote message 
        System.out.println(message1);// print to (local) console 
       } 
      } catch (IOException ioe) { 
       System.out.println(ioe.getMessage()); 
       ioe.printStackTrace(System.err); 
      } 
     }); 
     st.start(); 
    } 

    private static void startClient(String id, short port) { 
     final Thread ct = new Thread(() -> { 
      Socket sock = null; 
      while (sock == null) { 
       try {//..to connect with a server 
        sock = new Socket("127.0.0.1", port); 
       } catch (IOException io) { 
        System.out.println("Socket Failed.. retry in 10 sec"); 
        try {//..retry in 10 secs 
         Thread.sleep(10000); 
        } catch (InterruptedException ex) { 
         ex.printStackTrace(System.err); 
        } 
       } 
      } 
      //sock != null -> connection established 
      try { 
       System.out.println("Connection Successful.."); 
       final BufferedReader in = new BufferedReader(new InputStreamReader(
        System.in //(local!) "keyboard" 
       )); 
       //remote output 
       final PrintStream out = new PrintStream(sock.getOutputStream()); 
       while (true) { 
        System.out.print(id + ">"); 
        final String message1 = in.readLine(); 
        out.println(id + ">" + message1); 
       } 
      } catch (IOException io) { 
       System.out.println("Socket Failed"); 
      } 
     }); 
     ct.start(); 

    } 

} 

它是硬編碼的「127.0.0.1」,但它可能在任何(配置)地址工作。

$>java SocketPeer mickey 8081 8082 

$>java SocketPeer minnie 8082 8081 

這仍然立足很多關於你的代碼,當然沒有太多的錯誤處理,也不是一個有用的幫助信息,但尚未:您可以通過如啓動程序的兩個實例一個不錯的工作程序。好好享受! :-)

TODO的:

  • 妥善處理命令行參數,並打印幫助/用法消息
  • 參數多態IP地址
  • 想到什麼做(如何處理),當一個對等disap-「peers」,或者多於2個嘗試連接...
+0

感謝您的幫助,感謝它 –

+1

所以我應該創建兩個課程,我的程序只是在我的主課程中運行它們。 –

+0

檢查出我的更新^^ – xerx593