實現計算機互聯的三要素:
1、IP地址
本機迴路IP:127.0.0.1
2、端口號(邏輯端口):用於標識應用程序。
端口號0~65535之間的整數;0~1024之間大部分已被用於一些知名的網絡服務和應用,所以現在開發的網絡應用程序端口號一般是1024以後的整數。
3、通信協議
TCP:三次握手機制,面向連接,稍慢。可靠
UDP:無連接,每個數據報大小限制在64K內。傳輸快。不可靠。
TCP/IP參考模型:
網絡編程:其實就是Socket編程
通信的兩端都有Socket, 數據在兩個Socket間通過IO傳輸。
UDP傳輸:DatagramSocket和DatagramPacket
UDP通信示例:
class UDPsend {
public static void main(String[] args) throws Exception {
//創建UDP socket端點,可以指定固定端口發送數據,不指定則系統隨機產生
DatagramSocket ds = new DatagramSocket();
//確定數據,並封裝成數據包
byte[] buf = "Hello, java".getBytes();
DatagramPacket dp = new DatagramPacket(buf, 0, buf.length, InetAddress.getByName("127.0.0.1"), 8888);
//通過UDP socket的sent方法發送數據
ds.send(dp);
System.out.println("發送成功");
}
}
class UDPreceive {
public static void main(String[] args) throws Exception {
//創建UDP socket端點,指定用於接收數據的端口
DatagramSocket ds = new DatagramSocket(8888);
//定義數據包用於接收數據
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, 0, buf.length);
//接收數據存入於數據包中
ds.receive(dp);
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(), 0, dp.getLength());
int port = dp.getPort();
System.out.println(ip + ", " + port + ", " + data);
ds.close();
}
}
實例:用TCP完成一個英文文本大小寫轉換的客戶端和服務器端
客戶端發送一個英文字符串到服務端,服務端返回一個將字符串轉爲全大寫後的信息到客戶端
import java.net.*;
import java.io.*;
/*
* 建立一個文本轉換器
*
* 分析:操作的是客戶端發來的文本信息數據,所以要用到IO流技術。
*
* 步驟:
* 1、建立服務
* 2、獲取鍵盤錄入
* 3、將數據發給服務端
* 4、服務端將小寫字母全部轉換爲大寫後發送給客戶端
* 5、關閉資源
* */
public class TCPTextCast {
public static void main(String[] args) {
}
}
class TCPClient1 {
public static void main(String[] args) throws Exception {
Socket s = new Socket("127.0.0.1", 10003);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//優化:PrintWriter out =new PrintWriter(s.getOutputStream(), true);
//將bufOut傳入PrintWriter(bufOut)也行
BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
String line = null;
while((line=br.readLine())!= null) {
if("over".equals(line))
break;
bufOut.write(line);
bufOut.newLine();
bufOut.flush();
//三句變一句,用out.println(line);
System.out.println("Server: " + bufIn.readLine());
}
br.close();
s.close();
}
}
TCP實例:
/*
* 使用TCP協議寫一個可以上傳文件的服務器和客戶端。
*
* 思路:網絡編程與IO流相拼命
* 客戶端通過socket向其輸出流中寫入本地文件,用到FileInputStream讀取文件,也可加上緩衝BufferedInputStream.
* 還有通過socket的輸入流讀取服務器端的反饋信息。
* 服務端通過socket從其輸入流中讀取文件,存入到服務器端,並返回文件複製情況信息
* 資源關閉
* */
import java.net.*;
import java.io.*;
public class FileLoader {
public static void main(String[] args) {
}
}
//客戶端
class client {
public static void main(String[] args) throws Exception {
//建立Socket服務
Socket fileLoaderSocket = new Socket("127.0.0.1", 10005);
//從客戶端本地讀取文件,並寫入socket的輸出流中
OutputStream out = fileLoaderSocket.getOutputStream();
InputStream fileRead = new FileInputStream("G:\\Demo.mp3");
byte[] buf = new byte[1024];
int len = 0;
while((len=fileRead.read(buf)) != -1) {
out.write(buf, 0, len);
}
//告訴服務端,文件已傳輸完畢
fileLoaderSocket.shutdownOutput();
//獲取從服務端反饋的信息
BufferedReader in = new BufferedReader(new InputStreamReader(fileLoaderSocket.getInputStream()));
String serverBack = in.readLine();
System.out.println(serverBack);
//資源關閉
fileLoaderSocket.close();
fileRead.close();
}
}
//服務端
class Server {
public static void main(String[] args) throws Exception {
//建立服務端Socket
ServerSocket ss = new ServerSocket(10005);
//接收客戶端Socket
Socket fileLoaderSocket = ss.accept();
//打印連接信息
String ip = fileLoaderSocket.getInetAddress().getHostAddress();
System.out.println(ip + "...conncected");
//接收文件,並保存
InputStream in = fileLoaderSocket.getInputStream();
OutputStream fileSave = new FileOutputStream("E:\\server.mp3");
byte[] buf = new byte[1024];
int len = 0;
while((len=in.read(buf)) != -1) {
fileSave.write(buf, 0, len);
fileSave.flush();
}
//返回文件複製情況信息
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(fileLoaderSocket.getOutputStream()));
out.write("文件上傳成功");
out.flush();
//資源關閉
ss.close();
fileLoaderSocket.close();
fileSave.close();
}
}
class TCPServer1 {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(10003);
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip + "...connceted");
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String data = null;
while((data=br.readLine()) != null) {
System.out.println(ip + "... : " + data);
bw.write(data.toUpperCase());
bw.newLine();
bw.flush();
}
s.close();
ss.close();
}
}