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[]);
//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();
}
}
Java网络编程技术1的更多相关文章
- Java网络编程技术2
3. UDP数据报通信 UDP通信中,需要建立一个DatagramSocket,与Socket不同,它不存在“连接”的概念,取而代之的是一个数据报包——DatagramPacket.这个数据报包必须知 ...
- JAVA网络编程【转】出处不详
网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...
- 【转】JAVA 网络编程
网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...
- java网络编程+通讯协议的理解
参考: http://blog.csdn.net/sunyc1990/article/details/50773014 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很 ...
- 第62节:探索Java中的网络编程技术
前言 感谢! 承蒙关照~ 探索Java中的网络编程技术 网络编程就是io技术和网络技术的结合,网络模型的定义,只要共用网络模型就可以两者连接.网络模型参考. 一座塔有七层,我们需要闯关. 第一层物理层 ...
- 20145205 《Java程序设计》实验报告五:Java网络编程及安全
20145205 <Java程序设计>实验报告五:Java网络编程及安全 实验要求 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.客户端中输入明文,利用DES算法加密,D ...
- 20145213《Java程序设计》实验五Java网络编程及安全
20145213<Java程序设计>实验五Java网络编程及安全 实验内容 1.掌握Socket程序的编写. 2.掌握密码技术的使用. 3.设计安全传输系统. 实验预期 1.客户端与服务器 ...
- 20145206《Java程序设计》实验五Java网络编程及安全
20145206<Java程序设计>实验五 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验步骤 我和201451 ...
- 20145337实验五Java网络编程及安全
20145337实验五Java网络编程及安全 实验内容 掌握Socket程序的编写 掌握密码技术的使用 设计安全传输系统 实验步骤 基于Java Socket实现安全传输 基于TCP实现客户端和服务器 ...
随机推荐
- Redis的一些配置
Redis的一些配置 daemonize 如果需要在后台运行,把该项设置为yes,默认为no pidfile 配置多个pid的地址,默认在/var/run/redis.pid bind 绑定ip,设置 ...
- thinkphp中如何是实现多表查询
多表查询经常使用到,但如何在thinkphp中实现多表查询呢,其实有三种方法. 1 2 3 4 5 6 7 8 9 10 11 12 // 1.原生查询示例: $Model = new Model() ...
- 【记录】HTTP协议状态码含义
状态码200-299之间的状态码表示成功300-399之间的代码表示资源已经被移走400-499之间的代码表示客户端的请求出错500-599之间的代码表示服务器出错了
- [js]事件篇
一.事件流 1.冒泡事件:从特定的事件到不特定事件依次触发:(由DOM层次的底层依次向上冒泡) (1)示例: <html onclick="add('html<br>')& ...
- Netty堆外内存泄露排查与总结
导读 Netty 是一个异步事件驱动的网络通信层框架,用于快速开发高可用高性能的服务端网络框架与客户端程序,它极大地简化了 TCP 和 UDP 套接字服务器等网络编程. Netty 底层基于 JDK ...
- Vue图片懒加载插件
图片懒加载是一个很常用的功能,特别是一些电商平台,这对性能优化至关重要.今天就用vue来实现一个图片懒加载的插件. 这篇博客采用"三步走"战略--Vue.use().Vue.dir ...
- 复习一下xml(c)
简单介绍 Using System.Xml; XMLDocument xml=new XmlDocument();xml.Load(path);//初始化一个实例 xml.Load(HttpConte ...
- Spring的优点
Spring的优点 1.低侵入式设计,代码污染极低: 2.独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺: 3.Spring的DI机 ...
- [luogu4459][BJOI2018]双人猜数游戏(DP)
https://zhaotiensn.blog.luogu.org/solution-p4459 从上面的题解中可以找到样例解释,并了解两个人的思维方式. A和B能从“不知道”到“知道”的唯一情况,就 ...
- 【10.5校内测试】【DP】【概率】
转移都很明显的一道DP题.按照不优化的思路,定义状态$dp[i][j][0/1]$表示吃到第$i$天,当前胃容量为$j$,前一天吃(1)或不吃(0)时能够得到的最大价值. 因为有一个两天不吃可以复原容 ...