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实现客户端和服务器 ...
随机推荐
- 在VMware虚拟机中安装Mac OS 操作系统
1. 安装VMware 我这里是安装VMWARE12.exe,其他的版本我不知道是否可以正常运行,最好大家安装12版本的比较好. 2. 安装 Mac OS X Unlocker for VMware ...
- 第一个web程序(ServletRequest , ServletResponse)
一.ServletRequest 1.获取参数的方法(四种) > String getParameter(String name): 根据请求参数的名字, 返回参数值. 若请求参数有多个值(例如 ...
- Git配置用户名密码
配置Git 在Linux下和windows下配置Git的方法差不多,只是在Linux下,可以在命令行里直接使用git config进行配置, 而在windows下则要先打开“Git Bash”,进入m ...
- c/c++--strlen()小问题
int x = 2; char * str = "abcd"; int y = (x - strlen(str)) / 3; printf("%d\n", y) ...
- python 发送邮件(收到的邮件要有发送方才能回复)
Python使用SMTP(简单邮件传输协议)发送邮件 普通文本邮件 普通文本邮件发送的实现,关键是要将MIMEText中_subtype设置为plain ## -*- coding: UTF-8 -* ...
- Winform 串口通讯之地磅
继上次的读卡之后,要做一个地磅的读取. 下面是我在读卡Demo上改的读取地磅的. 地磅是一直向串口发送数据的,所以需要截取数据来一直判断数据是否合法,然后计算出结果. 其中遇到了一个小问题,文末有介绍 ...
- Sublime Text2 默认语言(windows/unix)设置,Sublime插件大全
Sublime默认系统语言设置 Sublime Text 2默认使用的就是UTF8,这个UTF8模式使用的是不带BOM的,如果要修改这个配置,到Perference->Settings-User ...
- hdu 5305 Friends(2015多校第二场第6题)记忆化搜索
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5305 题意:给你n个人,m条关系,关系可以是online也可以是offline,让你求在保证所有人on ...
- hdu 5248 贪心
题意:
- 仅100行的JavaScript DOM操作类库
如果你构建过Web引用程序,你可能处理过很多DOM操作.访问和操作DOM元素几乎是每一个Web应用程序的通用需求.我们我们经常从不同的控件收集信息,我们需要设置value值,修改div或span标签的 ...