Java学习笔记十

网络编程:

一、osi和TCP协议对照:

二、通讯三要素

三、InetAddress对象简述:

 1 import java.net.InetAddress;
 2 import java.net.UnknownHostException;
 3 
 4 public class IpClassDemo
 5 {
 6     public static void main(String[] args) throws UnknownHostException{
 7         demo();
 8     }
 9 
10     public static void demo() throws UnknownHostException{
11         //InetAddress没有构造方法,不能直接创建对象
12         //获取本机
13         InetAddress ip=InetAddress.getLocalHost();
14         //获取其他主机
15         ip=InetAddress.getByName("k01");
16         System.out.println(ip.getHostAddress());
17         System.out.println(ip.getHostName());
18     }
19 
20 }
InetAddress

socket:套接字,网络编程的基础。发送端和接收端都需要socket。

四、UDP实现:首先Java封装了UDP所使用的socket对象-->DatagramSocket,可以简单的获取并加以使用。

UDP是协议,所以要完成通讯,还需要体现另外两个要素:ip和端口。

ip是在发送端使用,指定接收端的地址,端口是发送端和接收端数据交换的线程号

 1 import java.io.IOException;
 2 import java.net.DatagramPacket;
 3 import java.net.DatagramSocket;
 4 import java.net.InetAddress;
 5 
 6 public class UDPSendDemo {
 7     public static void main(String[] args) throws IOException{
 8         System.out.println("发送端启动...");
 9         sendemo();
10     }
11 
12     public static void sendemo() throws IOException {
13         /*使用UDP发送数据需要四步,
14          * 1、建立发送端的socket服务,对于UDP协议来说就是创建DatagramSocket对象
15          * 2、将数据封包,对于UDP协议来说使用的是DatagramPacket对象。!!!该对象还可以用于拆包数据
16          * 3、使用socket服务发送:这里需要使用通讯协议的另外两个点-->1、接收端的ip,2、端口
17          * 注意:传输的信息会被接收端的对应端口接收
18          * 4、关闭socket服务
19          */
20         DatagramSocket ds=new DatagramSocket();
21         
22         String context="UDP发送演示";
23         byte[] buf=context.getBytes();
24         
25         DatagramPacket dp=new DatagramPacket(buf, buf.length, InetAddress.getByName("192.16.25.16"), 10000);
26         
27         ds.send(dp);
28         
29         ds.close();
30     }
31 }
UDP发送端演示
 1 import java.io.IOException;
 2 import java.net.DatagramPacket;
 3 import java.net.DatagramSocket;
 4 
 5 public class UDPReceiveDemo {
 6 
 7     public static void main(String[] args) throws IOException {
 8         System.out.println("接收端启动...");
 9         receivedemo();
10     }
11 
12     public static void receivedemo() throws IOException {
13         /*使用UDP接收数据和发送过程类似
14          * 1、建立发送端的socket服务,!!!需要明确端口号
15          * 2、创建数据包,准备存储和解析数据
16          * 3、使用socket的receive()接收数据存入准备好的解析对象中
17          * 4、使用数据包的解析方法解析数据,即拆包.可以解析出发送端地址,端口,数据内容等信息
18          * 5、关闭socket服务
19          */
20         DatagramSocket ds=new DatagramSocket(10000);
21         
22         byte[] buf=new byte[1024];
23         DatagramPacket dp=new DatagramPacket(buf, buf.length);
24         
25         ds.receive(dp);            //阻塞式,在接收到信息之前一直阻塞
26         String ip=dp.getAddress().getHostAddress();
27         int port=dp.getPort();
28         String context=new String(dp.getData(),0,dp.getLength());
29         System.out.println("ip是"+ip+",端口是"+port+",内容是""+context+""");
30         
31         ds.close();
32     }
33 
34 }
UDP接收端演示
 1 import java.io.IOException;
 2 import java.net.DatagramSocket;
 3 
 4 public class UDPTest {
 5     /*这是UDP协议的聊天室,使用UDPSendTest2和UDPReceiveTest2,
 6      * 其实就是添加了多线程
 7      */
 8     public static void main(String[] args) throws IOException {
 9         DatagramSocket send=new DatagramSocket();
10         DatagramSocket rece=new DatagramSocket(13419);
11         UDPSendTest2 usend=new UDPSendTest2(send);
12         UDPReceiveTest2 urece=new UDPReceiveTest2(rece);
13         Thread t1=new Thread(usend);
14         Thread t2=new Thread(urece);
15         t1.start();
16         t2.start();
17     }
18 
19 }
UDP简单聊天室
 1 import java.io.BufferedReader;
 2 import java.io.InputStreamReader;
 3 import java.net.DatagramPacket;
 4 import java.net.DatagramSocket;
 5 import java.net.InetAddress;
 6 
 7 public class UDPSendTest2 implements Runnable{
 8     private DatagramSocket ds;
 9     public UDPSendTest2(DatagramSocket ds){
10         this.ds=ds;
11     }
12     public void run(){
13         try{
14             BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
15             String line=null;
16             while((line=br.readLine())!=null){
17                 byte[] buf=line.getBytes();
18                 DatagramPacket dp=new DatagramPacket(buf, buf.length, InetAddress.getByName("172.25.14.5"), 13419);
19                 ds.send(dp);
20                 if(line.equals("886")){
21                     break;
22                 }
23             }
24             ds.close();
25         }catch(Exception e){
26         }
27     }
28 }
聊天室发送端
 1 import java.net.DatagramPacket;
 2 import java.net.DatagramSocket;
 3 
 4 public class UDPReceiveTest2 implements Runnable{
 5     private DatagramSocket ds;
 6     public UDPReceiveTest2(DatagramSocket ds){
 7         this.ds=ds;
 8     }
 9     public void run(){
10         try{
11             while(true){
12                 byte[] buf=new byte[1024];
13                 DatagramPacket dp=new DatagramPacket(buf, buf.length);
14                     
15                 ds.receive(dp);
16                 String context=new String(dp.getData(),0,dp.getLength());
17                 System.out.println("内容是:"+context);
18                 if(context.equals("886")){
19                     System.out.println("对方退出聊天");
20                 }
21             }
22         }catch(Exception e){
23         }
24     }
25 
26 }
聊天室接收端

