[零基础学JAVA]Java SE应用部分-32.Java网络编程
生活随笔
收集整理的這篇文章主要介紹了
[零基础学JAVA]Java SE应用部分-32.Java网络编程
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
C/S程序:表示的客戶/服務(wù)器程序,每次需要編寫兩套程序
|- MSN、QQ:一般會(huì)有兩套程序,一個(gè)是服務(wù)器端,另外一個(gè)是客戶端
B/S程序:表示的瀏覽器/ 服務(wù)器,可以理解為動(dòng)態(tài)WEB,論壇 本季目標(biāo) Sock:TCP通訊
數(shù)據(jù)報(bào):UDP通訊 Socket程序需要的類:
1、所有的用戶對(duì)于服務(wù)器來(lái)講都是一個(gè)Socket客戶端。
2、在服務(wù)器上使用ServerSocket類接收客戶端的Socket Socket通信模型 Socket編程的四個(gè)基本步驟 編寫一個(gè)服務(wù)器程序:ServerSocket 只要是網(wǎng)絡(luò)連接都要求有一個(gè)端口
public ServerSocket(int port)
public Socket accept() throws IOException 通過此方法等待客戶端的socket進(jìn)行訪問。 ServerSocket01服務(wù)器端代碼: 此服務(wù)器端的功能非常的簡(jiǎn)單,就是接收客戶端的請(qǐng)求,之后在屏幕上輸出哈~ Windows中有一個(gè)telnet命令,通過此命令就可以直接連接到服務(wù)器了。 客戶端收到http://redking.blog.51cto.com字符串,同時(shí)服務(wù)器端顯示“客戶端回應(yīng)完畢~~~” 只要是符合網(wǎng)絡(luò)的協(xié)議標(biāo)準(zhǔn),所有的客戶端都可以連接到此服務(wù)器端上。
但是一般情況下,很少說直接去使用telnet連接,往往會(huì)編寫一個(gè)客戶端。
Socket
public Socket(String host,int port) throws UnknownHostException,IOException
指定一個(gè)主機(jī)的IP地址和一個(gè)端口 ClientSocket01客戶端代碼: 驗(yàn)證下效果,和telnet一樣哈~ 以上代碼驗(yàn)證了,程序需要編寫兩套程序:
· 一個(gè)是服務(wù)器端
· 另外一個(gè)是客戶端 現(xiàn)在發(fā)現(xiàn)所有的代碼只是執(zhí)行一次就完了,那么能不能說執(zhí)行多次呢?由我的用戶可以自己發(fā)出中斷的指令。
這樣的做法我們可以做一個(gè)Socket經(jīng)典 —— Echo程序
用戶發(fā)什么內(nèi)容,服務(wù)器就會(huì)回應(yīng)什么內(nèi)容: EchoServer代碼: import java.io.*;????
import java.net.*;????
public class EchoServer{????
????????//此處為了省去處理try...catch直接拋出了異常????
????????public static void main(String args[]) throws Exception{????
????????????????ServerSocket server = null;????
????????????????//輸出肯定使用打印流????
????????????????PrintStream out = null;????
????????????????//服務(wù)器肯定也要接收輸入????
????????????????BufferedReader buf = null;????
????????????????//1.實(shí)例化一個(gè)服務(wù)器的監(jiān)聽端????
????????????????server = new ServerSocket(9999);????
????????????????//可以使用一種死循環(huán)的方式接收內(nèi)容????
????????????????Socket client = null;????
????????????????while (true){????
????????????????????????//不斷接收內(nèi)容????
????????????????????????client = server.accept();????
????????????????????????//準(zhǔn)備好向客戶端輸出內(nèi)容????
????????????????????????out = new PrintStream(client.getOutputStream());????
????????????????????????//而且客戶端要有輸入給服務(wù)器端????
????????????????????????buf = new BufferedReader(new InputStreamReader(client.getInputStream()));????
????????????????????????//下面先給出一個(gè)完整的信息提示????
????????????????????????out.println("您好!歡迎光臨:http://redking.blog.51cto.com");????
????????????????????????out.println("輸入bye表示退出哈~");????
????????????????????????//一個(gè)用戶要發(fā)很多的信息????
????????????????????????while (true){????
????????????????????????????????//接收客戶端發(fā)送而來(lái)的內(nèi)容????
????????????????????????????????String str = buf.readLine();????
????????????????????????????????if (str==null){????
????????????????????????????????????????//如果str為空就表示退出????
????????????????????????????????????????break;????
????????????????????????????????}else{????
????????????????????????????????????????//如果輸入的是bye則表示系統(tǒng)退出????
????????????????????????????????????????if ("bye".equals(str)){????
????????????????????????????????????????????????break;????
????????????????????????????????????????}????
????????????????????????????????????????//可以對(duì)用戶發(fā)來(lái)的信息進(jìn)行回應(yīng)????
????????????????????????????????????????out.println("ECHO:"+str);????
????????????????????????????????}????
????????????????????????}????
????????????????????????//進(jìn)行收尾工作????
????????????????????????out.close();????
????????????????????????buf.close();????
????????????????????????client.close();????
????????????????????????//如果要關(guān)閉服務(wù)器時(shí)可以設(shè)置標(biāo)志????
????????????????????????//server.close();????
????????????????}????
????????}????
} 看下效果: 現(xiàn)在我們用telnet連接上去看下效果 輸入bye退出連接 同時(shí)可以多次連接 典型的包含了輸入和輸出 EchoClient代碼: import java.io.*;????
import java.net.*;????
public class EchoClient{????
????????public static void main(String args[]) throws Exception{????
????????????????Socket client = null;????
????????????????BufferedReader buf = null;????
????????????????PrintStream out = null;????
????????????????//1.連接服務(wù)器????
????????????????client = new Socket("localhost",9999);????
????????????????//接收服務(wù)器端的輸入信息????
????????????????buf = new BufferedReader(new InputStreamReader(client.getInputStream()));????
????????????????System.out.println(buf.readLine());????
????????????????System.out.println(buf.readLine());????
????????????????//之后準(zhǔn)備從鍵盤接收數(shù)據(jù)????
????????????????BufferedReader in = new BufferedReader(new InputStreamReader(System.in));????
????????????????String userInput = null;????
????????????????out = new PrintStream(client.getOutputStream());????
????????????????while ((userInput=in.readLine())!=null){????
????????????????????????//表示有內(nèi)容進(jìn)來(lái),要把內(nèi)容發(fā)送到客戶端????
????????????????????????out.println(userInput);????
????????????????????????//接收服務(wù)器端的回應(yīng)????
????????????????????????System.out.println(buf.readLine());????
????????????????}????
????????????????out.close();????
????????????????in.close();????
????????????????client.close();????
????????}????
} 但是此程序有一個(gè)問題,即:當(dāng)一個(gè)用戶操作的時(shí)候,其他用戶是不能操作的
程序是單線程的,所以每次只能一個(gè)用戶訪問。
此處如果想解決,則只能使用多線程進(jìn)行操作。
首先需要編寫一個(gè)線程的類: ThreadServer代碼: import java.io.*;????
import java.net.*;????
public class ThreadServer implements Runnable{????
????????//現(xiàn)在所有的Socket都要?dú)w入到一個(gè)線程之中????
????????private Socket client = null;????
????????public ThreadServer(Socket client){????
????????????????this.client = client;????
????????}????
????????public void run(){????
????????????????//要不斷的接收客戶發(fā)送來(lái)的信息????
????????????????String input = null;????
????????????????//通過BufferedReader進(jìn)行接收????
????????????????BufferedReader buf = null;????
????????????????//有一個(gè)輸出的對(duì)象????
????????????????PrintStream out = null;????
????????????????try{????
????????????????????????buf = new BufferedReader(new InputStreamReader(this.client.getInputStream()));????
????????????????????????while(true){????
????????????????????????????????//接收發(fā)送過來(lái)的信息????
????????????????????????????????input = buf.readLine();????
????????????????????????????????out = new PrintStream(this.client.getOutputStream());????
????????????????????????????????if ("bye".equals(input)){????
????????????????????????????????????????break;????
????????????????????????????????}else{????
????????????????????????????????????????out.println("ECHO:"+input);????
????????????????????????????????}????
????????????????????????}????
????????????????????????this.client.close();????
????????????????}catch (Exception e){}????
????????}????
} EchoServer01服務(wù)器端代碼:? import java.io.*;????
import java.net.*;????
public class EchoServer01{????
????????//此處為了省去處理try...catch直接拋出了異常????
????????public static void main(String args[]) throws Exception{????
????????????????ServerSocket server = null;????
????????????????//輸出肯定使用打印流????
????????????????PrintStream out = null;????
????????????????//服務(wù)器肯定也要接收輸入????
????????????????BufferedReader buf = null;????
????????????????//1.實(shí)例化一個(gè)服務(wù)器的監(jiān)聽端????
????????????????server = new ServerSocket(9999);????
????????????????//可以使用一種死循環(huán)的方式接收內(nèi)容????
????????????????Socket client = null;????
????????????????while (true){????
????????????????????????//不斷接收內(nèi)容????
????????????????????????client = server.accept();????
????????????????????????//在此處啟動(dòng)了一個(gè)線程????
????????????????????????new Thread(new ThreadServer(client)).start();????
????????????????}????
????????}????
} 使用telnet測(cè)試效果哈~ ? 通過以上代碼,可以發(fā)現(xiàn),多線程實(shí)際上在服務(wù)器上是比較常用的。
服務(wù)器 = 多線程 + IO + Socket
Socket程序?qū)嶋H上是屬于TCP程序,是一個(gè)穩(wěn)定的連接 UDP程序:數(shù)據(jù)報(bào)程序 Send發(fā)送端代碼: import java.io.*;????
import java.net.*;????
public class Send{????
????????public static void main(String args[]) throws Exception{????
????????????????DatagramSocket ds = null;????
????????????????DatagramPacket dp = null;????
????????????????//發(fā)送端必須有一個(gè)監(jiān)視的端口????
????????????????ds = new DatagramSocket(9999);????
????????????????String str = "http://redking.blog.51cto.com";????
????????????????//發(fā)送的內(nèi)容只能是byte數(shù)組????
????????????????//接收端端口號(hào)是8888????
????????????????dp = new DatagramPacket(str.getBytes(),str.length(),InetAddress.getByName("localhost"),8888);????
????????????????ds.send(dp);????
????????????????ds.close();????
????????}????
} 看下效果: 信息已經(jīng)發(fā)送出去了哈~ 下面我們?cè)賹憘€(gè)接收代碼 Receive接收端代碼: import java.io.*;????
import java.net.*;????
public class Receive{????
????????public static void main(String args[]) throws Exception{????
????????????????DatagramSocket ds = null;????
????????????????DatagramPacket dp = null;????
????????????????//要有一個(gè)空間大小????
????????????????byte b[] = new byte[1024];????
????????????????//ds的監(jiān)聽端口就表示發(fā)送端指定好的????
????????????????ds = new DatagramSocket(8888);????
????????????????dp = new DatagramPacket(b,b.length);????
????????????????//開始接收????
????????????????ds.receive(dp);????
????????????????System.out.println(new String(dp.getData()).trim());????
????????????????ds.close();????
????????}????
} 現(xiàn)在我們測(cè)試一下哈~首先必須接收端開啟著 然后我們運(yùn)行發(fā)送端發(fā)送信息 總結(jié)
網(wǎng)絡(luò)編程在實(shí)際中確實(shí)使用越來(lái)越少,JAVA的主要特點(diǎn)全部集中在了JAVA WEB上了。
只需要了解以下概念即可:
· 網(wǎng)絡(luò)程序的分類:TCP、UDP
· 服務(wù)器 = IO + Socket + Thread ###################################################
|- MSN、QQ:一般會(huì)有兩套程序,一個(gè)是服務(wù)器端,另外一個(gè)是客戶端
B/S程序:表示的瀏覽器/ 服務(wù)器,可以理解為動(dòng)態(tài)WEB,論壇 本季目標(biāo) Sock:TCP通訊
數(shù)據(jù)報(bào):UDP通訊 Socket程序需要的類:
1、所有的用戶對(duì)于服務(wù)器來(lái)講都是一個(gè)Socket客戶端。
2、在服務(wù)器上使用ServerSocket類接收客戶端的Socket Socket通信模型 Socket編程的四個(gè)基本步驟 編寫一個(gè)服務(wù)器程序:ServerSocket 只要是網(wǎng)絡(luò)連接都要求有一個(gè)端口
public ServerSocket(int port)
public Socket accept() throws IOException 通過此方法等待客戶端的socket進(jìn)行訪問。 ServerSocket01服務(wù)器端代碼: 此服務(wù)器端的功能非常的簡(jiǎn)單,就是接收客戶端的請(qǐng)求,之后在屏幕上輸出哈~ Windows中有一個(gè)telnet命令,通過此命令就可以直接連接到服務(wù)器了。 客戶端收到http://redking.blog.51cto.com字符串,同時(shí)服務(wù)器端顯示“客戶端回應(yīng)完畢~~~” 只要是符合網(wǎng)絡(luò)的協(xié)議標(biāo)準(zhǔn),所有的客戶端都可以連接到此服務(wù)器端上。
但是一般情況下,很少說直接去使用telnet連接,往往會(huì)編寫一個(gè)客戶端。
Socket
public Socket(String host,int port) throws UnknownHostException,IOException
指定一個(gè)主機(jī)的IP地址和一個(gè)端口 ClientSocket01客戶端代碼: 驗(yàn)證下效果,和telnet一樣哈~ 以上代碼驗(yàn)證了,程序需要編寫兩套程序:
· 一個(gè)是服務(wù)器端
· 另外一個(gè)是客戶端 現(xiàn)在發(fā)現(xiàn)所有的代碼只是執(zhí)行一次就完了,那么能不能說執(zhí)行多次呢?由我的用戶可以自己發(fā)出中斷的指令。
這樣的做法我們可以做一個(gè)Socket經(jīng)典 —— Echo程序
用戶發(fā)什么內(nèi)容,服務(wù)器就會(huì)回應(yīng)什么內(nèi)容: EchoServer代碼: import java.io.*;????
import java.net.*;????
public class EchoServer{????
????????//此處為了省去處理try...catch直接拋出了異常????
????????public static void main(String args[]) throws Exception{????
????????????????ServerSocket server = null;????
????????????????//輸出肯定使用打印流????
????????????????PrintStream out = null;????
????????????????//服務(wù)器肯定也要接收輸入????
????????????????BufferedReader buf = null;????
????????????????//1.實(shí)例化一個(gè)服務(wù)器的監(jiān)聽端????
????????????????server = new ServerSocket(9999);????
????????????????//可以使用一種死循環(huán)的方式接收內(nèi)容????
????????????????Socket client = null;????
????????????????while (true){????
????????????????????????//不斷接收內(nèi)容????
????????????????????????client = server.accept();????
????????????????????????//準(zhǔn)備好向客戶端輸出內(nèi)容????
????????????????????????out = new PrintStream(client.getOutputStream());????
????????????????????????//而且客戶端要有輸入給服務(wù)器端????
????????????????????????buf = new BufferedReader(new InputStreamReader(client.getInputStream()));????
????????????????????????//下面先給出一個(gè)完整的信息提示????
????????????????????????out.println("您好!歡迎光臨:http://redking.blog.51cto.com");????
????????????????????????out.println("輸入bye表示退出哈~");????
????????????????????????//一個(gè)用戶要發(fā)很多的信息????
????????????????????????while (true){????
????????????????????????????????//接收客戶端發(fā)送而來(lái)的內(nèi)容????
????????????????????????????????String str = buf.readLine();????
????????????????????????????????if (str==null){????
????????????????????????????????????????//如果str為空就表示退出????
????????????????????????????????????????break;????
????????????????????????????????}else{????
????????????????????????????????????????//如果輸入的是bye則表示系統(tǒng)退出????
????????????????????????????????????????if ("bye".equals(str)){????
????????????????????????????????????????????????break;????
????????????????????????????????????????}????
????????????????????????????????????????//可以對(duì)用戶發(fā)來(lái)的信息進(jìn)行回應(yīng)????
????????????????????????????????????????out.println("ECHO:"+str);????
????????????????????????????????}????
????????????????????????}????
????????????????????????//進(jìn)行收尾工作????
????????????????????????out.close();????
????????????????????????buf.close();????
????????????????????????client.close();????
????????????????????????//如果要關(guān)閉服務(wù)器時(shí)可以設(shè)置標(biāo)志????
????????????????????????//server.close();????
????????????????}????
????????}????
} 看下效果: 現(xiàn)在我們用telnet連接上去看下效果 輸入bye退出連接 同時(shí)可以多次連接 典型的包含了輸入和輸出 EchoClient代碼: import java.io.*;????
import java.net.*;????
public class EchoClient{????
????????public static void main(String args[]) throws Exception{????
????????????????Socket client = null;????
????????????????BufferedReader buf = null;????
????????????????PrintStream out = null;????
????????????????//1.連接服務(wù)器????
????????????????client = new Socket("localhost",9999);????
????????????????//接收服務(wù)器端的輸入信息????
????????????????buf = new BufferedReader(new InputStreamReader(client.getInputStream()));????
????????????????System.out.println(buf.readLine());????
????????????????System.out.println(buf.readLine());????
????????????????//之后準(zhǔn)備從鍵盤接收數(shù)據(jù)????
????????????????BufferedReader in = new BufferedReader(new InputStreamReader(System.in));????
????????????????String userInput = null;????
????????????????out = new PrintStream(client.getOutputStream());????
????????????????while ((userInput=in.readLine())!=null){????
????????????????????????//表示有內(nèi)容進(jìn)來(lái),要把內(nèi)容發(fā)送到客戶端????
????????????????????????out.println(userInput);????
????????????????????????//接收服務(wù)器端的回應(yīng)????
????????????????????????System.out.println(buf.readLine());????
????????????????}????
????????????????out.close();????
????????????????in.close();????
????????????????client.close();????
????????}????
} 但是此程序有一個(gè)問題,即:當(dāng)一個(gè)用戶操作的時(shí)候,其他用戶是不能操作的
程序是單線程的,所以每次只能一個(gè)用戶訪問。
此處如果想解決,則只能使用多線程進(jìn)行操作。
首先需要編寫一個(gè)線程的類: ThreadServer代碼: import java.io.*;????
import java.net.*;????
public class ThreadServer implements Runnable{????
????????//現(xiàn)在所有的Socket都要?dú)w入到一個(gè)線程之中????
????????private Socket client = null;????
????????public ThreadServer(Socket client){????
????????????????this.client = client;????
????????}????
????????public void run(){????
????????????????//要不斷的接收客戶發(fā)送來(lái)的信息????
????????????????String input = null;????
????????????????//通過BufferedReader進(jìn)行接收????
????????????????BufferedReader buf = null;????
????????????????//有一個(gè)輸出的對(duì)象????
????????????????PrintStream out = null;????
????????????????try{????
????????????????????????buf = new BufferedReader(new InputStreamReader(this.client.getInputStream()));????
????????????????????????while(true){????
????????????????????????????????//接收發(fā)送過來(lái)的信息????
????????????????????????????????input = buf.readLine();????
????????????????????????????????out = new PrintStream(this.client.getOutputStream());????
????????????????????????????????if ("bye".equals(input)){????
????????????????????????????????????????break;????
????????????????????????????????}else{????
????????????????????????????????????????out.println("ECHO:"+input);????
????????????????????????????????}????
????????????????????????}????
????????????????????????this.client.close();????
????????????????}catch (Exception e){}????
????????}????
} EchoServer01服務(wù)器端代碼:? import java.io.*;????
import java.net.*;????
public class EchoServer01{????
????????//此處為了省去處理try...catch直接拋出了異常????
????????public static void main(String args[]) throws Exception{????
????????????????ServerSocket server = null;????
????????????????//輸出肯定使用打印流????
????????????????PrintStream out = null;????
????????????????//服務(wù)器肯定也要接收輸入????
????????????????BufferedReader buf = null;????
????????????????//1.實(shí)例化一個(gè)服務(wù)器的監(jiān)聽端????
????????????????server = new ServerSocket(9999);????
????????????????//可以使用一種死循環(huán)的方式接收內(nèi)容????
????????????????Socket client = null;????
????????????????while (true){????
????????????????????????//不斷接收內(nèi)容????
????????????????????????client = server.accept();????
????????????????????????//在此處啟動(dòng)了一個(gè)線程????
????????????????????????new Thread(new ThreadServer(client)).start();????
????????????????}????
????????}????
} 使用telnet測(cè)試效果哈~ ? 通過以上代碼,可以發(fā)現(xiàn),多線程實(shí)際上在服務(wù)器上是比較常用的。
服務(wù)器 = 多線程 + IO + Socket
Socket程序?qū)嶋H上是屬于TCP程序,是一個(gè)穩(wěn)定的連接 UDP程序:數(shù)據(jù)報(bào)程序 Send發(fā)送端代碼: import java.io.*;????
import java.net.*;????
public class Send{????
????????public static void main(String args[]) throws Exception{????
????????????????DatagramSocket ds = null;????
????????????????DatagramPacket dp = null;????
????????????????//發(fā)送端必須有一個(gè)監(jiān)視的端口????
????????????????ds = new DatagramSocket(9999);????
????????????????String str = "http://redking.blog.51cto.com";????
????????????????//發(fā)送的內(nèi)容只能是byte數(shù)組????
????????????????//接收端端口號(hào)是8888????
????????????????dp = new DatagramPacket(str.getBytes(),str.length(),InetAddress.getByName("localhost"),8888);????
????????????????ds.send(dp);????
????????????????ds.close();????
????????}????
} 看下效果: 信息已經(jīng)發(fā)送出去了哈~ 下面我們?cè)賹憘€(gè)接收代碼 Receive接收端代碼: import java.io.*;????
import java.net.*;????
public class Receive{????
????????public static void main(String args[]) throws Exception{????
????????????????DatagramSocket ds = null;????
????????????????DatagramPacket dp = null;????
????????????????//要有一個(gè)空間大小????
????????????????byte b[] = new byte[1024];????
????????????????//ds的監(jiān)聽端口就表示發(fā)送端指定好的????
????????????????ds = new DatagramSocket(8888);????
????????????????dp = new DatagramPacket(b,b.length);????
????????????????//開始接收????
????????????????ds.receive(dp);????
????????????????System.out.println(new String(dp.getData()).trim());????
????????????????ds.close();????
????????}????
} 現(xiàn)在我們測(cè)試一下哈~首先必須接收端開啟著 然后我們運(yùn)行發(fā)送端發(fā)送信息 總結(jié)
網(wǎng)絡(luò)編程在實(shí)際中確實(shí)使用越來(lái)越少,JAVA的主要特點(diǎn)全部集中在了JAVA WEB上了。
只需要了解以下概念即可:
· 網(wǎng)絡(luò)程序的分類:TCP、UDP
· 服務(wù)器 = IO + Socket + Thread ###################################################
轉(zhuǎn)載于:https://blog.51cto.com/redking/135374
總結(jié)
以上是生活随笔為你收集整理的[零基础学JAVA]Java SE应用部分-32.Java网络编程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何在XenServer主机上安装虚拟机
- 下一篇: C# 视频监控系列(7):服务器端——封