Java网络编程技术1

1. Java网络编程常用API

1.1 InetAddress类使用示例

1.1.1根据域名查找IP地址

获取用户通过命令行方式指定的域名,然后通过InetAddress对象来获取该域名对应的IP地址。当然,程序运行时,需要计算机正常连接到Internet上。

例1. 根据域名查找IP地址

package Net;

import java.net.InetAddress;
import java.net.UnknownHostException;

public class GetIP {

    public static void main(String[] args) {
        try {
            InetAddress ad = InetAddress.getByName(args[0]);
            //ad.getHostAddress()方法获取当前对象的IP地址
            System.out.println("IP地址为:"+ad.getHostAddress());
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }

    }

}

想获取网易的IP地址,就应该输入:java GetIP www.163.com

例2. 获取本机的IP地址。

package Net;
import java.net.*;
public class GetMyIP {

    public static void main(String[] args) {
        try {
            System.out.println(InetAddress.getLocalHost());
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }
}

1.1.2 根据IP地址查找主机名

InetAddress亦可以根据给定的IP地址来查找对应的主机名。但要注意的是,它只能获取局域网内的主机名。

例3. 根据IP地址查找主机名。

package Net;
import java.net.*;
public class GetHostName {

    public static void main(String[] args) {
        try {
            InetAddress ad = InetAddress.getByName(args[0]);
            System.out.println("主机名为:"+ad.getHostName());
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }

    }

}

如果输入:java GetHostName www.sina.com

输出结果为:  主机名为:www.sina.com

如果输入的为局域网内的IP地址: java GetHostName 192.168.1.154

输出结果为: 主机名为:Tangliang

如果没有找到原样输出。

1.2 URL类和URLConnection类的使用

1.2.1 URL类的使用——一个简单的浏览器

这个程序的交互界面只有两个主要控件:JTextField和JEditPane。用户在JTextField中输入URL,完成后按回车键,程序将利用JEditPane来显示网页内容。

例4. 一个简单的浏览器示例。

package Net;
import javax.swing.*;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.*;
public class myBrowser implements ActionListener,HyperlinkListener {
    JFrame jf;
    JLabel jl;
    JTextField jtf;
    JPanel jp;
    JEditorPane content;
    JScrollPane jsp;
    Container con;
    public myBrowser(){
        jf = new JFrame("我的浏览器");
        jl = new JLabel("请输入URL地址:");
        jtf = new JTextField();
        jtf.addActionListener(this);
        jtf.setColumns(20);
        jp = new JPanel();
        jp.setLayout(new FlowLayout());
        jp.add(jl);
        jp.add(jtf);
        content = new JEditorPane();
        content.setEditable(false);
        content.addHyperlinkListener(this);
        jsp = new JScrollPane(content);
        con = jf.getContentPane();
        con.add(jp, BorderLayout.NORTH);
        con.add(jsp, BorderLayout.CENTER);
        jf.setSize(800, 600);
        jf.setLocation(300, 200);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void hyperlinkUpdate(HyperlinkEvent e) {
        if(e.getEventType()==HyperlinkEvent.EventType.ACTIVATED){
                try {
                    URL url = e.getURL();   //获取用户单击的URL
                    content.setPage(url);  //跳转到新页面
                    jtf.setText(url.toString()); //更新用户输入框中的URL
                } catch (IOException e1) {
                    JOptionPane.showMessageDialog(jf, "找不到网页!");
                }
        }

    }

    public void actionPerformed(ActionEvent e) {
        try {
            //根据用户输入构造URL对象
            URL url = new URL(jtf.getText());
            //获取网页内容并显示
            content.setPage(url);
        } catch (MalformedURLException e1) {
            System.out.println(e1.toString());
        } catch (IOException e1) {
            JOptionPane.showMessageDialog(jf, "找不到网页!");
        }
    }

    public static void main(String[] args){
        new myBrowser();
    }

}

上面的程序中,由于JEditorPane功能比较弱,无法执行网页中的JavaScript/VBScript等脚本语言,更无法执行ActiveX控件,所以只能用于一些静态网页的显示。

1.2.2 URLConnection类的使用——文件下载

文件下载的实质是从远程机器上复制文件到本地机器上,也就是说,它的本质不过是文件的复制。

例5. 文件下载示例。

package Net;
import javax.swing.*;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;
public class DownFile implements ActionListener {
    JFrame jf;
    Container con;
    JLabel jl;
    JTextField jtf;
    JButton btn;
    String name;
    public DownFile(){
        jf = new JFrame("我的浏览器");
        con = jf.getContentPane();
        jl = new JLabel("请输入要下载文件的地址及名称:");
        jtf = new JTextField();
        jtf.setColumns(20);
        btn = new JButton("下载");
        btn.addActionListener(this);
        con.setLayout(new FlowLayout());
        con.add(jl);
        con.add(jtf);
        con.add(btn);
        jf.setSize(800, 600);
        jf.setLocation(300, 200);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void actionPerformed(ActionEvent e) {
        try {
            name = JOptionPane.showInputDialog(jf, "请输入要保存的文件名");
            URL url = new URL(jtf.getText());
            //创建远程连接
            URLConnection connect = url.openConnection();
            //创建输入流
            BufferedReader buf = new BufferedReader(new InputStreamReader(connect.getInputStream()));
            //创建输出流,保存文件名为temp.dat
            BufferedWriter file = new BufferedWriter(new FileWriter(name));
            int ch;
            //复制文件
            while((ch=buf.read())!=-1){
                file.write(ch);
            }
            buf.close();
            file.close();
            JOptionPane.showMessageDialog(jf, "下载成功!");
        } catch (MalformedURLException e1) {
            System.out.println(e1.toString());
        } catch (IOException e1) {
            JOptionPane.showMessageDialog(jf, "连接出错!");
        }
    }

    public static void main(String[] args) {
        new DownFile();
    }
}

2. Java Socket应用

2.1 示例程序1——端到端的通信

例6. 一个简单的客户/服务器的Socket通信程序。

package Net;
import java.io.*;
import java.net.*;
public class Client {
    public static void main(String[] args) {
        try {
            //连接到本机,端口号为5500
            Socket s = new Socket("localhost",5500);
            DataOutputStream dos = new DataOutputStream(s.getOutputStream());
            DataInputStream dis = new DataInputStream(s.getInputStream());
            System.out.println("请输入半径数值发送到服务器,输入bye表示结束。");
            String outstr,instr;
            boolean goon = true;
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            while(goon){
                outstr = br.readLine();
                dos.writeUTF(outstr);
                dos.flush();
                instr = dis.readUTF();
                if(!instr.equals("bye"))
                    System.out.println("从服务器返回的结果为:"+instr);
                else
                    goon = false;
            }
            dis.close();
            dos.close();
            s.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}
package Net;
import java.io.*;
import java.net.*;
public class Server {
    public static void main(String[] args) {
        try {
            System.out.println("等待连接!");
            ServerSocket ss = new ServerSocket(5500);
            Socket s = ss.accept();
            System.out.println("连接者来自:"+s.getInetAddress().getHostAddress());
            DataInputStream dis = new DataInputStream(s.getInputStream());
            DataOutputStream dos = new DataOutputStream(s.getOutputStream());
            boolean goon = true;
            double radius,area;
            String str;
            while(goon){
                str = dis.readUTF();
                if(!str.equals("bye")){
                    radius = Double.parseDouble(str);
                    System.out.println("接收到的半径为:"+radius);
                    area = radius*radius*Math.PI;
                    dos.writeUTF(Double.toString(area));
                    dos.flush();
                    System.out.println("圆面积"+area+"已发送");
                }else{
                    dos.writeUTF("bye");
                    dos.flush();
                    goon = false;
                }
            }
            dis.close();
            dos.close();
            ss.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

程序运行结果如下:

客户端:

请输入半径数值发送到服务器,输入bye表示结束。
2
从服务器返回的结果为:12.566370614359172
3
从服务器返回的结果为:28.274333882308138
bye

服务器端:

等待连接!
连接者来自:127.0.0.1
接收到的半径为:2.0
圆面积12.566370614359172已发送
接收到的半径为:3.0
圆面积28.274333882308138已发送

2.2 示例程序2——一对多的通信

例7. 可以响应多个客户端的服务程序。

首先写一个服务器处理的线程类:

package Net;
import java.io.*;
import java.net.*;
public class ServerThread extends Thread {
    private DataInputStream dis = null;
    private DataOutputStream dos = null;
    private Socket s = null;
    String str;
    public ServerThread(Socket s) throws IOException{
        this.s = s;
        System.out.println("连接者来自:"+s.getInetAddress().getHostAddress());
        dis = new DataInputStream(s.getInputStream());
        dos = new DataOutputStream(s.getOutputStream());
        start();
    }

    public void run(){
        try {
            boolean goon = true;
            double radius,area;
            String str;
            while(goon){
                str = dis.readUTF();
                if(!str.equals("bye")){
                    radius = Double.parseDouble(str);
                    System.out.println("接收到的半径为:"+radius);
                    area = radius*radius*Math.PI;
                    dos.writeUTF(Double.toString(area));
                    dos.flush();
                    System.out.println("圆面积"+area+"已发送");
                }else{
                    dos.writeUTF("bye");
                    dos.flush();
                    goon = false;
                }
            }
            dis.close();
            dos.close();
            s.close();
        } catch (NumberFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

写一个主程序使用线程:

package Net;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class MultiServer {
    public static void main(String[] args) {
        try {
            System.out.println("等待连接!");
            ServerSocket ss = new ServerSocket(5500);
            Socket s = null;
            while(true){
                s = ss.accept();
                new ServerThread(s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2.3 示例程序3——简单的聊天程序

例8. 聊天程序示例。

服务器端:

package Net.chat;
import javax.swing.*;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
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.*;
public class chatServer implements ActionListener,Runnable{
    JFrame jf;
    Container con;
    JPanel jp;
    JTextArea showArea;
    JTextField msgText;
    JButton btn;
    Thread thread;
    ServerSocket ss = null;
    Socket s = null;
    DataInputStream dis = null;
    DataOutputStream dos = null;

    public chatServer(){
        jf = new JFrame("聊天————服务器");
        con = jf.getContentPane();
        jp = new JPanel();
        jp.setLayout(new FlowLayout());
        showArea = new JTextArea();
        showArea.setEditable(false);
        msgText = new JTextField();
        msgText.setColumns(20);
        btn = new JButton("发送");
        btn.addActionListener(this);
        jp.add(msgText);
        jp.add(btn);
        con.add(showArea, BorderLayout.CENTER);
        con.add(jp, BorderLayout.SOUTH);
        jf.setSize(500, 400);
        jf.setLocation(300, 200);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        try {
            ss = new ServerSocket(8000);
            showArea.append("正在等待对话请求!\n");
            s = ss.accept();
            dis = new DataInputStream(s.getInputStream());
            dos = new DataOutputStream(s.getOutputStream());
            thread = new Thread(this);
            thread.setPriority(Thread.MIN_PRIORITY);
            thread.start();
        } catch (IOException e) {
            showArea.append("对不起,没能创建服务器!\n");
            msgText.setEditable(false);
            btn.setEnabled(false);
        }
    }

    public void run() {
        try {
            while(true){
                showArea.append("对方说:"+dis.readUTF()+"\n");
                Thread.sleep(1000);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void actionPerformed(ActionEvent e) {
        String msg = msgText.getText();
        try {
            if(msg.length()>0){
                dos.writeUTF(msg);
                dos.flush();
                showArea.append("我说:"+msg+"\n");
                msgText.setText(null);
            }
        } catch (IOException e1) {
            showArea.append("你的消息"+msg+"未能发送出去!\n");
        }

    }

    public static void main(String[] args) {
        new chatServer();
    }
}

客户端:

package Net.chat;
import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
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.*;
public class chatClient implements ActionListener,Runnable{
    JFrame jf;
    Container con;
    JPanel jp;
    JTextArea showArea;
    JTextField msgText;
    JButton btn;
    Thread thread;
    Socket s = null;
    DataInputStream dis = null;
    DataOutputStream dos = null;

    public chatClient(){
        jf = new JFrame("聊天————客户端");
        con = jf.getContentPane();
        jp = new JPanel();
        jp.setLayout(new FlowLayout());
        showArea = new JTextArea();
        showArea.setEditable(false);
        msgText = new JTextField();
        msgText.setColumns(20);
        btn = new JButton("发送");
        btn.addActionListener(this);
        jp.add(msgText);
        jp.add(btn);
        con.add(showArea, BorderLayout.CENTER);
        con.add(jp, BorderLayout.SOUTH);
        jf.setSize(500, 400);
        jf.setLocation(300, 200);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        try {
            s = new Socket("localhost",8000);
            showArea.append("连接成功,请说话!\n");
            dis = new DataInputStream(s.getInputStream());
            dos = new DataOutputStream(s.getOutputStream());
            thread = new Thread(this);
            thread.setPriority(Thread.MIN_PRIORITY);
            thread.start();
        } catch (IOException e) {
            showArea.append("对不起,没能连接到服务器!\n");
            msgText.setEditable(false);
            btn.setEnabled(false);
        }
    }

    public void run() {
        try {
            while(true){
                showArea.append("对方说:"+dis.readUTF()+"\n");
                Thread.sleep(1000);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void actionPerformed(ActionEvent e) {
        String msg = msgText.getText();
        try {
            if(msg.length()>0){
                dos.writeUTF(msg);
                dos.flush();
                showArea.append("我说:"+msg+"\n");
                msgText.setText(null);
            }
        } catch (IOException e1) {
            showArea.append("你的消息"+msg+"未能发送出去!\n");
        }

    }

    public static void main(String[] args) {
        new chatClient();
    }
}
时间: 2024-10-16 06:47:49

Java网络编程技术1的相关文章

Java网络编程技术

服务器端网络编程步骤 服务器端的编程步骤和客户端不同,是由四个步骤实现,依次是: 监听端口:服务器端属于被动等待连接,所以服务器端启动以后,不需要发起连接,而只需要监听本地计算机的某个固定端口即可.这个端口就是服务器端开放给客户端的端口,服务器端程序运行的本地计算机的IP地址就是服务器端程序的IP地址. 获得连接:当客户端连接到服务器端时,服务器端就可以获得一个连接,这个连接包含客户端的信息,例如客户端IP地址等等,服务器端和客户端也通过该连接进行数据交换.一般在服务器端编程中,当获得连接时,需

Java网络编程技术2

3. UDP数据报通信 UDP通信中,需要建立一个DatagramSocket,与Socket不同,它不存在“连接”的概念,取而代之的是一个数据报包——DatagramPacket.这个数据报包必须知道自己来自何处,以及打算去哪里.所以本身必须包含IP地址.端口号和数据内容. 3.1 示例程序——用UDP实现的聊天程序 用UDP协议通信不需要使用服务器,所以用于聊天的程序只要写一个,分别在不同的机器上运行就可以了,而无须写成服务端和客户端两种形式. 例9. 用UDP实现的聊天程序示例. pack

Java网络编程基础【转】

网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编程是比较复杂的系统工程,需要了解很多和网络相关的基础知识,其实这些都不是很必需的.首先来问一个问题:你 会打手机吗?很多人可能说肯定会啊,不就是按按电话号码,拨打电话嘛,很简单的事情啊!其实初学者如果入门网络编程的话也可以做到这么简单! 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.

【转】JAVA网络编程基础

转来自己学习用 转自http://www.cnblogs.com/springcsc/archive/2009/12/03/1616413.html 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编程是比较复杂的系统工程,需要了解很多和网络相关的基础知识,其实这些都不是很必需的.首先来问一个问题:你 会打手机吗?很多人可能说肯定会啊,不就是按按电

java网络编程入门教程

网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编程是比较复杂的系统工程,需要了解很多和网络相关的基础知识,其实这些都不是很必需的.首先来问一个问题:你 会打手机吗?很多人可能说肯定会啊,不就是按按电话号码,拨打电话嘛,很简单的事情啊!其实初学者如果入门网络编程的话也可以做到这么简单! 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.

好消息:《Java网络编程核心技术详解》出版

2019年5月从美国回到上海,由于一切都不安定,先在旅馆里宅了4个多月,写完<精通JPA与Hibernate:Java对象持久化技术详解>,就开始写这本书.现在,正是新冠病毒疫情还没结束之际,本书克服种种困难,如期和读者见面了. 我们一不小心,就会被一种潜在的观念暗示:只要忙过了这一阵,将来就能过上高枕无忧的生活.实际上,生活中总是有各种意外的事情发生,小到个人家庭的琐事,大到国家社会的暂时的不安定.为了能随遇而安,就得常常給自己洗脑,不要以为忙过了这一阵,就会有永远太平安宁的出头之日. 戒骄

Java网络编程丶数据库编程丶XML解析技术。

Java网络编程 物理层. 数据链路层. 网络层. 传输层. 会话层. 表示层. 应用层. TCP/IP分层接口包括用于协作层分别完成以下的功能: 网络接口层. 网络互联层. 传输层. 应用层. 套接字: Socket.套接字.是一种抽象层. // 创建客户端Socket向服务器发起连接请求 Socket socket = new Socket("127.0.0.1", 30001); /* 利用已建立的socket创建输入输出流,处理与服务器端的连接 */ // 向服务器写入数据 B

第62节:探索Java中的网络编程技术

前言 感谢! 承蒙关照~ 探索Java中的网络编程技术 网络编程就是io技术和网络技术的结合,网络模型的定义,只要共用网络模型就可以两者连接.网络模型参考. 一座塔有七层,我们需要闯关. 第一层物理层->第二层数据链路层->第三层网络层->第四层传输层->第五层会话层->第六层表示层->第七层应用层. 物理层是主要定义物理设备标准,数据链路层是主要讲从物理层接收的数据进行MAC地址(网卡的地址)的封装与解封装.这层的数据较帧. 网络层是将从下层接收到的数据进行IP地址的

20145311实验四 &quot;Java网络编程及安全&quot;

20145311实验四 "Java网络编程及安全" 程序设计过程 实验内容 ·掌握Socket程序的编写:·掌握密码技术的使用:·设计安全传输系统 ·利用加解密代码包,编译运行代码,一人加密,一人解密:·集成代码,一人加密后通过TCP发送: 实验步骤 在这之前进行了一个socket连接的例子:用百度做了个实验 下面是两人合作进行RSA的加密: 首先建立一个Socket对象,用来连接特定服务器的指定端口(我负责的是服务器端,郑凯杰负责的是客户端,所以也就是输入我这边的ip地址),输入的参