java--UDP通訊和TCP通訊

 IP地址和端口號

端口號是用兩個字節(16位的二進制數)表示的,它的取值範圍是0~65535,其中,0~1023之間的端口號用於一些知名的網絡服務和應用,數組

用戶的普通應用程序須要使用1024以上的端口號,從而避免端口號被另一個應用或服務所佔用。服務器

     InetAddress

經常使用方法網絡

代碼演示:多線程

複製代碼
1     public static void main(String[] args) throws UnknownHostException {
2         //InetAddress inet=InetAddress.getLocalHost();
3         //主機名+ip地址
4         InetAddress inet=InetAddress.getByName("DESKTOP-KCD8G34");
5         System.out.println(inet);
6         String host=inet.getHostName();
7         String ip=inet.getHostAddress();
8         System.out.println(host+"..."+ip);
9     }
複製代碼

UDP通訊

DatagramPacket

   DatagramSocket

 UDP網絡程序

 

 代碼演示:oracle

複製代碼
 1 //發送端
 2 public class UDPSend {
 3     public static void main(String[] args) throws IOException {
 4         //1.打包
 5         //明確數據
 6         byte[] bytes="你好嗎".getBytes();
 7         //明確目的地的IP地址
 8         InetAddress inet=InetAddress.getByName("127.0.0.1");
 9         //裝包
10         DatagramPacket dp=new DatagramPacket(bytes, bytes.length,inet,8888);
11         //2.建立快遞公司
12         DatagramSocket ds=new DatagramSocket();
13         //3.發送
14         ds.send(dp);
15         //4.釋放資源
16         ds.close();
17     }
18 
19 }
複製代碼
複製代碼
 1 //接收端
 2 public class UDPReceive {
 3     public static void main(String[] args) throws IOException {
 4         //明確端口號
 5         DatagramSocket ds=new DatagramSocket(8888);
 6         //建立接收數據的字節數組
 7         byte[] bytes=new byte[1024];
 8         //建立接收的數據包
 9         DatagramPacket dp=new DatagramPacket(bytes, bytes.length);
10         //接收
11         ds.receive(dp);
12         //獲取接收包上的數據
13         int length=dp.getLength();
14         String ip=dp.getAddress().getHostAddress();
15         int port=dp.getPort();
16         System.out.println("ip地址爲:"+ip+"端口號爲:"+port+"發送的內容爲:"+new String(bytes,0,length));
17         //釋放資源
18         ds.close();
19     }
20 
21 }
複製代碼

   TCP通訊

 

一個是ServerSocket類,用於表示服務器端,一個是Socket類,用於表示客戶端。socket

ServerSocket

   Socket

方法聲明this

功能描述spa

int getPort()線程

該方法返回一個int類型對象,該對象是Socket對象與服務器端鏈接的端口號3d

InetAddress getLocalAddress()

該方法用於獲取Socket對象綁定的本地IP地址,並將IP地址封裝成InetAddress類型的對象返回

void close()

該方法用於關閉Socket鏈接,結束本次通訊。在關閉socket以前,應將與socket相關的全部的輸入/輸出流所有關閉,這是由於一個良好的程序應該在執行完畢時釋放全部的資源

InputStream getInputStream()

該方法返回一個InputStream類型的輸入流對象,若是該對象是由服務器端的Socket返回,就用於讀取客戶端發送的數據,反之,用於讀取服務器端發送的數據

OutputStream getOutputStream()

該方法返回一個OutputStream類型的輸出流對象,若是該對象是由服務器端的Socket返回,就用於向客戶端發送數據,反之,用於向服務器端發送數據

圖解:

代碼演示:

