黑马程序员_java基础-网络编程

<a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流!

网络编程

网络模型

OSI参考模型

TCP/IP协议

网络通信要素

IP地址

     网络中设备的标识

     不易记忆可用主机名

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

端口号

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

有效端口:0-65535,其中0-1024系统使用和保留端口.

传输协议

     通信规则,常见协议TCP,UDP


UDP和TCP

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

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

     Socket就是为网络提供的一种机制.通信的两端都有Socket,网络通信其实就是Socket间的通信,数据在两个Socket间通过IO传递.

 

UDP传输

     DatagramSocket与DatagramPacket.

建立发送端,接收端.

建立数据包

调用Socket的发送接收方法.

关闭Socket

发送端与接收端是两个独立的运行程序.

练习:

importjava.net.*;

importjava.io.*;

 

public class UdpDemo3

{

     public static void main(String[] args)

     {

         try

         {

              DatagramSocket sendDS = new DatagramSocket();

              DatagramSocket receDS = new DatagramSocket(10014);

 

              Send send = new Send(sendDS);

              Rece rece = new Rece(receDS);

 

              Thread t1 = new Thread(send);

              Thread t2 = new Thread(rece);

 

              t1.start();

              t2.start();

         }

         catch (SocketException e)

         {

              e.printStackTrace();

         }

     }

}

 

class Send implements Runnable

{

     private DatagramSocketds;

 

     public Send(DatagramSocket ds)

     {

         this.ds = ds;

     }

 

     byte[] buf = null;

 

     public void run()

     {

 

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

         String line = null;

         try

         {

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

              {

                   if ("end".equals(line))

                       break;

                   buf = line.getBytes();

 

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

                            InetAddress.getByName("127.0.0.1"), 10014);//为么每次运行都要修端口号,是不是被占用

 

                   ds.send(dp);

              }

         }

         catch (IOException e)

         {

              e.printStackTrace();

         }

         finally

         {

              if (ds !=null)

                   ds.close();

         }

     }

}

 

class Rece implements Runnable

{

     private DatagramSocketds;

 

     public Rece(DatagramSocket ds)

     {

         this.ds = ds;

     }

 

     public void run()

     {

         byte[] buf =new byte[1024 * 64];

         while (true)//端口被占,运行报异常.

         {

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

 

              try

              {

                   ds.receive(dp);

 

                   String data = new String(dp.getData(), 0, dp.getLength());

                   String ip =dp.getAddress().getHostAddress();

 

                   System.out.println("IP" + ip +":" + data + ".......端口:" + dp.getPort());

              }

              catch (IOException e)

              {

                   e.printStackTrace();

              }

              finally

              {

                   if (ds !=null)

                       ds.close();

              }

         }

     }

}

TCP传输

     Socket和ServerSocket

     建立客户端和服务器端

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

     关闭Socket,同样客户端和服务器端是两个独立的应用程序

练习:

/*

 * 需求:建立一个文本转换服务器 客户端给服务端发送文本,服务端会将文本转成大写在返回给客户端,而且客户湍可以不断的进行文本转换 当客户湍输入OVER时结束

 * 分析:客户湍: 因为是操作键盘,所以使用IO技术,并按IO的操作规律来思考 源:键盘输入 目的:网络设备,网络输出流,而且操作的是文本数据可以选择字符流

 * 步骤: 1.建立服务 2.获取键盘录入 3.将数据发给客户端 4.去服务端返回大写数据 5.结束,关闭资源

 */

importjava.net.*;

importjava.io.*;

 

public class TcpDemo2

{

     public static void main(String[] args)

     {

         try

         {

              //创建线程并运行

              new Thread(new TcpServer2(new ServerSocket(10007))).start();

              new Thread(new TcpClient2(new Socket("127.0.0.1", 10007))).start();

         }

         catch (IOException e)

         {

              e.printStackTrace();

         }

     }

}

 

classTcpClient2implements Runnable

{

     private Sockets;

 

     public TcpClient2(Socket s)

     {

         this.s = s;

     }

 

     public void run()

     {

         //建立缓冲

         BufferedReader br = null;

         BufferedWriter bw = null;

         BufferedReader brs = null;

         try

         {

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

              bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

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

 

              String line = null;

 

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

              {

                   if ("end".equals(line))

                       break;

                   bw.write(line);

                   bw.newLine();// 必须加上换行,不然服务器端的ReadLine()不会返回数据,因为只有当读到"\r\n"时才停止

                   bw.flush();// 因为是写入缓冲里,所以得刷新

 

                   line = brs.readLine();

 

                   System.out.println(s.getInetAddress().getHostAddress()//获取ip

                            + "服务端处理后信息::" + line);

              }

         }

         catch (IOException e)

         {

              e.printStackTrace();

         }

         finally

         {

              if (s !=null)

                   try

                   {

                       s.close();

                   }

                   catch (IOException e1)

                   {

                       e1.printStackTrace();

                   }

              if (br !=null)

                   try

                   {

                       br.close();

                   }

                   catch (IOException e)

                   {

                       e.printStackTrace();

                   }

         }

     }

}

 

classTcpServer2implements Runnable

{

     private ServerSocketss;

 

     public TcpServer2(ServerSocket ss)

     {

         this.ss = ss;

     }

 

     public void run()

     {

         BufferedReader br = null;

         BufferedWriter bw = null;

         Socket s = null;

         try

         {

              s = ss.accept();

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

              // bw = new BufferedWriter(newOutputStreamWriter(s.getOutputStream()));

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

              String line = null;

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

              {

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

                            + "客户端发过来的文本::" + line);

 

                   // bw.write(line.toUpperCase());

                   // bw.newLine();//必须加上换行,不然服客户端的ReadLine()不会返回数据,因为只有当读到"\r\n"时才停止

                   // bw.flush();

 

                   pw.println(line.toUpperCase());

              }

         }

          catch (IOException e)

         {

              e.printStackTrace();

         }

         finally

         {

              if (ss !=null)

                   try

                   {

                       ss.close();

                   }

                   catch (IOException e)

                   {

                       e.printStackTrace();

                   }

              if (s !=null)

                   try

                   {

                       s.close();

                   }

                   catch (IOException e)

                   {

                       e.printStackTrace();

                   }

         }

     }

}

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值