.TCP程序設(shè)計
在JAVA中使用Socket(即套接字)完成TCP程序的開發(fā),使用此類可以方便的建立可靠的,雙向的,持續(xù)的,點對點的通信連接。
在Socket的程序開發(fā)中,服務(wù)器端使用ServerSocke等待客戶端的連接,對于java的網(wǎng)絡(luò)程序來講,每一個客戶端都使用一個Socket對象表示。
.ServerSocket類的常用方法:
| 序號 | 方法 | 類型 | 描述 |
| 1 | public ServerSocket(int port)throws IOException | 構(gòu)造函數(shù) | 創(chuàng)建ServerSocket實例,并監(jiān)聽指定的端口。 |
| 2 | public Socket accept()throws IOException | 普通函數(shù) | 等待客戶端連接,此方法連接之前一直阻塞 |
| 3 | public InetAddress getInetAddress() | 普通函數(shù) | 返回服務(wù)器的ip地址 |
| 4 | public boolean isClosed() | 普通函數(shù) | 返回ServerSocket的關(guān)閉狀態(tài) |
| 5 | public void close()throws IOException | 普通函數(shù) | 關(guān)閉ServerSocket |
在服務(wù)器端每次運行時都要使用accept()方法等待客戶端連接,此方法執(zhí)行之后服務(wù)器端將進入阻塞狀態(tài),直到客戶端連接之后程序才可以向下繼續(xù)執(zhí)行。此方法的返回值類型是Socket,每一個Socket都表示一個客戶端對象。
.Socket類的常用方法:
| 序號 | 方法 | 類型 | 描述 |
| 1 | public Socket(String host , int port)throws UnknownHostException,IOException | 構(gòu)造 | 構(gòu)造Socket對象,同時指定要連接服務(wù)器的主機名及連接端口號。 |
| 2 | public InputStream getInputStream() throws IOException | 普通 | 返回此套接字的輸入流 |
| 3 | public OutputStream getOutputStream() throws IOException | 返回此套接字的輸出流 | |
| 4 | public void close() throws IOException | 關(guān)閉此Socket | |
| 5 | public boolean isClosed() | 判斷此套接字是否被關(guān)閉 |

.第一個TCP程序--Echo程序
Echo 程序是一個網(wǎng)絡(luò)編程通信交互的一個典型的案例,稱為回應(yīng)程序,即客戶端輸入哪些內(nèi)容,服務(wù)器端會在這些內(nèi)容前加上“ECHO:”并將信息發(fā)回客戶端。
之前的程序代碼,服務(wù)器端每次執(zhí)行完畢后,服務(wù)器都會退出,這是因為服務(wù)器端只能接受一個客戶端的連接,主要是由于accept()方法只能使用一次,本程序中將通過
循環(huán)的方法使用accept()方法,這樣,每一個客戶端執(zhí)行完畢后,服務(wù)器端都可以重新等待用戶連接。
單線程范例:
EchoClient
1 public class EchoClient { 2 public static void main(String[] args) throws IOException { 3 4 Socket client = new Socket("localhost", 8888); 5 BufferedReader buf = null; 6 PRintStream out = null; 7 out = new PrintStream(client.getOutputStream()); 8 out.println(1); 9 BufferedReader input = null;10 input = new BufferedReader(new InputStreamReader(System.in));11 buf = new BufferedReader(new InputStreamReader(client.getInputStream()));12 boolean flag = true;13 14 while (flag) {15 System.out.println("Please Key In:");16 String str = input.readLine();17 out.println(str);18 if ("bye".equals(str)) {19 flag = false;20 } else {21 String echo = buf.readLine();22 23 System.out.println("1111" + echo);24 }25 }26 client.close();27 buf.close();28 }29 }單線程范例:
EchoServer
1 public class EchoServer { 2 public static void main(String[] args) throws IOException { 3 ServerSocket server = null; 4 Socket client = null; 5 PrintStream out = null; 6 BufferedReader buf = null; 7 server = new ServerSocket(8888); 8 boolean f = true; 9 while (f) {10 System.out.println("Server Running,Waiting for Client");11 client = server.accept();12 out = new PrintStream(client.getOutputStream());13 // 獲取客戶端輸入的信息14 buf = new BufferedReader(new InputStreamReader(15 client.getInputStream()));16 // 實例化輸出端17 out = new PrintStream(client.getOutputStream());18 boolean flag = true;19 while (flag) {20 String str = buf.readLine();21 if (str == null || "".equals(str)) {22 flag = false;23 } else {24 if ("bye".equals(str)) {25 flag = false;26 } else {27 out.println("ECHO" + str);28 }29 }30 }31 out.close();32 client.close();33 }34 server.close();35 }36 37 }多線程范例:
EchoThread
1 public class EchoThread implements Runnable { 2 3 private Socket client = null; 4 5 public EchoThread(Socket client) { 6 this.client = client; 7 } 8 9 public void run() {10 PrintStream out = null;11 BufferedReader buf = null;12 13 try {14 buf = new BufferedReader(new InputStreamReader(15 client.getInputStream()));16 out = new PrintStream(client.getOutputStream());17 boolean flag = true;18 19 while (flag) {20 String str = buf.readLine();21 if (str == null || "".equals(str)) {22 flag = false;23 } else {24 if ("bye".equals(str)) {25 flag = false;26 } else {27 out.println("ECHO:" + str);28 }29 }30 }31 out.close();32 client.close();33 } catch (Exception e) {34 }35 }36 37 }多線程范例:
EchoServer
1 public class EchoServer { 2 public static void main(String[] args) throws IOException { 3 ServerSocket server = null; 4 Socket client = null; 5 PrintStream out = null; 6 BufferedReader buf = null; 7 server = new ServerSocket(8888); 8 boolean f = true; 9 while (f) {10 System.out.println("Server Running,Waiting for Client");11 client = server.accept();12 new Thread(new EchoThread(client)).start();13 14 }15 server.close();16 }17 18 }在服務(wù)器端,每一個連接到服務(wù)器的客戶端Socket都會以一個線程的方式運行,這樣無論有多少個客戶連接都可以同時完成操作。
未完待續(xù)。。。
新聞熱點
疑難解答