1.网络编程
2.基于TCP的套接字编程
3.基于UDP的套接字编程
4.URL和URI
详细内容:
1.计算机网络 这部分内容可以参见 谢希仁《计算机网络》,在此略去。
2.基于TCP的socket编程
基于TCP的socket程序客户端和服务器端通信模型如下图所示:
①调用ServerSocket(int port)创建一个服务器端套接字,并绑定到指定端口上;
②调用accept(),监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字。
③调用Socket类的getOutputStream()和getInputStream获取输出流和输入流,开始网络数据的发送和接收。
④最后关闭通信套接字。
客户端程序编写:
①调用Socket()创建一个流套接字,并连接到服务器端;
②调用Socket类的getOutputStream()和getInputStream获取输出流和输入流,开始网络数据的发送和接收。
③最后关闭通信套接字。
简单的TCP测试程序代码如下:
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.InetAddress;
- import java.net.ServerSocket;
- import java.net.Socket;
- public class TCP
- {
- //服务器端
- public static void server()
- {
- try
- {
- ServerSocket ss=new ServerSocket(6000);
- Socket sa=ss.accept();
- InputStream is=sa.getInputStream();
- OutputStream os=sa.getOutputStream();
- os.write("Hello Welcome you!".getBytes());
- byte[] buf=new byte[100];
- int len=is.read(buf);
- System.out.write(buf,0,len);
- ss.close();
- sa.close();
- is.close();
- os.close();
- }
- catch(Exception e)
- {
- e.printStackTrace();
- }
- }
- //客户端
- public static void client()
- {
- try
- {
- Socket client=new Socket(InetAddress.getByName(null),6000);//端口号必须和服务器端相同
- InputStream is=client.getInputStream();
- byte[] buf=new byte[100];
- int len=is.read(buf);
- System.out.write(buf,0,len);
- OutputStream os=client.getOutputStream();
- os.write("Hi,this is ZhangSan".getBytes());
- }
- catch (Exception e)
- {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- public static void main(String[] args)
- {
- if(args.length>0)
- {
- server();
- }
- else
- {
- client();
- }
- }
- }
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class TCP
{
//服务器端
public static void server()
{
try
{
ServerSocket ss=new ServerSocket(6000);
Socket sa=ss.accept();
InputStream is=sa.getInputStream();
OutputStream os=sa.getOutputStream();
os.write("Hello Welcome you!".getBytes());
byte[] buf=new byte[100];
int len=is.read(buf);
System.out.write(buf,0,len);
ss.close();
sa.close();
is.close();
os.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
//客户端
public static void client()
{
try
{
Socket client=new Socket(InetAddress.getByName(null),6000);//端口号必须和服务器端相同
InputStream is=client.getInputStream();
byte[] buf=new byte[100];
int len=is.read(buf);
System.out.write(buf,0,len);
OutputStream os=client.getOutputStream();
os.write("Hi,this is ZhangSan".getBytes());
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args)
{
if(args.length>0)
{
server();
}
else
{
client();
}
}
}
运行效果如下图所示:
利用多线程编写的TCP测试程序代码如下:
- import java.io.BufferedOutputStream;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.InetAddress;
- import java.net.ServerSocket;
- import java.net.Socket;
- public class ThreadTCP extends Thread
- {
- private Socket s;
- ThreadTCP(Socket s)
- {
- this.s=s;
- }
- public void run()
- {
- try
- {
- InputStream is=s.getInputStream();
- OutputStream os=s.getOutputStream();
- BufferedOutputStream bos=new BufferedOutputStream(os);
- //os.write("Hello Welcome you!".getBytes());
- bos.write("Hello Welcome you!".getBytes());//注意刷新缓冲区
- bos.flush();
- byte[] buf=new byte[100];
- int len=is.read(buf);
- System.out.println(new String(buf,0,len));
- s.close();
- is.close();
- os.close();
- }
- catch (Exception e)
- {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- public static void server()
- {
- try
- {
- ServerSocket ss=new ServerSocket(6000);
- while(true)
- {
- Socket sa=ss.accept();
- new ThreadTCP(sa).start();
- }
- //ss.close();
- }
- catch(Exception e)
- {
- e.printStackTrace();
- }
- }
- public static void client()
- {
- try
- {
- Socket client=new Socket(InetAddress.getByName(null),6000);//端口号必须和服务器端相同
- InputStream is=client.getInputStream();
- byte[] buf=new byte[100];
- int len=is.read(buf);
- System.out.write(buf,0,len);
- OutputStream os=client.getOutputStream();
- os.write("Hi,this is wangwu".getBytes());
- }
- catch (Exception e)
- {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- public static void main(String[] args)
- {
- if(args.length>0)
- {
- server();
- }
- else
- {
- client();
- }
- }
- }
import java.io.BufferedOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class ThreadTCP extends Thread
{
private Socket s;
ThreadTCP(Socket s)
{
this.s=s;
}
public void run()
{
try
{
InputStream is=s.getInputStream();
OutputStream os=s.getOutputStream();
BufferedOutputStream bos=new BufferedOutputStream(os);
//os.write("Hello Welcome you!".getBytes());
bos.write("Hello Welcome you!".getBytes());//注意刷新缓冲区
bos.flush();
byte[] buf=new byte[100];
int len=is.read(buf);
System.out.println(new String(buf,0,len));
s.close();
is.close();
os.close();
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void server()
{
try
{
ServerSocket ss=new ServerSocket(6000);
while(true)
{
Socket sa=ss.accept();
new ThreadTCP(sa).start();
}
//ss.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
public static void client()
{
try
{
Socket client=new Socket(InetAddress.getByName(null),6000);//端口号必须和服务器端相同
InputStream is=client.getInputStream();
byte[] buf=new byte[100];
int len=is.read(buf);
System.out.write(buf,0,len);
OutputStream os=client.getOutputStream();
os.write("Hi,this is wangwu".getBytes());
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args)
{
if(args.length>0)
{
server();
}
else
{
client();
}
}
}
运行效果如下图所示:
3.基于UDP的socket编程
基于UDP的socket程序客户端和服务器端通信模型如下图所示:
①调用DatagramSocket(int port)创建一个数据报套接字,并绑定到指定端口上;
②调用DatagramPacket(byte[] buf, int length),建立一个字节数组以接收UDP包 。
③调用DatagramSocket类的receive(),接收UDP包。
④最后关闭数据报套接字。
发送端程序编写:①调用DatagramSocket()创建一个数据报套接字;
②调用DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port),建立要发送的UDP包。
③调用DatagramSocket类的send(),发送UDP包。
④最后关闭数据报套接字。
简单的UDP测试程序代码如下:
- import java.net.DatagramPacket;
- import java.net.DatagramSocket;
- import java.net.InetAddress;
- public class UDP
- {
- //发送端
- public static void send()
- {
- try
- {
- DatagramSocket ds=new DatagramSocket();
- byte[] buf="hello ,this is ZhangSan".getBytes();
- DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("localhost"),8000);
- ds.send(dp);
- //接受数据
- byte[] bufrecv=new byte[100];
- DatagramPacket dpr=new DatagramPacket(bufrecv,100);
- ds.receive(dpr);
- int len=dpr.getLength();
- System.out.write(bufrecv,0,len);
- ds.close();
- }
- catch(Exception e)
- {
- e.printStackTrace();
- }
- }
- //接收端
- public static void recv()
- {
- try
- {
- //接收数据
- DatagramSocket ds=new DatagramSocket(8000);//创建和指定端口相关的DatagramSocket
- byte[] buf=new byte[100];
- DatagramPacket dp=new DatagramPacket(buf,100);
- ds.receive(dp);
- int len=dp.getLength();
- System.out.println(new String(buf,0,len));
- //发送数据
- String str="Welcome you!";
- DatagramPacket dps=new DatagramPacket(str.getBytes(),str.length(),dp.getAddress(),dp.getPort());
- ds.send(dps);
- ds.close();
- }
- catch (Exception e)
- {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- public static void main(String[] args)
- {
- if(args.length>0)
- {
- recv();
- }
- else
- {
- send();
- }
- }
- }
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDP
{
//发送端
public static void send()
{
try
{
DatagramSocket ds=new DatagramSocket();
byte[] buf="hello ,this is ZhangSan".getBytes();
DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("localhost"),8000);
ds.send(dp);
//接受数据
byte[] bufrecv=new byte[100];
DatagramPacket dpr=new DatagramPacket(bufrecv,100);
ds.receive(dpr);
int len=dpr.getLength();
System.out.write(bufrecv,0,len);
ds.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
//接收端
public static void recv()
{
try
{
//接收数据
DatagramSocket ds=new DatagramSocket(8000);//创建和指定端口相关的DatagramSocket
byte[] buf=new byte[100];
DatagramPacket dp=new DatagramPacket(buf,100);
ds.receive(dp);
int len=dp.getLength();
System.out.println(new String(buf,0,len));
//发送数据
String str="Welcome you!";
DatagramPacket dps=new DatagramPacket(str.getBytes(),str.length(),dp.getAddress(),dp.getPort());
ds.send(dps);
ds.close();
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args)
{
if(args.length>0)
{
recv();
}
else
{
send();
}
}
}
运行效果如下图所示:
URL(Uniform Resource Locator ),通用资源定位符。http://www.mybole.com.cn/index.asp就是一个URL。
URI(Uniform Resource Identifier),通用资源标识符。
URI纯粹是个符号结构,用于指定构成Web资源的字符串的各个不同部分。URL是一种特殊类型的URI,它包含了用于查找某个资源的足够信息。其它的URI,例如:mailto:myoble@mybole.com.cn则不属于定位符,因为它里面不存在根据该标识符来查找的任何数据。这种URI称为URN(通用资源名)。
在Java库中,URI类不包含用于访问通用资源标识符设定的任何方法,它的唯一作用是进行分析。
相反,URL类则可以打开到达资源的一个字符串。
DownLoad测试程序代码如下所示:
- import javax.swing.*;
- import java.awt.event.WindowAdapter;
- import java.awt.event.WindowEvent;
- import java.awt.event.ActionListener;
- import java.awt.event.ActionEvent;
- import java.awt.Button;
- import java.awt.HeadlessException;
- import java.awt.TextField;
- import java.io.BufferedReader;
- import java.io.FileOutputStream;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.net.InetAddress;
- import java.net.URL;
- import java.net.URLConnection;
- import java.net.UnknownHostException;
- import javax.swing.JProgressBar;
- public class DownLoad
- {
- @SuppressWarnings("deprecation")
- public static void main(String[] args) throws HeadlessException, UnknownHostException
- {
- JFrame jf=new JFrame("DownLoad");
- jf.setSize(600, 400);
- jf.setLocation(100, 100);
- //创建相关控件
- JPanel p=new JPanel();
- JLabel jl=new JLabel("Please input URL:",JLabel.LEFT);
- final TextField tf=new TextField("",30);
- Button btn=new Button("下载");
- p.add(jl,0);
- p.add(tf,1);
- p.add(btn,2);
- jf.getContentPane().add(p,"North");
- final JTextArea ta=new JTextArea();
- jf.getContentPane().add(ta,"Center");
- //响应关闭按钮
- jf.addWindowListener(new WindowAdapter()
- {
- public void windowClosing(WindowEvent arg0)
- {
- // TODO Auto-generated method stub
- System.exit(0);
- }
- });
- //响应下载按钮
- btn.addActionListener(new ActionListener()
- {
- public void actionPerformed(ActionEvent e)
- {
- try
- {
- String str=tf.getText();
- System.out.println(str);
- URL url=new URL(str);
- URLConnection urlc=url.openConnection();
- //显示URL指定页面信息
- String line=System.getProperty("line.separator");
- ta.append("Host:"+url.getHost());
- ta.append(line);
- ta.append("Port:"+url.getDefaultPort());
- ta.append(line);
- ta.append("ContendType:"+urlc.getContentType());
- ta.append(line);
- ta.append("Contendlength:"+urlc.getContentLength());
- int len=urlc.getContentLength();
- //获取输入输出流
- InputStream is=urlc.getInputStream();
- InputStreamReader isr=new InputStreamReader(is);
- BufferedReader br=new BufferedReader(isr);
- FileOutputStream fos=new FileOutputStream("1.html");
- /*
- //按行读取和存贮
- String strline;
- while((strline=br.readLine())!=null)
- {
- fos.write(strline.getBytes());
- fos.write(line.getBytes());
- }
- */
- //按字节流读取和存贮
- int data;
- while((data=br.read())!=-1)
- {
- fos.write(data);
- }
- br.close();
- fos.close();
- }
- catch(Exception ex)
- {
- ex.printStackTrace();
- }
- }
- });
- jf.show();
- }
- }
import javax.swing.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Button;
import java.awt.HeadlessException;
import java.awt.TextField;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.URL;
import java.net.URLConnection;
import java.net.UnknownHostException;
import javax.swing.JProgressBar;
public class DownLoad
{
@SuppressWarnings("deprecation")
public static void main(String[] args) throws HeadlessException, UnknownHostException
{
JFrame jf=new JFrame("DownLoad");
jf.setSize(600, 400);
jf.setLocation(100, 100);
//创建相关控件
JPanel p=new JPanel();
JLabel jl=new JLabel("Please input URL:",JLabel.LEFT);
final TextField tf=new TextField("",30);
Button btn=new Button("下载");
p.add(jl,0);
p.add(tf,1);
p.add(btn,2);
jf.getContentPane().add(p,"North");
final JTextArea ta=new JTextArea();
jf.getContentPane().add(ta,"Center");
//响应关闭按钮
jf.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent arg0)
{
// TODO Auto-generated method stub
System.exit(0);
}
});
//响应下载按钮
btn.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
try
{
String str=tf.getText();
System.out.println(str);
URL url=new URL(str);
URLConnection urlc=url.openConnection();
//显示URL指定页面信息
String line=System.getProperty("line.separator");
ta.append("Host:"+url.getHost());
ta.append(line);
ta.append("Port:"+url.getDefaultPort());
ta.append(line);
ta.append("ContendType:"+urlc.getContentType());
ta.append(line);
ta.append("Contendlength:"+urlc.getContentLength());
int len=urlc.getContentLength();
//获取输入输出流
InputStream is=urlc.getInputStream();
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
FileOutputStream fos=new FileOutputStream("1.html");
/*
//按行读取和存贮
String strline;
while((strline=br.readLine())!=null)
{
fos.write(strline.getBytes());
fos.write(line.getBytes());
}
*/
//按字节流读取和存贮
int data;
while((data=br.read())!=-1)
{
fos.write(data);
}
br.close();
fos.close();
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
});
jf.show();
}
}
运行效果如下图所示:
这个下载程序还很不完善,有待改进。