五、TCP实现:TCP协议比UDP复杂,在Java中表现在区分服务器端和客户端不同的socket对象。

服务器端-->ServerSocket

客户端---->Socket

 1 import java.io.IOException;
 2 import java.io.OutputStream;
 3 import java.net.Socket;
 4 import java.net.UnknownHostException;
 5 
 6 public class TCPClientDemo {
 7 
 8     public static void main(String[] args) throws UnknownHostException, IOException {
 9         demo();
10     }
11 
12     public static void demo() throws UnknownHostException, IOException {
13         /*TCP传输客户端的建立过程:
14          * 1、创建客户端socket服务,使用Socket对象
15          *         建议:一旦创建该对象,就明确要连接的主机地址
16          * 2、如果连接成功,会生成一个通道。在Java中表现为socket流,
17          *   有输入流和输出流,对应的对象可以通过Socket对象获取
18          *   getOutputStream()    --》获取输出流
19          *      getInputStream()    --》获取输入流
20          * 3、使用输出流发送数据,还可以接受服务器端反馈的数据
21          * 4、关闭资源
22          */
23         Socket s=new Socket("172.25.14.9", 10002);
24         OutputStream os=s.getOutputStream();
25         os.write("TCP演示".getBytes());
26         s.close();
27     }
28 
29 }
TCP客户端演示
 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStream;
 4 import java.io.InputStreamReader;
 5 import java.net.ServerSocket;
 6 import java.net.Socket;
 7 
 8 public class TCPServerDemo {
 9 
10     public static void main(String[] args) throws IOException {
11         /*TCP和UDP的一个不同是:TCP是面向连接的,
12          * 就是说要先开启服务器端,在开启客户端,两端相连接才能通讯
13          * 而UDP只要两端开启就可以通讯
14          */
15         demo();
16     }
17 
18     public static void demo() throws IOException {
19         /*
20          * 建立TCP服务器端的过程
21          * 1、建立服务器端的socket服务,使用ServerSocket对象
22          *       !!! 注意:服务器端必须提供一个端口给客户端使用,否则无法连接
23          * 2、获取正在连接的客户端socket对象,并使用该对象对应的通道,即socket流进行数据发送
24          *      !!!注意:这是因为  服务器端需要和多个客户端进行数据交换,这样可以保证数据不会传错
25          * 3、关闭资源,包括客户端和服务器端。
26          */
27         ServerSocket ss=new ServerSocket(10002);
28         
29         //accept()是阻塞式,在服务器端开启后会一直阻塞,直到有传输数据进入才会执行下一步操作
30         Socket s=ss.accept();    
31         InputStream is=s.getInputStream();
32         
33         BufferedReader br=new BufferedReader(new InputStreamReader(is));
34         System.out.println(br.readLine());
35         
36         s.close();
37         ss.close();
38     }
39 
40 }
TCP服务器端演示
 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStreamReader;
 4 import java.io.OutputStream;
 5 import java.io.PrintStream;
 6 import java.net.Socket;
 7 import java.net.UnknownHostException;
 8 
 9 public class TCPClientTest {
10 
11     public static void main(String[] args) throws UnknownHostException, IOException {
12         //TCPTest是用TCP协议建立一个服务器端,对客户端传来的数据进行大小写转换,使用键盘录入
13         demo();
14     }
15 
16     public static void demo() throws UnknownHostException, IOException {
17         Socket s=new Socket("172.25.14.9", 7999);
18         OutputStream os=s.getOutputStream();
19         PrintStream out=new PrintStream(os);
20         
21         BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
22         BufferedReader brIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
23         String str=null;
24         while((str=br.readLine())!=null){
25             if(str.equals("over")){
26                 break;
27             }
28             out.println(str);
29             //上面一句相当于下面一句
30             //out.print(str+"
");
31             //out.flush();
32             String upperStr=brIn.readLine();
33             System.out.println(upperStr);
34         }
35 
36         s.close();
37     }
38 }
TCP大小写转换客户端
 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStream;
 4 import java.io.InputStreamReader;
 5 import java.io.OutputStream;
 6 import java.io.PrintStream;
 7 import java.net.ServerSocket;
 8 import java.net.Socket;
 9 
