(一)網路程式設計
概述:所謂網路程式設計,即通過網路實現資料的傳送與接收。也就實現了人與人通過機器與機器之間的通訊實現了通訊。
程式設計:下面將列出網路程式設計常用的方法,而其實常用方法用的的很少,其中,客戶端擁有建立輸入輸出流的方法,為資料傳輸的實現提供裡必要的幫助
InetAddress類常用方法:
①InetAddress getLocalHost():獲取本地主機名
②InetAddress getByName(String host):根據主機名獲取IP地址
ServerSocket(伺服器端)常用方法:
①ServerSocket(int port):建立客戶端,並給定埠號
②Server accept():等待有客戶端連線後返回該客戶端
Socket(客戶端)類方法:
①Socket(String host,int port):建立客戶端,引數為要連線伺服器的埠號
例一(簡單的客戶端與伺服器端資料傳輸Demo):
服務端:
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerSocketDemo {
public static void main(String[] args) throws Exception {
//建立服務端並確定埠號
ServerSocket server=new ServerSocket(1888);
System.out.println("等待連線");
//接收客戶端,如果沒有客戶端連線,則該語句會阻截程式停留在該語句,不會再向下進行
Socket socket=server.accept();
System.out.println("連線成功");
//建立輸入輸出流,用於資料的傳送與接收
PrintWriter pw=new PrintWriter(socket.getOutputStream(),true);
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
int a=(int)(Math.random()*30);
int b=(int)(Math.random()*30);
int c=(int)(Math.random()*30);
//將所生成的資料進行輸入
pw.println("服務端生成的數字為"+a+","+b+","+c);
System.out.println("服務端生成的數字為"+a+","+b+","+c);
System.out.println(br.readLine());
int sum=a+b+c;
//將所生成的資料進行輸入
pw.println(sum);
System.out.println("服務端的和為:"+sum);
//輸出所接收資料
String read=br.readLine();
System.out.println("客戶端的和為:"+read);
if(Integer.parseInt(read)>sum) {
System.out.println("客戶端獲勝");
}else if(Integer.parseInt(read)<sum){
System.out.println("服務端獲勝");
}else {
System.out.println("平局");
}
}
}
客戶端:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class ClientDemo {
public static void main(String[] args) throws Exception {
//建立客戶端,並制定所連線伺服器的埠號
Socket socket=new Socket("localhost",1888);
System.out.println("客戶端已建立");
//建立輸入輸出流
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(br.readLine());
PrintWriter pw=new PrintWriter(socket.getOutputStream(),true);
int a=(int)(Math.random()*30);
int b=(int)(Math.random()*30);
int c=(int)(Math.random()*30);
//給服務端傳送資料
pw.println("客戶端生成的數字為"+a+","+b+","+c);
System.out.println("客戶端生成的數字為"+a+","+b+","+c);
//讀取服務端傳送來的資料
String read=br.readLine();
System.out.println("服務端的和為:"+read);
int sum=a+b+c;
pw.println(sum);
System.out.println("客戶端的和為:"+sum);
if(Integer.parseInt(read)>sum) {
System.out.println("服務端獲勝");
}else if(Integer.parseInt(read)<sum){
System.out.println("客戶端獲勝");
}else {
System.out.println("平局");
}
}
}
注:在啟動時,必須先啟動服務端,再啟動客戶端,否則會報錯。服務端不能重複啟動,否則會報埠被佔用異常。如果想要實現兩臺裝置互發資料,則需要在同一區域網下通過服務端ip地址進行連線,再將服務端與客戶端依次啟動,在連線成功後便可進行通訊。
執行結果:
服務端: 客戶端:
例二(例一程式碼優化):
服務端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server1 {
private ServerSocket ss;
public Server1() {
try {
ss=new ServerSocket(8888);
} catch (IOException e) {
e.printStackTrace();
}
}
public void start() {
System.out.println("等待連線");
try {
Socket socket=ss.accept();
System.out.println("連線成功");
int num1=(int)((Math.random()*30)+1);
int num2=(int)((Math.random()*30)+1);
int num3=(int)((Math.random()*30)+1);
//輸出服務端生成的數字
System.out.println("服務端生成的數字為:"+num1+","+num2+","+num3);
//傳送服務端生成的數字
PrintWriter pw=new PrintWriter(socket.getOutputStream(),true);
pw.println(num1+","+num2+","+num3);
//輸出客戶端生成的數字
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String clientMessage =br.readLine();
System.out.println("客戶端生成的數字為:"+clientMessage);
//輸出服務端的和
System.out.println("服務端的和為:"+(num1+num2+num3));
//輸出客戶端的和
int sum=0;
String[] sa=clientMessage.split(",");
if(sa!=null) {
for(String s:sa) {
sum+=Integer.parseInt(s);
}
}
System.out.println("客戶端的和為:"+sum);
//進行比較
if((num1+num2+num3)>sum) {
System.out.println("服務端獲勝");
}else if((num1+num2+num3)<sum) {
System.out.println("客戶端獲勝");
}else {
System.out.println("平局");
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Server1 server=new Server1();
server.start();
}
}
客戶端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class Client1 {
private Socket socket;
public Client1() {
try {
socket=new Socket("localhost",8888);
} catch (IOException e) {
e.printStackTrace();
}
}
public void start() {
try {
//輸出服務端生成的數字
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String ServerMessage=br.readLine();
System.out.println("服務端生成的數字為:"+ServerMessage);
//輸出客戶端生成的數字
int num1=(int)((Math.random()*30)+1);
int num2=(int)((Math.random()*30)+1);
int num3=(int)((Math.random()*30)+1);
System.out.println("客戶端生成的數字為:"+num1+","+num2+","+num3);
//傳送客戶端生成的數字
PrintWriter pw=new PrintWriter(socket.getOutputStream(),true);
pw.println(num1+","+num2+","+num3);
//輸出服務端數字的和
int sum=0;
String[] sa=ServerMessage.split(",");
for(String s:sa) {
sum+=Integer.parseInt(s);
}
System.out.println("服務端的和為:"+sum);
System.out.println("客戶端的和為:"+(num1+num2+num3));
if((num1+num2+num3)<sum) {
System.out.println("服務端獲勝");
}else if((num1+num2+num3)>sum) {
System.out.println("客戶端獲勝");
}else {
System.out.println("平局");
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Client1 c=new Client1();
c.start();
}
}
例三(實現客戶端與服務端字串的傳送):
服務端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server2 {
private ServerSocket ss;
public Server2() {
try {
ss=new ServerSocket(8888);
} catch (IOException e) {
e.printStackTrace();
}
}
public void start() {
//連線客戶端
System.out.println("等待連線");
try {
Socket socket=ss.accept();
System.out.println("連線成功");
Scanner sc=new Scanner(System.in);
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter pw=new PrintWriter(socket.getOutputStream(),true);
/*while(br.readLine()!=null) {
str=br.readLine();
System.out.println(str);
}*/
while(true) {
String str=br.readLine();
System.out.println(str);
String str1=sc.next();
pw.println(str1);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Server2 s=new Server2();
s.start();
}
}
客戶端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class Client2 {
private Socket socket;
public Client2() {
try {
socket=new Socket("localhost",8888);
} catch (IOException e) {
e.printStackTrace();
}
}
public void start() {
Scanner sc=new Scanner(System.in);
String exit="EXIT";
try {
PrintWriter pw=new PrintWriter(socket.getOutputStream(),true);
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
/*while(!exit.equals("EXIT")) {
String s=sc.next();
pw.println(s);
}*/
while(true) {
String s=sc.next();
if("EXIT".equals(s)) {
break;
}
pw.println(s);
String str1=br.readLine();
System.out.println(str1);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Client2 c=new Client2();
c.start();
}
}
執行結果:
服務端: 客戶端:
注:該程式碼存在缺陷,在連線成功之後必須先由客戶端傳送訊息,在服務端接收後才能由服務端向客戶端再發送訊息。如果服務端先輸入了訊息,在回車確認後訊息是無法傳輸的,只有在客戶端傳送訊息後服務端之前確認傳送的訊息才會自動向客戶端傳送,本程式碼只是為了瞭解服務端與客戶端互發訊息過程,故該瑕疵可忽略,理解過程即可。