端口號是用兩個字節(16位的二進制數)表示的,它的取值範圍是0~65535,其中,0~1023之間的端口號用於一些知名的網絡服務和應用,數組
用戶的普通應用程序須要使用1024以上的端口號,從而避免端口號被另一個應用或服務所佔用。服務器
經常使用方法網絡
代碼演示:多線程
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 }
代碼演示: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 }
一個是ServerSocket類,用於表示服務器端,一個是Socket類,用於表示客戶端。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 }