10 public class TCPServerTest {
11 
12     public static void main(String[] args) throws IOException {
13         demo();
14     }
15 
16     public static void demo() throws IOException {
17         ServerSocket ss=new ServerSocket(7999);
18         
19         Socket s=ss.accept();
20         InputStream is=s.getInputStream();
21         
22         BufferedReader br=new BufferedReader(new InputStreamReader(is));
23         OutputStream os=s.getOutputStream();
24         PrintStream out=new PrintStream(os,true);
25         String str=null;
26         while((str=br.readLine())!=null){
27             out.println(str.toUpperCase());
28         }
29         s.close();
30         ss.close();
31     }
32 
33 }
TCP大小写转换服务器端
 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStreamReader;
 4 import java.io.OutputStream;
 5 import java.io.FileReader;
 6 import java.io.PrintStream;
 7 import java.net.Socket;
 8 import java.net.UnknownHostException;
 9 
10 public class TCPUploadClient {
11 
12     public static void main(String[] args) throws UnknownHostException, IOException {
13         demo();
14     }
15 
16     public static void demo() throws UnknownHostException, IOException {
17         Socket s=new Socket("172.25.14.4", 7999);
18         OutputStream os=s.getOutputStream();
19         PrintStream out=new PrintStream(os);
20         
21         BufferedReader br=new BufferedReader(new FileReader("D:\2.txt"));
22         String str=null;
23         while((str=br.readLine())!=null){
24             out.println(str);
25         }
26         
27         //因为TCP两端都有阻塞式方法,为了结束通讯过程,Java的socket对象提供了TCP通讯结束标记,
28         s.shutdownOutput();
29         
30         BufferedReader brIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
31         String context=brIn.readLine();
32         System.out.println(context);
33         br.close();
34         s.close();
35     }
36 }
TCP文本文件上传客户端
 1 import java.io.BufferedReader;
 2 import java.io.BufferedWriter;
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.io.InputStreamReader;
 6 import java.io.OutputStream;
 7 import java.net.ServerSocket;
 8 import java.net.Socket;
 9 import java.io.FileWriter;
10 import java.io.PrintStream;
11 
12 public class TCPUploadServer {
13 
14     public static void main(String[] args) throws IOException {
15         demo();
16     }
17 
18     public static void demo() throws IOException {
19         ServerSocket ss=new ServerSocket(7999);
20         
21         
22         Socket s=ss.accept();
23         String ip=s.getInetAddress().getHostAddress();
24         System.out.println(ip+"....connect");
25         InputStream is=s.getInputStream();
26         
27         BufferedReader br=new BufferedReader(new InputStreamReader(is));
28         BufferedWriter bw=new BufferedWriter(new FileWriter("D:\1.txt"));
29         OutputStream os=s.getOutputStream();
30         PrintStream out=new PrintStream(os,true);
31         String str=null;
32         while((str=br.readLine())!=null){
33             if(str.equals("over")){
34                 break;
35             }
36             bw.write(str);
37             bw.newLine();
38             bw.flush();
39         }
40         out.println("get");
41         bw.close();
42         s.close();
43         ss.close();
44     }
45 
46 }
TCP文本文件上传服务器端

六、服务器和客户端

ip:

原文地址:https://www.cnblogs.com/songfeilong2325/p/4464321.html