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实现客户端和服务器 ...
随机推荐
- SPOJ - NSUBSTR 后缀自动机板子
SPOJ - NSUBSTR #include<bits/stdc++.h> #define LL long long #define fi first #define se second ...
- 微信公众号第三方平台生成自定义菜单提示 获取"access_token失败"
在微信公众号第三方平台要生成自定义菜单时,程序反应很慢,最终提示"获取access_token失败"(之前程序无改动,使用时间已久),查了大半天,找不出原因. 排除.在微信公众号平 ...
- 微控工具xp模块-开发版[微信(wechat)二次开发模块]
http://repo.xposed.info/module/com.easy.wtool 微控工具xp模块-开发版[微信(wechat)二次开发模块] 基于xposed框架的微信二次开发模块,方 ...
- 使用 Python 可以做什么?
翻译自 <Python学习手册(第5版)> Systems Programming Python 对操作系统服务的内置接口使其非常适合编写可移植.可维护的系统管理工具和实用程序 utili ...
- HDU - 1716 排列2 水题
排列2 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- [leetcode DP]62.Unique Paths
判断一个物体从左上角到右下角有多少种走法 class Solution(object): def uniquePaths(self, m, n): flag = [[1 for j in range( ...
- android 安全退出 activity
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 定义一个 活动 的基础类, 每次打开一个 活动,就记录下来. 退出时,关闭每一个 活动. ...
- BZOJ.3611.[HEOI2014]大工程(虚树 树形DP)
题目链接 要求的和.最大值.最小值好像都可以通过O(n)的树形DP做,总询问点数<=2n. 于是建虚树就可以了.具体DP见DP()函数,维护三个值sum[],mx[],mn[]. sum[]要开 ...
- python开发_tkinter_复选菜单
在之前的blog中有提到python的tkinter中的菜单操作 python开发_tkinter_窗口控件_自己制作的Python IDEL_博主推荐 python开发_tkinter_窗口控件_自 ...
- matlab 乱七八糟求最大值~
w=rand(,) [a b]=size(w); x=; maxw=w(,); :a :b if w(k,d)>maxw maxw=w(k,d); end end end disp(['haha ...