网络编程

Java网络编程,应用方向:电商。
     web编程在整个Java中占据很大一部分!
     编写程序运行在同一网络下的两个终端上。
    
     计算机网络就是:通过硬件设施、传输媒介把分散在不同地区的计算机进行连接,形成一个资源共享和数据传输的网络系统
     遵循:network protocol,包含三部分,
         1.语法:数据信息的结构
         2.语义:描述请求、动作和响应
         3.同步:动作的实现顺序
        
     ---TCP/IP、IPX/SPX、NetBEUI
         TCP/IP是分层,
             优点:
                 各层相互独立,互不干扰
                 维护性、扩展性好
                 有利于系统的标准化
         分为四层,由上至下:layer
             应用层:通过应用程序之间的数据交互完成网络应用
             传输层:数据传输服务
             网络层:IP层,网络中不同终端提供通信服务
             网络接口层:数据链路层(链路协议)、物理层(传递信号的各种物理介质)
            
         IP和端口
             IP:终端设备在互联网,唯一的标示。网络中的请求可以根据这个标示找到具体的计算机。
             网络地址:主机所在的网络。
             主机地址:找到网络中的主机。
            
     java.net.InetAddress    :localhost    或     127.0.0.1
    
端口:
     IP地址+端口:互联网中接收请求的服务端。
    
URL&URLConnection
     URI:统一资源定位符指向目标实体(网络资源)
     java.net.URI——实例化对象,面向对象的方式来管理网络资源。
    
     URI.getHost()getPort()getPath()
    
URL:统一资源位置,在URI的基础上进行扩充,定位资源的同时,还提供了对应的网络地址。
     java.net.URL
     获取流
     获取其他信息:主机地址,port等
         getHost()getPort()getPath()
    
     URLConnection
         描述URL指定资源的连接, 抽象类,常用:HTTPURLConnection,底层通过HTTP协议来处理,定义了
         访问远程网络资源的方法。
        
     TCP协议
         建立稳定的连接
         Socket类,通过Socket可以在服务端和客户端之间建立起可靠的连接。Socket表示客户端,服务端使用
         ServerSocket来表示,ServerSocket也是一个类,ServerSocket和Socket都存放在java.net中。
             --accept

TCP协议开发——传送的是字节数组

//注意接收、发送端口问题

//本地端

            //接收消息
             datagramSocket = new DatagramSocket(6600);
             datagramSocket.receive(datagramPacket);
             String receive = new String(datagramPacket.getData());
             System.out.println("Terminal A 接受到"+datagramPacket.getPort()+"端口传来的消息:"+receive);
             //发送消息
             String sendMeassage = "hello Termial B";
             byte[] buf1 = sendMeassage.getBytes();
             datagramPacket = new DatagramPacket(buf1,buf1.length,datagramPacket.getSocketAddress());
             datagramSocket.send(datagramPacket);
             System.out.println("Termain A 发送消息:"+sendMeassage);

//服务端

//发送消息
String sendMeassage = "hello Termial A";
byte[] buf1 = sendMeassage.getBytes();
//获取接受方的地址
InetAddress inetAddress = InetAddress.getByName("localhost");
datagramPacket = new DatagramPacket(buf1,buf1.length,inetAddress,6600);
datagramSocket = new DatagramSocket(6080);
datagramSocket.send(datagramPacket);
System.out.println("Termain B 发送消息:"+sendMeassage);
//接收消息
datagramSocket.receive(datagramPacket);
String receive = new String(datagramPacket.getData());
System.out.println("Terminal B 接受到"+datagramPacket.getPort()+"消息:"+receive);

UDP应用

//A:客户端

Socket socket = new Socket("127.0.0.1", 8080);
//发送请求
OutputStream outputStream = socket.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
String request = "客户端请求信息:hello server http ip";
dataOutputStream.writeUTF(request);
//接受请求
InputStream inputStream = socket.getInputStream();
DataInputStream dataInputStream = new DataInputStream(inputStream);
String response = dataInputStream.readUTF();
System.out.println("客户端获得响应信息:"+response);

//B:服务端

serverSocket = new ServerSocket(8080);
Socket socket = serverSocket.accept();//这块会出现丢包问题
InputStream inputStream = socket.getInputStream();
DataInputStream dataInputStream = new DataInputStream(inputStream);
String receive = dataInputStream.readUTF();
System.out.println("服务端接收到消息:"+receive);
//反馈
String response = "hello client:protocal TCP\IP";
OutputStream outputStream = socket.getOutputStream();
//outputStream.write(response.getBytes());
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
dataOutputStream.writeUTF(response);
System.out.println("服务端给客户端作出响应:"+response);

不知道:总感觉还是差点业务上的实际应用!【自学当中出现的困惑点:需要不断实践才能沉淀处真知灼见!】——碰到高人指点是一定要感恩回报的!

体会这种封装的思想——简单的聊天程序

【1】明白是两个线程进行通话

【2】采用UDP协议,客户端Socket对象,服务端ServerSocket对象

【3】简单两个线程之间通话,多个线程的问题???

//客户端代码

public class Client implements Runnable{
     private Socket socket;
     public Client(Socket socket) {
         // TODO Auto-generated constructor stub
         this.socket = socket;
     }
     @Override
     public void run() {
         // TODO Auto-generated method stub
         while (true) {
             try {
                 //线程本身一直在监听,而不是重新启动线程!!
                 //客户端发送消息
                 OutputStream outputStream = socket.getOutputStream();
                 DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
                 Scanner scanner = new Scanner(System.in);
                 System.out.print("客户端:");
                 String string=scanner.nextLine();
                 //System.out.println(string);
                 dataOutputStream.writeUTF(string);
             } catch (IOException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             }
             //客户端接收消息
             try {
                 InputStream inputStream = socket.getInputStream();
                 DataInputStream dataInputStream = new DataInputStream(inputStream);
                 String receive = dataInputStream.readUTF();
                 System.out.println("服务端:"+receive);
             } catch (IOException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             }
         }
     }
}

//服务端代码

public class Server extends Thread{
     private ServerSocket serverSocket;
     public Server(ServerSocket serverSocket) {
         this.serverSocket = serverSocket;
     }
     @Override
     public void run() {
         // TODO Auto-generated method stub
         //super.run();
         try {
             Socket socket = serverSocket.accept();
             while (true) {
                 String receive = new DataInputStream(socket.getInputStream()).readUTF();
                 System.out.println("客户端:"+receive);
                 Scanner scanner = new Scanner(System.in);
                 System.out.print("服务端:");
                 String response = scanner.nextLine();
                 //System.out.println(response);
                 new DataOutputStream(socket.getOutputStream()).writeUTF(response);
             }
         } catch (IOException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
     }
}

//客户端线程调用

Socket socket = null;
Thread q1 = null;
try {
     socket = new Socket("localhost", 8080);
     Client client = new Client(socket);
     q1 = new Thread(client);q1.start();
} catch (UnknownHostException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
} catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
}

//服务端线程调用

Server server = null;
try {
     server = new Server(new ServerSocket(8080));server.start();
} catch (IOException e) {
     e.printStackTrace();
}

注意一点:java.net.ConnectException: Connection refused: connect  原因:

Socket socket = serverSocket.accept();//服务端需要先建立连接

原文地址:https://www.cnblogs.com/macro-renzhansheng/p/12636519.html