java程序设计--孙鑫java无难事Lesson12《网络编程》

java程序设计--孙鑫java无难事Lesson12《网络编程》
本节要点:
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测试程序代码如下:

  1. import java.io.InputStream;  
  2. import java.io.OutputStream;  
  3. import java.net.InetAddress;  
  4. import java.net.ServerSocket;  
  5. import java.net.Socket;  
  6. public class TCP  
  7. {     
  8.     //服务器端   
  9.     public static void server()   
  10.     {     
  11.         try  
  12.         {     
  13.             ServerSocket ss=new ServerSocket(6000);  
  14.             Socket sa=ss.accept();  
  15.             InputStream  is=sa.getInputStream();  
  16.             OutputStream os=sa.getOutputStream();  
  17.             os.write("Hello Welcome you!".getBytes());  
  18.             byte[] buf=new byte[100];  
  19.             int len=is.read(buf);  
  20.             System.out.write(buf,0,len);  
  21.             ss.close();  
  22.             sa.close();  
  23.             is.close();  
  24.             os.close();  
  25.         }  
  26.         catch(Exception e)  
  27.         {  
  28.             e.printStackTrace();  
  29.         }  
  30.     }  
  31.     //客户端   
  32.     public static void client()    
  33.     {  
  34.         try   
  35.         {  
  36.             Socket  client=new Socket(InetAddress.getByName(null),6000);//端口号必须和服务器端相同   
  37.             InputStream  is=client.getInputStream();  
  38.             byte[] buf=new byte[100];  
  39.             int len=is.read(buf);  
  40.             System.out.write(buf,0,len);  
  41.             OutputStream os=client.getOutputStream();  
  42.             os.write("Hi,this is ZhangSan".getBytes());  
  43.         }   
  44.         catch (Exception e)  
  45.         {  
  46.             // TODO Auto-generated catch block   
  47.             e.printStackTrace();  
  48.         }  
  49.           
  50.     }  
  51.     public static void main(String[] args)  
  52.     {  
  53.         if(args.length>0)  
  54.         {  
  55.             server();   
  56.         }  
  57.         else  
  58.         {  
  59.             client();  
  60.         }  
  61.     }  
  62. }  
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测试程序代码如下:

  1. import java.io.BufferedOutputStream;  
  2. import java.io.InputStream;  
  3. import java.io.OutputStream;  
  4. import java.net.InetAddress;  
  5. import java.net.ServerSocket;  
  6. import java.net.Socket;  
  7.   
  8.   
  9. public class ThreadTCP extends Thread  
  10. {     
  11.     private Socket s;  
  12.     ThreadTCP(Socket s)  
  13.     {     
  14.         this.s=s;  
  15.     }  
  16.     public void run()  
  17.     {  
  18.          try   
  19.             {  
  20.                 InputStream  is=s.getInputStream();  
  21.                 OutputStream os=s.getOutputStream();  
  22.                 BufferedOutputStream bos=new BufferedOutputStream(os);  
  23.                 //os.write("Hello Welcome you!".getBytes());   
  24.                 bos.write("Hello Welcome you!".getBytes());//注意刷新缓冲区   
  25.                 bos.flush();  
  26.                 byte[] buf=new byte[100];  
  27.                 int len=is.read(buf);  
  28.                 System.out.println(new String(buf,0,len));  
  29.                 s.close();  
  30.                 is.close();  
  31.                 os.close();  
  32.             }   
  33.             catch (Exception e)   
  34.             {  
  35.                 // TODO Auto-generated catch block   
  36.                 e.printStackTrace();  
  37.             }  
  38.     }  
  39.     public static void server()   
  40.     {     
  41.         try  
  42.         {     
  43.             ServerSocket ss=new ServerSocket(6000);  
  44.             while(true)  
  45.             {  
  46.                 Socket sa=ss.accept();  
  47.                 new ThreadTCP(sa).start();  
  48.             }  
  49.             //ss.close();   
  50.         }  
  51.         catch(Exception e)  
  52.         {  
  53.             e.printStackTrace();  
  54.         }  
  55.     }  
  56.     public static void client()    
  57.     {  
  58.         try   
  59.         {  
  60.             Socket  client=new Socket(InetAddress.getByName(null),6000);//端口号必须和服务器端相同   
  61.             InputStream  is=client.getInputStream();  
  62.             byte[] buf=new byte[100];  
  63.             int len=is.read(buf);  
  64.             System.out.write(buf,0,len);  
  65.             OutputStream os=client.getOutputStream();  
  66.             os.write("Hi,this is wangwu".getBytes());  
  67.         }   
  68.         catch (Exception e)  
  69.         {  
  70.             // TODO Auto-generated catch block   
  71.             e.printStackTrace();  
  72.         }  
  73.     }  
  74.        
  75.     public static void main(String[] args)  
  76.     {  
  77.         if(args.length>0)  
  78.         {  
  79.             server();   
  80.         }  
  81.         else  
  82.         {  
  83.             client();  
  84.         }  
  85.     }  
  86.   
  87. }  
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编程

