新手入門,照着課本敲的,自己加的註釋,若有錯誤,敬請指出。
接着會自己試着寫多線程的、異地交流的一些東東。
前兩個代碼是客戶機發話,服務器傻逼式迴應;後面兩個代碼是客戶機和服務器都是人工的,當線程的,輪流輸入通信。
運行情況:
SERVER:
服務器啓動
New connection accepted/127.0.0.1:2924
1
2
3
4
5
dxgjdfjg
bye]
bye
CLIENT:
How are you ! I am amy . you can talk with me .
1
Amy:YES!
2
Amy:I love you!
3
Amy:I love xiaopan!
4
Amy:Sorry I can't understand you!
5
Amy:Sorry I can't understand you!
dxgjdfjg
Amy:Sorry I can't understand you!
bye]
Amy:Sorry I can't understand you!
bye
Amy:See You!
【SERVER】
package socketserver; /** * EchoServer Server program * can do easy talk with Client * @author Amy * make in 2014/2 * @Version 1.0 */ import java.io.*; import java.net.*; public class EchoServer { //服務端程序 private int port = 8000; //鏈接端口 private ServerSocket serverSocket; public EchoServer() throws IOException { //開啓服務端程序 serverSocket = new ServerSocket(port); //指定通信端口並開啓服務 System.out.println("服務器啓動"); } public String echo(String msg) { //給恢復信息加前綴 return "Amy:" + msg; } private PrintWriter getWriter(Socket socket) throws IOException { //給客戶機回覆交流語句 OutputStream socketOut = socket.getOutputStream(); return new PrintWriter(socketOut, true); } private BufferedReader getReader(Socket socket) throws IOException { //用於讀取客戶機交流語句 InputStream scoketIn = socket.getInputStream(); return new BufferedReader(new InputStreamReader(scoketIn)); } public void server() { //服務程序 Socket socket = null; //清空客戶機連接 try { socket = serverSocket.accept();// 等待客戶機連接 System.out.println("New connection accepted" + socket.getInetAddress() + ":" + socket.getPort()); //客戶機連接成功,給出新連接客戶機IP地址及連接端口號 BufferedReader br = getReader(socket); //讀取客戶機交流語句 PrintWriter pw = getWriter(socket); pw.println("How are you ! I am amy . you can talk with me ."); //交流問候語 String msg = null; //清空對話緩存內容 while ((msg = br.readLine()) != null) { //讀取客戶機交流語句 若不爲空 System.out.println(msg); //輸出到服務端控制檯 if (msg.equals("bye"))// 如果客戶發送信息爲“bye”,結束通信 { pw.println(echo("See You!")); //給客戶機恢復對應語句//要結束服務了:下次再見 break; //結束服務 斷開連接 } else if(msg.equals("1")) //與客戶機交流 { pw.println(echo("YES!")); } else if(msg.equals("2")) { pw.println(echo("I love you!")); } else if(msg.equals("3")) { pw.println(echo("I love xiaopan!")); } else { pw.println(echo("Sorry I can't understand you!")); } } } catch (IOException e) { //異常 e.printStackTrace(); } finally { try { if (socket != null) //客戶機關閉客戶端 socket.close();// 斷開連接 } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) throws IOException { //main new EchoServer().server(); } }
【CLIENT】/** * EchoClient Client program * can talk with Server * @author Amy * make in 2014/2 * @Version 1.0 */ import java.io.*; import java.net.*; import java.util.*; public class EchoClient { //客戶端 private String host = "localhost"; //與本地服務端器通信 private int port = 8000; //指定通信端口 private Socket socket; public EchoClient() throws IOException { //與服務端建立連接,收到“問候語”表示連接成功 socket = new Socket(host, port); //與指定的服務器的指定端口連接 } private PrintWriter getWriter(Socket socket) throws IOException { //給服務端發送回話語句 OutputStream socketOut = socket.getOutputStream(); return new PrintWriter(socketOut, true); } private BufferedReader getReader(Socket socket) throws IOException { //接收服務端的會話語句 InputStream socketIn = socket.getInputStream(); return new BufferedReader(new InputStreamReader(socketIn)); } public void talk()throws IOException{ //與服務端回話程序 try{ BufferedReader br=getReader(socket); //接收服務端的會話語句 PrintWriter pw=getWriter(socket); //給服務端發送回話語句 BufferedReader localReader=new BufferedReader(new InputStreamReader(System.in));//本地控制檯輸入 String msg=null; //清空語句緩存 System.out.println(br.readLine()); //輸出服務端會話語句到服務檯,連接成功的“問候語句” while((msg=localReader.readLine())!=null){ //讀取到本地客戶端控制檯語句,不爲空 pw.println(msg); //給服務端發送本地客戶端控制檯輸入的會話語句 System.out.println(br.readLine()); //將接收到的服務端發來的會話語句輸出到本地客戶端控制檯 if(msg.equals("bye"))break; } } catch(IOException e){ e.printStackTrace(); } finally { try{ socket.close(); //斷開連接 } catch(IOException e){ e.printStackTrace(); } } } public static void main(String[] args) throws IOException{ //main new EchoClient().talk(); } }
自主對話:
【Server】
/** * EchoServer Server program * user can talk with Client * @author Amy * make in 2014/2 * @Version 1.1 */ import java.io.*; import java.net.*; public class EchoServer { //服務端程序 private int port = 8000; //鏈接端口 private ServerSocket serverSocket; public EchoServer() throws IOException { //開啓服務端程序 serverSocket = new ServerSocket(port); //指定通信端口並開啓服務 System.out.println("服務器啓動"); } public String echo(String msg) { //給恢復信息加前綴 return "Amy:" + msg; } private PrintWriter getWriter(Socket socket) throws IOException { //給客戶機回覆交流語句 OutputStream socketOut = socket.getOutputStream(); return new PrintWriter(socketOut, true); } private BufferedReader getReader(Socket socket) throws IOException { //用於讀取客戶機交流語句 InputStream scoketIn = socket.getInputStream(); return new BufferedReader(new InputStreamReader(scoketIn)); } public void server() { //服務程序 Socket socket = null; //清空客戶機連接 try { socket = serverSocket.accept();// 等待客戶機連接 System.out.println("New connection accepted" + socket.getInetAddress() + ":" + socket.getPort()); //客戶機連接成功,給出新連接客戶機IP地址及連接端口號 BufferedReader br = getReader(socket); //讀取客戶機交流語句 PrintWriter pw = getWriter(socket); //將會話內容發送給客戶端 BufferedReader localReader=new BufferedReader(new InputStreamReader(System.in));//本地控制檯輸入 pw.println("How are you ! I am amy . you can talk with me ."); //交流問候語 String msg = null; //清空對話緩存內容 while ((msg = br.readLine()) != null) { //讀取客戶機交流語句 若不爲空 System.out.println(msg); //輸出到服務端控制檯 if (msg.equals("bye"))// 如果客戶發送信息爲“bye”,結束通信 { pw.println(echo("See You!")); //給客戶機恢復對應語句//要結束服務了:下次再見 break; //結束服務 斷開連接 } else { msg=localReader.readLine();//讀取本地服務端控制檯內容 pw.println(echo(msg)); } /*else if(msg.equals("1")) //與客戶機交流 { pw.println(echo("YES!")); } else if(msg.equals("2")) { pw.println(echo("I love you!")); } else if(msg.equals("3")) { pw.println(echo("I love xiaopan!")); } else { pw.println(echo("Sorry I can't understand you!")); }*/ } } catch (IOException e) { //異常 e.printStackTrace(); } finally { try { if (socket != null) //客戶機關閉客戶端 socket.close();// 斷開連接 } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) throws IOException { //main new EchoServer().server(); } }
【CLIENT】
/** * EchoClient Client program * user can talk with Server * @author Amy * make in 2014/2 * @Version 1.1 */ import java.io.*; import java.net.*; import java.util.*; public class EchoClient { //客戶端 private String host = "localhost"; //與本地服務端器通信 private int port = 8000; //指定通信端口 private Socket socket; public EchoClient() throws IOException { //與服務端建立連接,收到“問候語”表示連接成功 socket = new Socket(host, port); //與指定的服務器的指定端口連接 } private PrintWriter getWriter(Socket socket) throws IOException { //給服務端發送回話語句 OutputStream socketOut = socket.getOutputStream(); return new PrintWriter(socketOut, true); } private BufferedReader getReader(Socket socket) throws IOException { //接收服務端的會話語句 InputStream socketIn = socket.getInputStream(); return new BufferedReader(new InputStreamReader(socketIn)); } public void talk()throws IOException{ //與服務端回話程序 try{ BufferedReader br=getReader(socket); //接收服務端的會話語句 PrintWriter pw=getWriter(socket); //給服務端發送回話語句 BufferedReader localReader=new BufferedReader(new InputStreamReader(System.in));//本地控制檯輸入 String msg=null; //清空語句緩存 System.out.println(br.readLine()); //輸出服務端會話語句到服務檯,連接成功的“問候語句” while((msg=localReader.readLine())!=null){ //讀取到本地客戶端控制檯語句,不爲空 pw.println(msg); //給服務端發送本地客戶端控制檯輸入的會話語句 System.out.println(br.readLine()); //將接收到的服務端發來的會話語句輸出到本地客戶端控制檯 if(msg.equals("bye"))break; } } catch(IOException e){ e.printStackTrace(); } finally { try{ socket.close(); //斷開連接 } catch(IOException e){ e.printStackTrace(); } } } public static void main(String[] args) throws IOException{ //main new EchoClient().talk(); } }