java高级开发 第十六章——java网络基础

1.URL类

java.net包中的URL类是对统一资源定位符的抽象,一个URL对象通常包含三部分信息,协议、地址和资源。

Internet上的主机可以用两种方式表示地址:IP地址、域名.

IP地址:电子设备(计算机)在网络中的唯一标识。

端口:应用程序在计算机中的唯一标识。0-65535

传输协议:规定了数据传输的规则

基础协议: TCP:安全协议,三次握手。速度稍慢。 UDP:不安全协议。速度快。

网络程序设计通常涉及一个服务器和一个或多个客户端。

服务器:从广义上讲,是指网络中能对其它机器提供某些服务的计算机系统.

客户端:向服务器发送请求,而服务器响应请求。

URL对象调用openStream()方法可以返回一个输入流,该输入流指向URL对象所包含的资源。通过该输入流可以将服务器上的资源信息读入客户端。

2.套接字

IP地址用来标识计算机,端口号用来标识正在计算机运行的进程。

端口号是一个整数,范围0-65535,其中0-1023已被预先定义的服务器通信占用,自己写的程序应该使用后面的端口号。

套接字:IP地址和端口号的组合。

3.客户端套接字

客户端的程序使用Socket类建立负责连接到服务器的套接字对象。

Socket(String host,int port); host代表服务器的IP地址,port代表端口号。

Socket socket=new Socket("127.0.0.1",4331);

通过getInputStream()获得输入流,读取服务器传过来的数据。

通过getOutputStream()获得输出流,向服务器写数据。

4.服务端套接字

服务端使用ServerSocket类创建对象,与客户端的套接字对象建立连接。

ServerSocket(int port);port必须与客户端呼叫的端口号相同

ServerSocket server=new ServerSocket(4331);

Socket client=server.accept(); 调用accept()方法等待客户端的连接。

总结:

Socket网络编程可分为四个基本步骤:

A) 建立网络连接;

B)打开连接到Socket的输入/输出流;

C) 通过已打开的I/O流进行数据读/写操作;

D) 关闭已打开的I/O流和Socket

下面是客户端与服务器的交互代码:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
public class Serve服务器 {
    public static void main(String[] args) throws SocketException {
        // TODO Auto-generated method stub
        DataInputStream in;
        DataOutputStream out;
        
        try {
    ServerSocket s=new ServerSocket(4331);
    System.out.println("等待客户端呼叫..");
    Socket client=s.accept();
    System.out.println("兔子开门");
    in=new DataInputStream(client.getInputStream());
    out=new DataOutputStream(client.getOutputStream());

    while (true) {  //死循环
    double r=in.readDouble();//接收客户端发来的数据
    System.out.println(r);
    double ss=Math.PI*r*r;
    out.writeDouble(ss);  //服务器向客户端发送数据
//    out.close();
    }
        }
        
        catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();

    }
    }

import java.util.Random;
import java.util.Scanner;
import javax.swing.*;
import java.awt.Event;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class Client客户端 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        ClientWindow client = new ClientWindow();
    }

}

class ClientWindow extends JFrame implements ActionListener {
    JButton button1, button2;
    JTextArea ta;
    JPanel p;
    JLabel label;
    JTextField txt;
    DataInputStream in;
    DataOutputStream out;

    public ClientWindow() {
        init();
        setTitle("client");
        setLocation(200, 300);
        setSize(400, 300);
        setVisible(true);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    }

    // 初始化界面
    public void init() {
        button1 = new JButton("连接服务器");
        ta = new JTextArea();
        p = new JPanel();
        label = new JLabel("输入圆的半径:");
        txt = new JTextField(10);
        button2 = new JButton("发送");
        p.add(label);
        p.add(txt);
        p.add(button2);

        add(button1, BorderLayout.NORTH);
        add(ta, BorderLayout.CENTER);
        add(p, BorderLayout.SOUTH);
        button1.addActionListener(this);
        button2.addActionListener(this);

    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
        // TODO Auto-generated method stub
        if (arg0.getSource() == button1) {
            try {
                Socket client = new Socket("127.0.0.1", 4331);
                in = new DataInputStream(client.getInputStream());
                out = new DataOutputStream(client.getOutputStream());
            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } else if (arg0.getSource() == button2) {
            double r = Double.parseDouble(txt.getText());
            try {
                out.writeDouble(r); // 客户端向服务器发送数据
                double ss = in.readDouble();
                ta.append("圆的面积为:" + ss); // 接受来自服务器的数据
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

}
运行结果截图:

  • 21
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值