今天主要學習一點基於socket通信的java網絡編程的基本原理和例子:
要想實現網絡中的通信我們需要借助socket,即我們需要知道IP地址和應用進程的端口號,再利用相關的協議、借助物理介質的傳送,這就是實現網絡傳輸的基本。
所以,對於網絡編程而言,socket起著關鍵作用,我們直接看下面的代碼,分別是服務器端和客戶端的程序,這是最簡單、單線程的通訊的網絡編程的例子,但是它卻體現了基本的原理。
package SocketTest;
/*
* 服務器端程序
*/
import java.net.*;
import java.io.*;
import java.util.Scanner;
public class MyServer{
public static void main(String[] args) throws Exception{
// 啟動一個服務端 端口號:0-65535 1024以下不建議使用。
System.out.println("*********服務器***********");
ServerSocket ss = new ServerSocket(8899);
// 這是一個阻塞的操作,等待客戶端連接
Socket s = ss.accept();
System.out.println("一個客戶端連接上來了");
//利用包裝流實現聽筒
InputStream is = s.getInputStream();
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
//利用包裝流實現話筒
OutputStream os = s.getOutputStream();
PrintStream ps = new PrintStream(os);
//定義一個Boolean型的標志位,可以使while(true)循環騙過編譯器
boolean flag = true;
Scanner scan = new Scanner(System.in);
while(flag){
String str = br.readLine();//聽話
System.out.println("客戶端說:"+str);
ps.println(scan.next());// 說話
}
//記得關閉包裝流和socket
s.close();
br.close();
ps.close();
ss.close();
}
}
package SocketTest;
/*
* 客戶端
*/
import java.net.*;
import java.io.*;
import java.util.Scanner;
public class MyClient {
public static void main(String[] args) throws Exception{
// 啟動一個客戶端。
System.out.println("*********客戶端***********");
Socket s = new Socket("127.0.0.1",8899);
//包裝流:話筒
OutputStream os = s.getOutputStream();
PrintStream ps = new PrintStream(os);
// 輸入流:聽筒
InputStream is = s.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
boolean flag = true;
Scanner scan = new Scanner(System.in);
while(flag){
ps.println(scan.next());
System.out.println("服務器說:"+br.readLine());
}
ps.close();
br.close();
os.close();
s.close();
}
}
接下來我們運行這兩個程序,注意:一定要先運行服務器端來監聽等待客戶端的連接,再運行客戶端。
運行結果:
服務器:
客戶端: