一:網絡通信的三要素?
IP地址 端口號 通信協議
IP地址:是網絡中設備的通信地址。由於IP地址不易記憶,故可以使用主機名。本地環回地址,127.0.0.1 本地主機名localhost
端口號:發送端准備的數據要發送到指定的目的應用程序上,為了標識這些應用程序,所以用網絡數字來標識這些不同的應用程序,這些數
字稱為端口號。端口號是不同進程之間的標識。一般來說,有0~65535的端口可供使用,但是1~1024系統使用,或者稱作保留端口。
通信協議:指定義的通信規則,這個規則稱為協議。國際組織定義了通用TCP/IP協議。我們常見的通信協議有TCP 協議 UDP協議
二:Java中基於TCP協議的網絡編程?
首先,我們需要了解TCP協議的一些基本特點:
TCP協議,是面向連接的可靠協議。在數據傳輸前,必須先建立雙方的連接,所以說是面向連接的。在建立的連接中,可以進行大數據量的傳輸。而且,tcp協議通過三次握手完成連接,所以說是可靠的協議。同時,傳輸效率比較低。
接下來我們得清楚TCP協議下的網絡編程的編程思路:
需要用到兩個類:Socket(實現客戶端套接字)和ServerSocket(實現服務器套接字)
客戶端:
准備好要發送的數據包
創建客戶端的套接字,與服務器端建立連接
調用Socket的方法來發送數據報包
關閉套接字
服務器端:
准備接收數據客戶端建立連接
創建服務器的套接字,並且與客戶端建立連接
調用ServerSocket的方法來接受數據
關閉套接字
三:實例如下
實現基本的客戶端的與服務器之間的通信。
客戶端代碼:
package com.itycl.net; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.Socket; import java.net.UnknownHostException; public class TcpClientDemo1 { public static void main(String[] args) throws Exception { Socket s=new Socket("192.168.3.109",8833);//建立連接,綁定目的應用程序的IP地址和端口號 OutputStream oo=s.getOutputStream();//調用getOutputStream()來發送數據 BufferedWriter ow=new BufferedWriter(new OutputStreamWriter(oo));//把要發送的數據寫到緩沖區 BufferedReader br=new BufferedReader(new InputStreamReader(System.in));//讀取鍵盤中輸入的數據 String line=null; while((line=br.readLine())!=null) { ow.write(line); ow.newLine(); ow.flush(); } } }
服務器端代碼:
package com.itycl.net; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class TcpServerDemo1 { public static void main(String[] args) throws Exception { ServerSocket ss=new ServerSocket(8833);//建立服務器端然套接字 Socket s=ss.accept();//調用accept方法接受並且監聽連接 InputStream is=s.getInputStream();//調用getInputStream()來接收數據 BufferedReader br=new BufferedReader(new InputStreamReader(is)); String ip=s.getInetAddress().getHostAddress(); String line=null; while((line=br.readLine())!=null) { byte[] buf=line.getBytes(); String data=new String(buf,0,buf.length); System.out.println(ip +" : "+data); } } }
四.實現客戶端與服務器的通信,並且將聊天記錄保存在某個盤符下。
要求:可循環發送接收消息,並且保存的聊天記錄中要有IP地址+時間+接收的數據,且,要求在一個Java文件中實現。
實例代碼:
package com.itycl.net; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; import java.text.SimpleDateFormat; import java.util.Date; public class TcpClientAndServerDemo { public static void main(String[] args) { new Thread(new Client()).start(); try {Thread.sleep(30);}catch(Exception e) {} new Thread(new Server()).start(); } } class Client implements Runnable{ @Override public void run() { try { Socket s=new Socket("localhost",8962); OutputStream os = s.getOutputStream(); BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os)); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); String line=null; while((line=br.readLine())!=null) { byte[] buf=line.getBytes(); String data=new String(buf,0,buf.length); bw.write(data); bw.newLine(); bw.flush(); } bw.close(); }catch(Exception e) {} } } class Server implements Runnable{ @Override public void run() { try { ServerSocket ss=new ServerSocket(8962); Socket s = ss.accept(); InputStream is = s.getInputStream(); BufferedReader br=new BufferedReader(new InputStreamReader(is)); String line=null; while((line=br.readLine())!=null) { byte[] buf=line.getBytes(); String data=new String(buf,0,buf.length); String ip=s.getInetAddress().getHostAddress(); SimpleDateFormat sdft=new SimpleDateFormat("HH:MM:s");//格式化日期 Date date=new Date(); String format = sdft.format(date); System.out.println(ip+" : "+format+" : "+data);//輸出數據 BufferedWriter bw=new BufferedWriter(new FileWriter("E://liaotianjilu.txt",true)); //將聊天記錄保存到E盤 bw.write(ip+" : "+format+" : "+data); bw.newLine(); bw.flush(); } }catch(Exception e) {} } }