複製代碼
 1 //發送端
 2 public class UDPSend {
 3     public static void main(String[] args) throws IOException {
 4         //1.打包
 5         //明確數據
 6         Scanner sc=new Scanner(System.in);
 7         //明確目的地的IP地址
 8         InetAddress inet=InetAddress.getByName("192.168.1.171");
 9         //2.建立快遞公司
10         DatagramSocket ds=new DatagramSocket();
11         while(true){
12             String mes=sc.next();
13             byte[] bytes=mes.getBytes();
14             //裝包
15             DatagramPacket dp=new DatagramPacket(bytes, bytes.length,inet,6666);
16             //3.發送
17             ds.send(dp);
18         }    
19         //4.釋放資源
20         //ds.close();
21         
22     }
複製代碼
複製代碼
 1 //接收端
 2 public class UDPReceive {
 3     public static void main(String[] args) throws IOException {
 4         //明確端口號
 5         DatagramSocket ds=new DatagramSocket(8888);
 6         //建立接收數據的字節數組
 7         byte[] bytes=new byte[1024];
 8         //建立接收的數據包
 9         while(true){
10             DatagramPacket dp=new DatagramPacket(bytes, bytes.length);
11             //接收
12             ds.receive(dp);
13             //獲取接收包上的數據
14             int length=dp.getLength();//明確發送的字節長度
15             String ip=dp.getAddress().getHostAddress();
16             int port=dp.getPort();
17             System.out.println("ip地址爲:"+ip+"端口號爲:"+port+"發送的內容爲:"
18                                             +new String(bytes,0,length));
19         }
20 }
複製代碼

  

複製代碼
 1 //服務器端
 2 public class TCPServer {
 3     public static void main(String[] args) throws IOException {
 4         //建立服務器套接字
 5         ServerSocket server=new ServerSocket(7777);
 6         //調用accept方法與客戶端建立連接
 7         Socket socket=server.accept();
 8         InputStream in=socket.getInputStream();
 9         byte[] bytes=new byte[1024];
10         int len=in.read(bytes);
11         System.out.println(new String(bytes,0,len));
12         //服務器給客戶端回覆
13         OutputStream out=socket.getOutputStream();
14         out.write("收到!over!".getBytes());
15         
16         server.close();
17     }
複製代碼
複製代碼
 1 //客戶端
 2 public class TCPCLient {
 3     public static void main(String[] args) throws IOException {
 4         //1.建立Socket對象,鏈接服務器
 5         Socket socket=new Socket("127.0.0.1",7777);
 6         //2.經過客戶端套接字對象Socket對象中的獲取字節輸出流的方法
 7         OutputStream out=socket.getOutputStream();
 8         //3.將數據寫向服務器
 9         out.write("服務器你好".getBytes());
10         //接收服務器端的回覆
11         InputStream in=socket.getInputStream();
12         byte[] bytes=new byte[1024];
13         int len=in.read(bytes);
14         System.out.println(new String(bytes, 0, len));
15         //釋放資源
16         socket.close();
17     }
複製代碼

 

文件上傳案例

代碼演示:

複製代碼
 1 public class TCPServer {
 2     public static void main(String[] args) throws IOException {
 3         ServerSocket server=new ServerSocket(5555);
 4         Socket socket=server.accept();
 5         //明確數據源
 6         InputStream in=socket.getInputStream();
 7         //明確目的地
 8         File file=new File("x:\\upload");
 9         if(!file.exists()){
10             file.mkdirs();
11         }
12         //域名+毫秒值
13         String filename="oracle"+System.currentTimeMillis()+".jpg";
14         FileOutputStream fos=new FileOutputStream(file+File.separator+filename);
15         //複製
16         int len=0;
17         byte[] bytes=new  byte[1024];
18         while((len=in.read(bytes))!=-1){
19             fos.write(bytes,0,len);
20         }
21 
22         //回覆客戶端
23         OutputStream out=socket.getOutputStream();
24         out.write("上傳成功!".getBytes());
25         //釋放資源
26         server.close();
27         fos.close();
28     }
29 }
複製代碼
複製代碼
 1 public class TCPClinet {
 2     public static void main(String[] args) throws IOException {
 3         Socket socket=new Socket("192.168.1.171",7000);
 4         OutputStream out=socket.getOutputStream();
 5         //明確數據源
 6         FileInputStream fis=new FileInputStream("x:\\test\\img1.jpg");
 7         int len=0;
 8         byte[] bytes=new byte[1024];
 9         //文件複製 
10         while((len=fis.read(bytes))!=-1){
11             out.write(bytes,0,len);
12         }
13         //告訴服務器端不要在讀了到末尾了
14         socket.shutdownOutput();
15         //服務器端回覆
16         InputStream in=socket.getInputStream();
17         len=in.read(bytes);
18         System.out.println(new String(bytes, 0, len));
19         //釋放資源
20         fis.close();
21         socket.close();
22     }
23 
24 }
複製代碼

  文件上傳案例多線程版本

代碼演示:

複製代碼
1 public class Demo {
2     public static void main(String[] args) throws IOException {
3         ServerSocket server=new ServerSocket(6000);
4         while(true){
5             Socket socket=server.accept();
6             new Thread(new Upload(socket)).start();
7         }    
8     }
9 }
複製代碼
複製代碼
 1 public class Upload implements Runnable{
 2     private Socket socket;
 3     public Upload(Socket socket){
 4         this.socket=socket;
 5     }
 6     public void run() {
 7         //明確數據源
 8         FileOutputStream fos=null;
 9         try {
10             InputStream in= socket.getInputStream();
11             //明確目的地
12             File file=new File("x:\\upload");
13             if(!file.exists()){
14                 file.mkdirs();
15             }
16             //域名+毫秒值
17             String filename="oracle"+System.currentTimeMillis()+".jpg";
18             fos=new FileOutputStream(file+File.separator+filename);
19             //複製
20             int len=0;
21             byte[] bytes=new  byte[1024];
22             while((len=in.read(bytes))!=-1){
23                 fos.write(bytes,0,len);
24             }
25             //回覆客戶端
26             OutputStream out=socket.getOutputStream();
27             out.write("上傳成功!".getBytes());
28         } catch (IOException e) {
29             e.printStackTrace();
30         }finally{
31             //釋放資源
32             try {
33                 fos.close();
34             } catch (IOException e) {
35                 e.printStackTrace();
36             }
37         }
38     }
39 }
複製代碼
相關文章
相關標籤/搜索