`
javappx
  • 浏览: 9779 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

黑马程序员--JAVA网络编程

 
阅读更多

 ------- android培训java培训、期待与您交流! ----------

 

 

1、网络编程概述

(1)网络模型

OSI参考模型

应用层 表示层 会话层 传输层 网络层 数据连接层 物理层

TCP/IP参考模型

应用层 传输层 网际层 主机至网络层

 

(2)网络通讯要素

IP地址 端口号  传输协议

(3)网络通讯前提:

找到对方IP

数据要发送到指定端口。为了标示不同的应用程序,所以给这些网络应用程序都用数字进行标示

。这个表示就叫端口。

定义通信规则。这个规则称为通信协议,国际组织定义了通用协议TCP/IP

 

IP地址:InetAddress

网络中设备的标识

不易记忆,可用主机名

本地回环地址:127.0.0.1  主机名:localhost

 

端口号

用于标识进程的逻辑地址,不同进程的标识

有效端口:0~65535,其中0~1024系统使用或保留端口。

 

传输协议

通讯的规则

 

常见协议:TCP,UDP

 

 

 

 

 

2、TCP和UDP

 

(1)UDP和TCP的区别:

 

UDP

将数据及源和目的封装成数据包中,不需要建立连接每个数据报的大小在限制在64k内因无连接,是不可靠协议不需要建立连接,速度快

 

TCP  

建立连接,形成传输数据的通道,在连接中进行大数据量传输通过三次握手完成连接,是可靠协议必须建立连接,效率会稍低

 

注:三次握手:

第一次:我问你在么?

第二次:你回答在。

第三次:我反馈哦我知道你在。

 

 

3、Socket(UDP传输)

**Socket就是为网络服务提供的一种机制。

**通信的两端都有Socket。

**网络通信其实就是Socket间的通信。

**数据在两个Socket间通过IO传输。

**玩Socket主要就是记住流程,代码查文档就行

 

 

 

(1)UDP传输:DatagramSocket与DatagramPacket

 

**发送端:

建立DatagramSocket服务;

提供数据,并将数据封装到字节数组中;

创建DatagramPacket数据包,并把数据封装到包中,同时指定IP和接收端口

通过Socket服务,利用send方法将数据包发送出去;

关闭DatagramSocket和DatagramPacket服务。

**接收端:

建立DatagramSocket服务,并监听一个端口;

定义一个字节数组和一个数据包,同时将数组封装进数据包;

通过DatagramPacket的receive方法,将接收的数据存入定义好的数据包;

通过DatagramPacke关闭t的方法,获取发送数据包中的信息;

关闭DatagramSocket和DatagramPacket服务。

DatagramSocket与DatagramPacket方法摘要:

*****DatagramSocket

构造方法:

DatagramSocket() 

构造数据报套接字并将其绑定到本地主机上任何可用的端口。

DatagramSocket(int port) 

创建数据报套接字并将其绑定到本地主机上的指定端口。 

DatagramSocket(int port, InetAddress laddr) 

创建数据报套接字,将其绑定到指定的本地地址。 

方法摘要:

void close() 

关闭此数据报套接字。

InetAddress getInetAddress() 

返回此套接字连接的地址。 

InetAddress getLocalAddress() 

获取套接字绑定的本地地址。

int getPort() 

返回此套接字的端口。 

void receive(DatagramPacket p) 

从此套接字接收数据报包。 

void send(DatagramPacket p) 

从此套接字发送数据报包。

****DatagramPacket

构造方法:

DatagramPacket(byte[] buf, int length) 

构造 DatagramPacket,用来接收长度为 length 的数据包。

DatagramPacket(byte[] buf, int length, InetAddress address, int port) 

构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。

InetAddress getAddress() 

返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。 

byte[] getData() 

返回数据缓冲区。 

int getLength() 

返回将要发送或接收到的数据的长度。

int getPort() 

返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。

代码示例:

****发送端:

class UDPSend

{

public static void main(String[] args) throws Exception

{

DatagramSocket ds = new DatagramSocket();

byte[] buf = "这是UDP发送端".getBytes();

DatagramPacket dp = new DatagramPacket(

buf,buf.length,InetAddress.getByName("192.168.1.253"),10000);

ds.send(dp);

ds.close();

}

}

****接收端

class UDPRece

{

public static void main(String[] args) throws Exception

{

DatagramSocket ds = new DatagramSocket(10000);

byte[] buf = new byte[1024];

DatagramPacket dp = new DatagramPacket(buf,buf.length);

ds.receive(dp);//将发送端发送的数据包接收到接收端的数据包中

String ip = dp.getAddress().getHosyAddress();//获取发送端的ip

String data = new String(dp.getData(),0,dp.getLength());//获取数据

int port = dp.getPort();//获取发送端的端口号

sop(ip+":"+data+":"+port);

ds.close();

}

}

 

 

 

 

 

 

 

 

(2)TCP传输

Socket和ServerSocket

建立客户端和服务器端

建立连接后,通过Socket中的IO流进行数据的传输

关闭socket

同样,客户端与服务器端是两个独立的应用程序。

****Socket

**构造方法:

Socket() 

通过系统默认类型的 SocketImpl 创建未连接套接字

Socket(InetAddress address, int port) 

创建一个流套接字并将其连接到指定 IP 地址的指定端口号。

Socket(String host, int port) 

创建一个流套接字并将其连接到指定主机上的指定端口号。

**方法摘要:

void close() 

关闭此套接字。

InetAddress getInetAddress() 

返回套接字连接的地址。

InputStream getInputStream() 

返回此套接字的输入流。

OutputStream getOutputStream() 

返回此套接字的输出流。 

int getPort() 

返回此套接字连接到的远程端口。

void shutdownInput() 

此套接字的输入流置于“流的末尾”。 

void shutdownOutput() 

禁用此套接字的输出流。 

String toString() 

将此套接字转换为 String。

****ServerSocket

**构造方法:

ServerSocket() 

创建非绑定服务器套接字。 

ServerSocket(int port) 

创建绑定到特定端口的服务器套接字。

方法摘要:

Socket accept() 

侦听并接受到此套接字的连接。

void close() 

关闭此套接字。 

InetAddress getInetAddress() 

返回此服务器套接字的本地地址。

****TCP传输流程:

**客户端:

建立Socket服务,并制定要连接的主机和端口;

获取Socket流中的输出流OutputStream,将数据写入流中,通过网络发送给服务端;

获取Socket流中的输出流InputStream,获取服务端的反馈信息;

关闭资源。

**服务端:

建立ServerSocket服务,并监听一个端口;

通过ServerSocket服务的accept方法,获取Socket服务对象;

使用客户端对象的读取流获取客户端发送过来的数据;

通过客户端对象的写入流反馈信息给客户端;

关闭资源;

*

 

 

 

 

 

2314   TCP文件复制

 

 

 

import java.io.*;

import java.net.*;

 

class  TextClient

{

       public static void main(String[] args) throws Exception

       {

              Socket s = new Socket("192.168.1.254",10006);

 

              BufferedReader bufr =

                     new BufferedReader(new FileReader("IPDemo.java"));

 

 

 

              PrintWriter out = new PrintWriter(s.getOutputStream(),true);

 

 

              String line = null;

              while((line=bufr.readLine())!=null)

              {

                     out.println(line);

              }

 

              s.shutdownOutput();//关闭客户端的输出流。相当于给流中加入一个结束标记-1.

 

             

              BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));

 

              String str = bufIn.readLine();

              System.out.println(str);

 

              bufr.close();

 

              s.close();

       }

}

class  TextServer

{

       public static void main(String[] args) throws Exception

       {

              ServerSocket ss = new ServerSocket(10006);

 

              Socket s = ss.accept();

              String ip = s.getInetAddress().getHostAddress();

              System.out.println(ip+"....connected");

 

 

              BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));

 

              PrintWriter out  = new PrintWriter(new FileWriter("server.txt"),true);

 

              String line = null;

 

              while((line=bufIn.readLine())!=null)

              {

                     //if("over".equals(line))

                            //break;

                     out.println(line);

              }

 

              PrintWriter pw = new PrintWriter(s.getOutputStream(),true);

              pw.println("上传成功");

 

 

              out.close();

              s.close();

              ss.close();

 

       }

}

 

2401 TCP 上传图片

 

/*

需求:上传图片。

 

 

 

*/

/*

客户端。

1,服务端点。

2,读取客户端已有的图片数据。

3,通过socket 输出流将数据发给服务端。

4,读取服务端反馈信息。

5,关闭。

 

*/

 

import java.io.*;

import java.net.*;

class  PicClient

{

       public static void main(String[] args)throws Exception

       {

              Socket s = new Socket("192.168.1.254",10007);

 

              FileInputStream fis = new FileInputStream("c:\\1.bmp");

 

              OutputStream out = s.getOutputStream();

 

              byte[] buf = new byte[1024];

 

              int len = 0;

 

              while((len=fis.read(buf))!=-1)//末尾返回-1 如何判断末尾?

              {

                     out.write(buf,0,len);

              }

 

              //告诉服务端数据已写完

              s.shutdownOutput();

 

              InputStream in = s.getInputStream();

 

              byte[] bufIn = new byte[1024];

 

              int num = in.read(bufIn);

              System.out.println(new String(bufIn,0,num));

 

              fis.close();

              s.close();

       }

}

 

/*

服务端

*/

class  PicServer

{

       public static void main(String[] args) throws Exception

       {

              ServerSocket ss = new ServerSocket(10007);

 

              Socket s = ss.accept();

 

              InputStream in = s.getInputStream();

 

              FileOutputStream fos = new FileOutputStream("server.bmp");

 

              byte[] buf = new byte[1024];

 

              int len = 0;

              while((len=in.read(buf))!=-1)

              {

                     fos.write(buf,0,len);

              }

 

              OutputStream out = s.getOutputStream();

 

              out.write("上传成功".getBytes());

 

              fos.close();

 

              s.close();

 

              ss.close();

       }

}

 

 

 

 

2402 TCP  客户端并发上传图片

 

/*

需求:上传图片。

 

 

 

*/

/*

客户端。

1,服务端点。

2,读取客户端已有的图片数据。

3,通过socket 输出流将数据发给服务端。

4,读取服务端反馈信息。

5,关闭。

 

*/

 

import java.io.*;

import java.net.*;

class  PicClient

{

       public static void main(String[] args)throws Exception

       {

              if(args.length!=1)

              {

                     System.out.println("请选择一个jpg格式的图片");

                     return ;

              }

 

 

 

 

              File file = new File(args[0]);

              if(!(file.exists() && file.isFile()))

              {

                     System.out.println("该文件有问题,要么补存在,要么不是文件");

                     return ;

 

              }

 

              if(!file.getName().endsWith(".jpg"))

              {

                     System.out.println("图片格式错误,请重新选择");

                     return ;

              }

 

              if(file.length()>1024*1024*5)

              {

                     System.out.println("文件过大,没安好心");

                     return ;

              }

             

 

 

 

              Socket s = new Socket("192.168.1.254",10007);

 

              FileInputStream fis = new FileInputStream(file);

 

              OutputStream out = s.getOutputStream();

 

              byte[] buf = new byte[1024];

 

              int len = 0;

 

              while((len=fis.read(buf))!=-1)

              {

                     out.write(buf,0,len);

              }

 

              //告诉服务端数据已写完

              s.shutdownOutput();

 

              InputStream in = s.getInputStream();

 

              byte[] bufIn = new byte[1024];

 

              int num = in.read(bufIn);

              System.out.println(new String(bufIn,0,num));

 

              fis.close();

              s.close();

       }

}

 

/*

服务端

 

这个服务端有个局限性。当A客户端连接上以后。被服务端获取到。服务端执行具体流程。

这时B客户端连接,只有等待。

因为服务端还没有处理完A客户端的请求,还有循环回来执行下次accept方法。所以

暂时获取不到B客户端对象。

 

那么为了可以让多个客户端同时并发访问服务端。

那么服务端最好就是将每个客户端封装到一个单独的线程中,这样,就可以同时处理多个客户端请求。

 

 

 

如何定义线程呢?

 

只要明确了每一个客户端要在服务端执行的代码即可。将该代码存入run方法中。

*/

 

class PicThread implements Runnable

{

 

       private Socket s;

       PicThread(Socket s)

       {

              this.s = s;

       }

       public void run()

       {

 

              int count = 1;

              String ip  = s.getInetAddress().getHostAddress();

              try

              {

                     System.out.println(ip+"....connected");

 

                     InputStream in = s.getInputStream();

 

                     File dir =  new File("d:\\pic");

 

                     File file = new File(dir,ip+"("+(count)+")"+".jpg");

 

                     while(file.exists())

                            file = new File(dir,ip+"("+(count++)+")"+".jpg");

 

                     FileOutputStream fos = new FileOutputStream(file);

 

                     byte[] buf = new byte[1024];

 

                     int len = 0;

                     while((len=in.read(buf))!=-1)

                     {

                            fos.write(buf,0,len);

                     }

 

                     OutputStream out = s.getOutputStream();

 

                     out.write("上传成功".getBytes());

 

                     fos.close();

 

                     s.close();

              }

              catch (Exception e)

              {

                     throw new RuntimeException(ip+"上传失败");

              }

       }

}

 

 

 

class  PicServer

{

       public static void main(String[] args) throws Exception

       {

              ServerSocket ss = new ServerSocket(10007);

 

              while(true)

              {

                     Socket s = ss.accept();

 

                     new Thread(new PicThread(s)).start();

 

             

              }

 

              //ss.close();

       }

}

 

 

2403 TCP 客户端并发登录

 

/*

客户端通过键盘录入用户名。

服务端对这个用户名进行校验。

 

如果该用户存在,在服务端显示xxx,已登陆。

并在客户端显示 xxx,欢迎光临。

 

如果该用户不存在,在服务端显示xxx,尝试登陆。

并在客户端显示 xxx,该用户不存在。

 

最多就登录三次。

*/

import java.io.*;

import java.net.*;

 

 

class  LoginClient

{

       public static void main(String[] args) throws Exception

       {

              Socket s = new Socket("192.168.1.254",10008);

 

              BufferedReader bufr =

                     new BufferedReader(new InputStreamReader(System.in));

 

              PrintWriter out = new PrintWriter(s.getOutputStream(),true);

 

              BufferedReader bufIn =

                     new BufferedReader(new InputStreamReader(s.getInputStream()));

 

 

              for(int x=0; x<3; x++)

              {

                     String line = bufr.readLine();

                     if(line==null)

                            break;

                     out.println(line);

 

                     String info = bufIn.readLine();

                     System.out.println("info:"+info);

                     if(info.contains("欢迎"))

                            break;

 

              }

 

              bufr.close();

              s.close();

       }

}

 

 

class UserThread implements Runnable

{

       private Socket s;

       UserThread(Socket s)

       {

              this.s = s;

       }

       public void run()

       {

              String ip = s.getInetAddress().getHostAddress();

              System.out.println(ip+"....connected");

              try

              {

                     for(int x=0; x<3; x++)

                     {

                            BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));

 

                            String name = bufIn.readLine();

                            if(name==null)

                                   break;

 

                            BufferedReader bufr = new BufferedReader(new FileReader("user.txt"));

 

                            PrintWriter out = new PrintWriter(s.getOutputStream(),true);

 

                            String line = null;

 

                            boolean flag = false;

                            while((line=bufr.readLine())!=null)

                            {

                                   if(line.equals(name))

                                   {

                                          flag = true;

                                          break;

                                   }                          

                            }

                           

                            if(flag)

                            {

                                   System.out.println(name+",已登录");

                                   out.println(name+",欢迎光临");

                                   break;

                            }

                            else

                            {

                                   System.out.println(name+",尝试登录");

                                   out.println(name+",用户名不存在");

                            }

 

 

                     }

                     s.close();

              }

              catch (Exception e)

              {

                     throw new RuntimeException(ip+"校验失败");

              }

       }

}

class  LoginServer

{

       public static void main(String[] args) throws Exception

       {

              ServerSocket ss = new ServerSocket(10008);

 

              while(true)

              {

                     Socket s = ss.accept();

 

                     new Thread(new UserThread(s)).start();

              }

       }

}

 

 

2404  网络编程-浏览器客户端-自定义服务器

 

 

/*

演示客户端和服务端。

 

1

客户端:浏览器 (telnet)

服务端:自定义。

 

2

客户端:浏览器。

服务端:Tomcat服务器。

 

3

客户端:自定义。(图形界面)

服务端:Tomcat服务器。

 

 

 

*/

 

import java.net.*;

import java.io.*;

class ServerDemo

{

       public static void main(String[] args) throws Exception

       {

              ServerSocket ss = new ServerSocket(11000);

 

              Socket s = ss.accept();

              System.out.println(s.getInetAddress().getHostAddress());

 

              InputStream in = s.getInputStream();

 

              byte[] buf = new byte[1024];

 

              int len = in.read(buf);

 

              System.out.println(new String(buf,0,len));   //浏览器发个服务器的信息

 

 

              PrintWriter out = new PrintWriter(s.getOutputStream(),true);

 

              out.println("<font color='red' size='7'>客户端你好</font>");

 

              s.close();

 

              ss.close();

       }

}

http请求消息头

 

 

/192.168.1.102

GET / HTTP/1.1

Accept: text/html, application/xhtml+xml, */*

Accept-Language: en-US,zh-CN;q=0.5

User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6

.0)

Accept-Encoding: gzip, deflate

Host: 192.168.1.102:11000

DNT: 1

Connection: Keep-Alive

 

 

自定义浏览器 tomcat服务器/客户端服务端

import java.io.*;

import java.net.*;

 

class MyIE

{

       public static void main(String[] args)throws Exception

       {

              Socket s = new Socket("192.168.1.254",8080);

             

              PrintWriter out = new PrintWriter(s.getOutputStream(),true);

 

              out.println("GET /myweb/demo.html HTTP/1.1");

              out.println("Accept: */*");

              out.println("Accept-Language: zh-cn");

              out.println("Host: 192.168.1.254:11000");

              out.println("Connection: closed");

 

              out.println();

              out.println();

 

              BufferedReader bufr = new BufferedReader(new InputStreamReader(s.getInputStream()));

 

              String line = null;

 

              while((line=bufr.readLine())!=null)

              {

                     System.out.println(line);

              }

 

              s.close();

 

 

 

 

       }

}

/*

http://192.168.1.254:11000/myweb/demo.html

 

GET /myweb/demo.html HTTP/1.1

Accept: application/x-shockwave-flash, image/gif, image/x-xbitmap, image/jpeg, i

mage/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application

/msword, application/QVOD, application/QVOD,

Accept-Language: zh-cn

Accept-Encoding: gzip, deflate

User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0

.50727)

Host: 192.168.1.254:11000

Connection: Keep-Alive

 

 

*/

 

2408

 

 

import java.net.*;

class URLDemo

{

       public static void main(String[] args) throws MalformedURLException

       {

              URL url = new URL("http://192.168.1.254/myweb/demo.html?name=haha&age=30");

 

 

              System.out.println("getProtocol() :"+url.getProtocol());

              System.out.println("getHost() :"+url.getHost());

              System.out.println("getPort() :"+url.getPort());

              System.out.println("getPath() :"+url.getPath());

              System.out.println("getFile() :"+url.getFile());

              System.out.println("getQuery() :"+url.getQuery());

 

              /*int port = getPort();

              if(port==-1)

                     port = 80;

 

              getPort()==-1

              */

       }

}

/*

 String getFile()

          获取此 URL 的文件名。

 String getHost()

          获取此 URL 的主机名(如果适用)。

 String getPath()

          获取此 URL 的路径部分。

 int getPort()

          获取此 URL 的端口号。

 String getProtocol()

          获取此 URL 的协议名称。

 String getQuery()

          获取此 URL 的查询部

 

*/

 

 

 

 

import java.net.*;

import java.io.*;

class  URLConnectionDemo

{

       public static void main(String[] args) throws Exception

       {

              URL url = new URL("http://192.168.1.254:8080/myweb/demo.html");

 

              URLConnection conn = url.openConnection();

              System.out.println(conn);

             

              InputStream in = conn.getInputStream();

 

              byte[] buf = new byte[1024];

 

              int len = in.read(buf);

 

              System.out.println(new String(buf,0,len));

 

 

 

 

 

 

       }

}

 

 

 

 

 

import java.awt.*;

import java.awt.event.*;

import java.io.*;

import java.net.*;

class  MyIEByGUI2

{

       private Frame f;

       private TextField tf;

       private Button but;

       private TextArea ta;

      

       private Dialog d;

       private Label lab;

       private Button okBut;

 

 

       MyIEByGUI2()

       {

              init();

       }

       public void init()

       {

              f = new Frame("my window");

              f.setBounds(300,100,600,500);

              f.setLayout(new FlowLayout());

 

              tf = new TextField(60);

 

              but = new Button("转到");

 

              ta = new TextArea(25,70);

 

 

              d = new Dialog(f,"提示信息-self",true);

              d.setBounds(400,200,240,150);

              d.setLayout(new FlowLayout());

              lab = new Label();

              okBut = new Button("确定");

 

              d.add(lab);

              d.add(okBut);

 

 

 

              f.add(tf);

              f.add(but);

              f.add(ta);

 

 

              myEvent();

              f.setVisible(true);

       }

       private void  myEvent()

       {

 

              okBut.addActionListener(new ActionListener()

              {

                     public void actionPerformed(ActionEvent e)

                     {

                            d.setVisible(false);

                     }

              });

              d.addWindowListener(new WindowAdapter()

              {

                     public void windowClosing(WindowEvent e)

                     {

                            d.setVisible(false);

                     }

              });

 

              tf.addKeyListener(new KeyAdapter()

              {

                     public void keyPressed(KeyEvent e)

                     {

                            try

                            {

                                          if(e.getKeyCode()==KeyEvent.VK_ENTER)

                                   showDir();

                            }

                            catch (Exception ex)

                            {

                            }

                    

                     }

              });

 

 

              but.addActionListener(new ActionListener()

              {

                     public void actionPerformed(ActionEvent e)

                     {

                            try

                            {

                                   showDir();

                            }

                            catch (Exception ex)

                            {

                            }

                           

                           

                     }

              });

 

              f.addWindowListener(new WindowAdapter()

              {

                     public void windowClosing(WindowEvent e)

                     {

                            System.exit(0);     

                     }

              });

       }

 

       private void showDir()throws Exception

       {

 

              ta.setText("");

              String urlPath = tf.getText();//http://192.168.1.254:8080/myweb/demo.html

             

              URL url = new URL(urlPath);

 

              URLConnection conn = url.openConnection();

             

              InputStream in = conn.getInputStream();

 

              byte[] buf = new byte[1024];

 

              int len = in.read(buf);

 

              ta.setText(new String(buf,0,len));

 

       }

 

       public static void main(String[] args)

       {

              new MyIEByGUI2();

       }

 

}

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics