"黑马程序员"网络编程学习笔记1

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


一.进行通讯的步骤:

1.找到对方IP(最大值255,本机的默认IP:127 .0.0.1)255是广播地址

2.数据要发到对方指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序都用数字进行标识,为了方便称呼这个数字,叫做端口。

3.定义通信规则,这个通讯规则称为协议,国际组织定义了通用协议TCP/IP,协议有两种TCP/IP和UDP两种协议

二.网络模型:

                     (通过数据的封箱与拆箱来进行网络通讯)

三.网络通讯要素:

1.IP地址:网络中设备的标识,主机名localhost也能替代

2.端口号:用于标识进程的逻辑地址,有效端口:0-65535,其中0-1024系统使用或保留

3.传输协议:通讯的规则,常用协议TCP,UDP

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

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

socke套接字t定义:socket就是为网络服务提供的一种机制,通信的两端都有socket,网络通信其实就是socket间的通信,数据在两个socket间通过IO传输。

UDP传输

1.DatagramSocket与DatagramPacket

2.建立发送端,接收端

3.建立数据包

4.调用socket的发送接收方法

5关闭Socket

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

发送端:

import java.net.*;

/*

需求:通过udp传输方式,将一段文字数据发送出去。

思路:

1.建立updsocket服务。

2.提供数据,将数据封装到数据包中。

3.通过socket服务的发送功能,将数据包发过去。

4.关闭资源。

*/

class UdpSend

{

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

    {

          //1.创建udp服务,通过DatagramSocket对象。

         DatagramSocket ds=new DatagramSocket();

      //2.确定数据,并封装成数据包。

         byte []data="wo shi zhong guo  ren".getBytes();

         DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.0.0.1"),10000);

      //3.通过socket服务,将已有的数据包发送过去,通过send方法。

      ds.send(dp);

     //4.关闭资源

      ds.close();

   }

}

接受端:

/*

需求:

定义一个应用程序,用于接受udp协议传输的数据并处理的。

思路 :

1.定义udpsocket服务。通常会监听端口

2.定义一个数据包,因为要存储接收到的字节数据,因为数据包对象中有更多功能可以提取字节数据中的不同数据信息。

3.通过socket服务的receive方法将收到的数据存入已定义好的数据包中。

4.通过数据包中的特有功能。将这些不同的数据取出,打印在控制台上。

5.关闭资源

*/

class UdpRece

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

     {

       1.创建udp的socket,建立端点。

        DatagramSocket ds=new DatagramSocket(10000);

       while(true){

        //  DatagramSocket ds=new DatagramSocket(10000);不能这样定义,否则会出异常

         //2.定义数据包,用于存储数据。

         byte[]  buf=new byte[1024];

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

        //3.通过服务的receive方法将收到数据存入数据包中,是个阻塞方法

        ds.receive(dp);

      //4.通过数据包的方法获取其中的数据

        //发送端的IP

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

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

        //发送端的端口

          int port=dp.getPort();

          System.out.println("ip:"+ip+",data"+data+",port:"+port);

           //5.关闭资源

            ds.close();

            }

     }

}

TCP传输

1.socket和ServerSocket

2.建立客户端和服务端

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

4.关闭socket

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

/*

演示TCP传输

1.tcp分客户端和服务端

2.客户端对应的对象是socket

   服务端对应的对象是serverSocket.

*/

/*

客户端:

通过查阅socket对象,发现在该对象建立时,就可以去连接指定主机

因为tcp是面向连接的,所以在建立socket服务时

就要有服务端存在,并连接成功,形成通路后,在该通道进行数据的传输。

步骤:

1.创建socket服务,并制定要连接的主机和端口。

*/

客户端:

import java.io.*;

import java.net.*;

class TcpClient

{

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

            //创建客户端的socket服务,指定目的主机和端口

           Socket s=new Socket("192.0.0.1",10003);

           //为了发送数据,应该获取socket流中的输出流。

           OutputStream out=s.getOutputStream();

           out.write("wo laile tcp".getBytes());

             s.close();

            }  

}

服务端:

/* 

需求:定义端点接收数据并打印在控制台上。

服务端:

1.建立服务端的socket服务。ServerSocket;

并监听一个端口。

2.获取链接过来的客户端对象

  通过serverSocket的accept方法。没有连接就会等,所以这个方法阻塞式的。

3.客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据。

4.关闭服务端(可选)

*/

class TcpServer

{

   public static void main(String []args){

          //建立服务端socket服务,并监听一个端口。

         ServerSocket ss=new ServerSocket(10003);

       //通过accept方法获取连接过来的客户端对象,这是个阻塞方法

         Socket  s=ss.accept();

         String ip=s.getInetAddress.getHostAddress();

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

         //获取客户端发过来的数据,那么要使用客户端对象的读取流来读取数据

          InputStream in=s.getInputStream();

         byte[] buf=new byte[1024];

         int len=in.read(buf);

          System.out.print(new String(buf.o,len);

          s.close();//关闭客户端


关于TCP的练习:

/*
 * 需求:建立一个文本转换服务端。
 * 客户端给服务端发送文本,服务端会将文本转成大写在返回给客户端
 * 而且客户端可以不断的进行文本转换,当客户的输入over时,转换结束。
 * 分析:
 * 客户端:
 * 既然是操作设备上的数据,那么就可以使用io技术,并按照io的操作规律来思考
 * 源:键盘录入。
 * 目的:网络设备,网络输出流。
 * 而且操作的是文本转换,可以选择字节流。
 * 步骤:
 * 1.建立服务。
 * 2.获取键盘录入
 * 3.将数据发给服务端。
 * 4.后去服务端返回的大写数据。
 * 5.结束,关资源
 * 都是文本数据,可以使用字符流进行操作,同时提高效率,加入缓冲
 */
/*
 * 该例子出现的问题。
 * 现象:客户端和服务端都在莫名的等待
 * 为什么呢?
 * 因为客户端和服务端都有阻塞式方法,这些方法没有读到结束标识。那么一直等
 *而导致两端都在等待 
 */
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
 class TransClient  {
    public static void main(String[] args)throws Exception {
Socket s=new Socket("192.0.0.1",10000);
//定义读取键盘数据的流对象
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
  //定义目的,将数据写入到socket输出流,发给服务端。
BufferedWriter bufOut=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//定义一个socket读取流,读取服务端返回的大写信息。
BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
String line=null;
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
bufOut.write(line);
bufOut.flush();
bufOut.newLine();
String str=bufIn.readLine();
System.out.println("server:"+str);
}
bufr.close();
s.close();
}
}
 /*
  * 服务端:
  * 源:socket读取流。
  * 目的:socket输出流。
  * 都是文本,装饰
  */
class TransServer{
public static void main(String[] args)throws Exception {
ServerSocket ss=new ServerSocket(10000);
   Socket s=ss.accept();
//读取socket读取流中的数据
BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
   //目的,socket输出流,将大写数据写入到socket输出流,并发送给客户端
// BufferedWriter bufOut=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
PrintWriter out=new PrintWriter(s.getOutputStream(),true);
String line=null;
while((line=bufIn.readLine())!=null){
System.out.println(line);
/*bufOut.write(line.toUpperCase());
    bufOut.newLine();
    bufOut.flush();
*/
out.println(line.toUpperCase());
}
s.close();
ss.close();
}
}
 一下是TCP的练习:

/*
 * 需求:建立一个文本转换服务端。
 * 客户端给服务端发送文本,服务端会将文本转成大写在返回给客户端
 * 而且客户端可以不断的进行文本转换,当客户的输入over时,转换结束。
 * 分析:
 * 客户端:
 * 既然是操作设备上的数据,那么就可以使用io技术,并按照io的操作规律来思考
 * 源:键盘录入。
 * 目的:网络设备,网络输出流。
 * 而且操作的是文本转换,可以选择字节流。
 * 步骤:
 * 1.建立服务。
 * 2.获取键盘录入
 * 3.将数据发给服务端。
 * 4.后去服务端返回的大写数据。
 * 5.结束,关资源
 * 都是文本数据,可以使用字符流进行操作,同时提高效率,加入缓冲
 */
/*
 * 该例子出现的问题。
 * 现象:客户端和服务端都在莫名的等待
 * 为什么呢?
 * 因为客户端和服务端都有阻塞式方法,这些方法没有读到结束标识。那么一直等
 *而导致两端都在等待 
 */
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
 class TransClient  {
    public static void main(String[] args)throws Exception {
Socket s=new Socket("192.0.0.1",10000);
//定义读取键盘数据的流对象
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
  //定义目的,将数据写入到socket输出流,发给服务端。
BufferedWriter bufOut=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//定义一个socket读取流,读取服务端返回的大写信息。
BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
String line=null;
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
bufOut.write(line);
bufOut.flush();
bufOut.newLine();
String str=bufIn.readLine();
System.out.println("server:"+str);
}
bufr.close();
s.close();
}
}
 /*
  * 服务端:
  * 源:socket读取流。
  * 目的:socket输出流。
  * 都是文本,装饰
  */
class TransServer{
public static void main(String[] args)throws Exception {
ServerSocket ss=new ServerSocket(10000);
   Socket s=ss.accept();
//读取socket读取流中的数据
BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
   //目的,socket输出流,将大写数据写入到socket输出流,并发送给客户端
// BufferedWriter bufOut=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
PrintWriter out=new PrintWriter(s.getOutputStream(),true);
String line=null;
while((line=bufIn.readLine())!=null){
System.out.println(line);
/*bufOut.write(line.toUpperCase());
    bufOut.newLine();
    bufOut.flush();
*/
out.println(line.toUpperCase());
}
s.close();
ss.close();
}
}



/*
 * 需求:建立一个文本转换服务端。
 * 客户端给服务端发送文本,服务端会将文本转成大写在返回给客户端
 * 而且客户端可以不断的进行文本转换,当客户的输入over时,转换结束。
 * 分析:
 * 客户端:
 * 既然是操作设备上的数据,那么就可以使用io技术,并按照io的操作规律来思考
 * 源:键盘录入。
 * 目的:网络设备,网络输出流。
 * 而且操作的是文本转换,可以选择字节流。
 * 步骤:
 * 1.建立服务。
 * 2.获取键盘录入
 * 3.将数据发给服务端。
 * 4.后去服务端返回的大写数据。
 * 5.结束,关资源
 * 都是文本数据,可以使用字符流进行操作,同时提高效率,加入缓冲
 */
/*
 * 该例子出现的问题。
 * 现象:客户端和服务端都在莫名的等待
 * 为什么呢?
 * 因为客户端和服务端都有阻塞式方法,这些方法没有读到结束标识。那么一直等
 *而导致两端都在等待 
 */
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
 class TransClient  {
    public static void main(String[] args)throws Exception {
Socket s=new Socket("192.0.0.1",10000);
//定义读取键盘数据的流对象
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
  //定义目的,将数据写入到socket输出流,发给服务端。
BufferedWriter bufOut=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//定义一个socket读取流,读取服务端返回的大写信息。
BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
String line=null;
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
bufOut.write(line);
bufOut.flush();
bufOut.newLine();
String str=bufIn.readLine();
System.out.println("server:"+str);
}
bufr.close();
s.close();
}
}
 /*
  * 服务端:
  * 源:socket读取流。
  * 目的:socket输出流。
  * 都是文本,装饰
  */
class TransServer{
public static void main(String[] args)throws Exception {
ServerSocket ss=new ServerSocket(10000);
   Socket s=ss.accept();
//读取socket读取流中的数据
BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
   //目的,socket输出流,将大写数据写入到socket输出流,并发送给客户端
// BufferedWriter bufOut=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
PrintWriter out=new PrintWriter(s.getOutputStream(),true);
String line=null;
while((line=bufIn.readLine())!=null){
System.out.println(line);
/*bufOut.write(line.toUpperCase());
    bufOut.newLine();
    bufOut.flush();
*/
out.println(line.toUpperCase());
}
s.close();
ss.close();
}
}

/*
 * 需求:建立一个文本转换服务端。
 * 客户端给服务端发送文本,服务端会将文本转成大写在返回给客户端
 * 而且客户端可以不断的进行文本转换,当客户的输入over时,转换结束。
 * 分析:
 * 客户端:
 * 既然是操作设备上的数据,那么就可以使用io技术,并按照io的操作规律来思考
 * 源:键盘录入。
 * 目的:网络设备,网络输出流。
 * 而且操作的是文本转换,可以选择字节流。
 * 步骤:
 * 1.建立服务。
 * 2.获取键盘录入
 * 3.将数据发给服务端。
 * 4.后去服务端返回的大写数据。
 * 5.结束,关资源
 * 都是文本数据,可以使用字符流进行操作,同时提高效率,加入缓冲
 */
/*
 * 该例子出现的问题。
 * 现象:客户端和服务端都在莫名的等待
 * 为什么呢?
 * 因为客户端和服务端都有阻塞式方法,这些方法没有读到结束标识。那么一直等
 *而导致两端都在等待 
 */
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
 class TransClient  {
    public static void main(String[] args)throws Exception {
Socket s=new Socket("192.0.0.1",10000);
//定义读取键盘数据的流对象
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
  //定义目的,将数据写入到socket输出流,发给服务端。
BufferedWriter bufOut=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//定义一个socket读取流,读取服务端返回的大写信息。
BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
String line=null;
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
bufOut.write(line);
bufOut.flush();
bufOut.newLine();
String str=bufIn.readLine();
System.out.println("server:"+str);
}
bufr.close();
s.close();
}
}
 /*
  * 服务端:
  * 源:socket读取流。
  * 目的:socket输出流。
  * 都是文本,装饰
  */
class TransServer{
public static void main(String[] args)throws Exception {
ServerSocket ss=new ServerSocket(10000);
   Socket s=ss.accept();
//读取socket读取流中的数据
BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
   //目的,socket输出流,将大写数据写入到socket输出流,并发送给客户端
// BufferedWriter bufOut=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
PrintWriter out=new PrintWriter(s.getOutputStream(),true);
String line=null;
while((line=bufIn.readLine())!=null){
System.out.println(line);
/*bufOut.write(line.toUpperCase());
    bufOut.newLine();
    bufOut.flush();
*/
out.println(line.toUpperCase());
}
s.close();
ss.close();
}
}



---------------------- android培训java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值