基于UDPsocket程序客户端和服务器端通信模型如下图所示:


接收端程序编写:

①调用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测试程序代码如下:

  1. import java.net.DatagramPacket;  
  2. import java.net.DatagramSocket;  
  3. import java.net.InetAddress;  
  4.   
  5.   
  6. public class UDP   
  7. {     
  8.     //发送端   
  9.     public static void send()   
  10.     {     
  11.         try  
  12.         {     
  13.             DatagramSocket ds=new DatagramSocket();  
  14.             byte[] buf="hello ,this is ZhangSan".getBytes();  
  15.             DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("localhost"),8000);  
  16.             ds.send(dp);  
  17.             //接受数据   
  18.             byte[] bufrecv=new byte[100];  
  19.             DatagramPacket dpr=new DatagramPacket(bufrecv,100);  
  20.             ds.receive(dpr);  
  21.             int len=dpr.getLength();   
  22.             System.out.write(bufrecv,0,len);  
  23.             ds.close();  
  24.         }  
  25.         catch(Exception e)  
  26.         {  
  27.             e.printStackTrace();  
  28.         }  
  29.     }  
  30.     //接收端   
  31.     public static void recv()    
  32.     {  
  33.         try   
  34.         {     
  35.             //接收数据   
  36.             DatagramSocket ds=new DatagramSocket(8000);//创建和指定端口相关的DatagramSocket   
  37.             byte[] buf=new byte[100];  
  38.             DatagramPacket dp=new DatagramPacket(buf,100);  
  39.             ds.receive(dp);  
  40.             int len=dp.getLength();   
  41.             System.out.println(new String(buf,0,len));  
  42.             //发送数据   
  43.             String str="Welcome you!";  
  44.             DatagramPacket dps=new DatagramPacket(str.getBytes(),str.length(),dp.getAddress(),dp.getPort());  
  45.             ds.send(dps);  
  46.             ds.close();  
  47.         }   
  48.         catch (Exception e)  
  49.         {  
  50.             // TODO Auto-generated catch block   
  51.             e.printStackTrace();  
  52.         }  
  53.     }  
  54.     public static void main(String[] args)  
  55.     {  
  56.         if(args.length>0)  
  57.         {  
  58.             recv();   
  59.         }  
  60.         else  
  61.         {  
  62.             send();  
  63.         }  
  64.     }  
  65. }  
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();
		}
	}
}

运行效果如下图所示:


4.URL与URI
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测试程序代码如下所示:

  1. import javax.swing.*;  
  2. import java.awt.event.WindowAdapter;  
  3. import java.awt.event.WindowEvent;  
  4. import java.awt.event.ActionListener;  
  5. import java.awt.event.ActionEvent;  
  6. import java.awt.Button;  
  7. import java.awt.HeadlessException;  
  8. import java.awt.TextField;  
  9. import java.io.BufferedReader;  
  10. import java.io.FileOutputStream;  
  11. import java.io.InputStream;  
  12. import java.io.InputStreamReader;  
  13. import java.net.InetAddress;  
  14. import java.net.URL;  
  15. import java.net.URLConnection;  
  16. import java.net.UnknownHostException;  
  17. import javax.swing.JProgressBar;  
  18. public class DownLoad   
  19. {      
  20.     @SuppressWarnings("deprecation")  
  21.     public static void main(String[] args) throws HeadlessException, UnknownHostException  
  22.     {  
  23.         JFrame jf=new JFrame("DownLoad");  
  24.         jf.setSize(600400);  
  25.         jf.setLocation(100100);  
  26.         //创建相关控件   
  27.         JPanel p=new JPanel();  
  28.         JLabel  jl=new JLabel("Please input URL:",JLabel.LEFT);  
  29.         final TextField tf=new TextField("",30);  
  30.         Button btn=new Button("下载");  
  31.         p.add(jl,0);  
  32.         p.add(tf,1);  
  33.         p.add(btn,2);  
  34.         jf.getContentPane().add(p,"North");  
  35.         final JTextArea ta=new JTextArea();  
  36.         jf.getContentPane().add(ta,"Center");  
  37.         //响应关闭按钮   
  38.         jf.addWindowListener(new WindowAdapter()  
  39.         {  
  40.             public void windowClosing(WindowEvent arg0)   
  41.             {  
  42.                 // TODO Auto-generated method stub   
  43.                 System.exit(0);  
  44.             }  
  45.         });  
  46.         //响应下载按钮   
  47.         btn.addActionListener(new ActionListener()  
  48.         {  
  49.             public void actionPerformed(ActionEvent e)  
  50.             {       
  51.                 try  
  52.                 {   
  53.                   String str=tf.getText();  
  54.                   System.out.println(str);  
  55.                   URL url=new URL(str);  
  56.                   URLConnection urlc=url.openConnection();  
  57.                   //显示URL指定页面信息   
  58.                   String line=System.getProperty("line.separator");  
  59.                   ta.append("Host:"+url.getHost());  
  60.                   ta.append(line);  
  61.                   ta.append("Port:"+url.getDefaultPort());  
  62.                   ta.append(line);  
  63.                   ta.append("ContendType:"+urlc.getContentType());  
  64.                   ta.append(line);  
  65.                   ta.append("Contendlength:"+urlc.getContentLength());  
  66.                   int len=urlc.getContentLength();  
  67.                   //获取输入输出流   
  68.                   InputStream is=urlc.getInputStream();  
  69.                   InputStreamReader isr=new InputStreamReader(is);  
  70.                   BufferedReader    br=new BufferedReader(isr);  
  71.                   FileOutputStream fos=new FileOutputStream("1.html");  
  72.                   /* 
  73.                   //按行读取和存贮 
  74.                   String strline; 
  75.                   while((strline=br.readLine())!=null) 
  76.                   { 
  77.                       fos.write(strline.getBytes()); 
  78.                       fos.write(line.getBytes()); 
  79.                   } 
  80.                   */  
  81.                   //按字节流读取和存贮   
  82.                   int data;  
  83.                   while((data=br.read())!=-1)  
  84.                   {  
  85.                       fos.write(data);  
  86.                   }       
  87.                   br.close();  
  88.                   fos.close();  
  89.                 }  
  90.                 catch(Exception ex)  
  91.                 {  
  92.                     ex.printStackTrace();  
  93.                 }  
  94.             }  
  95.         });  
  96.         jf.show();  
  97.     }  
  98. }  
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();
	}
}

运行效果如下图所示:

这个下载程序还很不完善,有待改进。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值