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

                                                  关于Java中的网络编程
                 --------- android培训java培训、java学习型技术博客、期待与您交流! ------------

============================
1. IP地址
  IP地址,就是每一个接入互联网的主机的唯一身份标识,IP地址
  0-255组成的,分成了4段,每段0-255
  IP地址分类:ABCDE
  局域网:192.168开头
  本地回环地址:127.0.0.1 每一个电脑,网卡正常工作,主机的IP就是127.0.0.1
  IP地址这个事物也是对象,对IP地址对象的描述类
  java.net.InetAddress
  私有构造方法,静态方法返回本类对象的
  static InetAddress getLocalHost() 获取本地主机IP地址对象
  这个方法在哪个机器上运行,那个机器就是本地主机
 
  InetAddress类中的两个方法 getHostAddress()通过IP地址对象,获取IP地址
  InetAddress类中的两个方法 getHostName()通过IP地址对象,获取主机名
  如果获取一台主机的IP或者主机名,必须先获取到一台主机的IP对象(InetAddress)
  获取远程主机IP地址对象
  static InetAddress getByName(String host) 参数,传递主机名,传递IP地址
/*
 * 获取本地主机IP地址对象
 * InetAddress类的静态方法 getLocalHost
 */
import java.net.*;
public class InetAddressDemo {
 public static void main(String[] args)throws UnknownHostException {
  InetAddress i = InetAddress.getLocalHost();
  System.out.println(i);//机器名/IP地址
  //获取主机名
  String name = i.getHostName();
  //获取IP地址
  String ip = i.getHostAddress();
  System.out.println(name+"..."+ip);
 }
}

 //===================================================
2. 端口号
  操作系统的一个数字物理标识
  看成是进入或者出去操作系统的一个门牌号
  我邮寄一个包裹 昌平建材城西路100号
  收件:大兴黄村北路200号
  端口号 0-1024操作系统保留号
  最大65535
  常见端口号:
    80 http访问互联网的默认端口号
    http://www.baidu.com:80
    21 FTP数据传输端口号
    8080 Javaweb服务器默认端口号
    3306 MySQL数据的连接端口号
    1521 Oracle数据库连接端口号
    1433 MS SQLServer数据库连接端口号
//===================================================
3. 传输协议
  发送,接受两个方面约定好的内容
  两个人打电话,相约晚上11点-11点30分可以通话,语音采用中文
  UDP -- 面向无连接协议
  通信双方不需要连接
  不需要连接,不可靠,丢数据
  连接效率很高
  不允许传输大数据,限制在64KB以内
  TCP -- 面向连接协议
  通信双方需要建立连接,三次握手,效率底下
  连接,安全可靠协议,不丢失数据
  适合于大数据传输
//===================================================
4. Socket服务
 Socket就是为网络服务提供的一种机制
 通信的两端都有Socket
 提供接收和发送功能的
 写功能的时候,接收还是发送的,必须有Socket服务
 UDP的传输
  分为发送端和接收端
  发送端:
    A 发送的数据封包 -- 封装数据包的类,DatagramPacket
    B 将封装好的数据包,交给Socket进行发送 -- DategramSocket
    C 关闭资源
  接收端:
    A. 接收数据包,Socket接收
    B. 拆包
    C. 拆包后的信息,显示出来
    D. 关闭资源
 
  DategramPacket数据包:
    构造方法DatagramPacket(byte[] buf, int length, InetAddress address, int port)
                              字节数据 长度 IP地址 端口号
    构造方法DatagramPacket(byte[] buf, int length) 接收
    int getLength() 接收数据包中,数组的有效个数
    int getPort()获取发送端口号
    InetAddress getAddress()返回发送端的IP地址对象
 
 DatagramSocket发送包,接收包
   构造方法,发送时候空参数的
   发送方法,send(数据包)
   构造DatagramSocket(int port) 接收,传递端口号
   接收的方法 receive(数据包)

/*
 * UDP发送端
 */
import java.net.*;
import java.util.Scanner;
public class UDPSend {
 public static void main(String[] args) throws Exception{
  new Scanner(System.in).nextLine();
  //将数据封装到数据包 DategramPacket
  byte[] bytes = "你好UDP".getBytes();
  DatagramPacket dp = new
    DatagramPacket(bytes, bytes.length, InetAddress.getByName("127.0.0.1"),10000);
  //创建投递服务的Socket对象,DatagramSocket
  DatagramSocket ds = new DatagramSocket(8000);
  //将数据包,交给Socket发送
  ds.send(dp);
  //关闭资源
  ds.close();
 }
}


/*
 * UDP的接收端
 */
import java.net.*;
public class UDPReceive {
 public static void main(String[] args) throws Exception{
  //创建投递服务的Socket对象
  DatagramSocket ds = new DatagramSocket(10000);
  //定义数据包,接收
  byte[] bytes = new byte[10];
  DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
  //Socket接收数据包
  ds.receive(dp);
  //获取数组中的有效个数
  int length = dp.getLength();
  //获取端口号
  int port = dp.getPort();
  //获取发送端的IP地址对象
  InetAddress i = dp.getAddress();
  String ip = i.getHostAddress();
  //输出全部的信息
  System.out.println(new String(bytes,0,length)+"..."+ip+"..."+port);
  //关闭资源
  ds.close();
 
 }
}

//===================================================
5. TCP
  客户端和服务器
  建立连接,客户端必须连接服务器,否则程序无法运行
  客户端的Socket服务,Socket
  服务器端的Socket服务,ServerSocket
  Socket类构造方法 Socket(String host, int port)
  构造方法,一旦执行,就会去连接服务器,如果没有服务器,抛出异常
   OutputStream getOutputStream() 通过Socket对象获取字节输出流
   InputStream getInputStream()通过Socket对象获取字节输入流
 
 ServerSocket类构造方法ServerSocket(int port)
 Socket accept()获取客户端的连接对象,这个方法告诉服务器,是哪一个客户端连接的
 客户端通过自己Socket获取字节输出流,向服务器发送数据
 服务器通过客户端连接对象Socket获取字节输入流,读取客户端发送的数据
 服务器通过客户端连接对象Socket获取字节输出流,向客户端发送数据
 客户端通过字节的Socket对象获取字节输入流,读取服务器发回的数据


 /*
 * TCP的客户端
 */
import java.io.*;
import java.net.*;
public class TCPClient {
 public static void main(String[] args)throws Exception {
  //创建客户端的Socket对象
  Socket s = new Socket("127.0.0.1",10000);
  //将数据传输到服务器,字节输出流
  OutputStream out = s.getOutputStream();
  //写,字节数组
  out.write("你好TCP".getBytes());
 
  //客户端获取服务器发回的信息,字节输入流
  InputStream in = s.getInputStream();
  byte[] bytes = new byte[10];
  int len = 0 ;
  len = in.read(bytes);
  System.out.println(new String(bytes,0,len));
  //关闭资源
  s.close();
 }
}



/*
 * TCP服务器
 */
import java.io.*;
import java.net.*;
public class TCPServer {
 public static void main(String[] args) throws Exception{
  //创建服务器的Socket服务
  ServerSocket ss = new ServerSocket(10000);
  //知道是哪个客户端连接的
  Socket s = ss.accept();//线程等,等着客户端连接
  //有了客户端对象Socket,完全可以使用客户端连接对象,获取IO流
  //获取字节输入流
  InputStream in = s.getInputStream();
  byte[] bytes = new byte[10];
  int len = 0 ;
  len = in.read(bytes);
  System.out.println(new String(bytes,0,len));
 
  //服务器回客户端一个信息,谢谢收到了
  OutputStream out = s.getOutputStream();
  out.write("谢谢收到了".getBytes());
  s.close();
  ss.close();
 }
}
//===================================================
6. TCP的案例
 键盘录入字母,发送给服务器,服务器转成大写字母,回传客户端,客户端读取服务器发回的大写字母
 通过案例暴露很多问题
   A. 键盘读取 OK
   B. 读取到的键盘,发出去没有,OK
   C. 服务器收到了吗,服务器收到了 readLine()方法线程阻塞,等着读 OK
   D. 服务器大写数据发回了吗 OK
   E. 客户端读取到了 OK

/*
 * 转成大写客户端
 */
import java.io.*;
import java.net.*;
public class TCPClientToUpperCase {
 public static void main(String[] args) throws Exception{
  //建立Socket服务
  Socket s = new Socket("127.0.0.1",10000);
  //读取键盘输入
  BufferedReader bfr = new
    BufferedReader(new InputStreamReader(System.in));
 
  //建立字节流对象,转成字符流,读取服务器发回的大写字母
  BufferedReader bfrin =
    new BufferedReader(new InputStreamReader(s.getInputStream()));
 
  //向服务器发送数据,采用打印流
  PrintWriter out = new PrintWriter(s.getOutputStream(),true);
  String line = null;
  while((line = bfr.readLine())!=null){
   if("over".equals(line))break;
   out.println(line);
   //将数据打印到服务器,读取服务器回来的大写
   String server = bfrin.readLine();
   System.out.println("大写字母是::"+server);
  }
  bfr.close();
  s.close();
 }
}

/*
 * 转换大写服务器
 */
import java.io.*;
import java.net.*;
public class TCPServerToUpperCase {
 public static void main(String[] args) throws Exception{
  //建立服务器Socket,获取客户端连接对象
  ServerSocket ss = new ServerSocket(10000);
  Socket s = ss.accept();
  //读取客户端的小写字母,都是文本,按行读
  BufferedReader bfrin = new
    BufferedReader(new InputStreamReader(s.getInputStream()));
 
  //创建打印流对象,将大写数据,写回客户端
  PrintWriter out = new PrintWriter(s.getOutputStream(),true);
 
  String line = null;
  while((line = bfrin.readLine())!=null){
   if("over".equals(line))
    break;
    out.println(line.toUpperCase());
  }
  s.close();
  ss.close();
 }
}



//===================================================
7. TCP文本上传
 将C盘上的源文件,通过TCP服务器传递到D盘upload目录中
 
 客户端
   IO读取文本文件
   打印流,将文本打印到服务器
   读取上传成功四个字
 服务器
   读取客户端的文本文件,保存到目的中(D盘)
   将上传成功四个字,会给客户端
 
 服务器停不下来
 服务器读取的是Socket中的字节流null;
 客户端,和服务器之间,约定一个结束标记
 java工程师们很善良,定义好了结束标记
 Socket类中的方法 void shutdownOutput()

/*
 * TCP文本上传客户端
 */
import java.io.*;
import java.net.*;
public class TCPCilentUpLoad {
 public static void main(String[] args) throws Exception{
  Socket s = new Socket("127.0.0.1", 10000);
  //字符流,读取文本文件
  BufferedReader bfr = new BufferedReader(new FileReader("c:\\1.txt"));
  //将文本使用打印流,打印到服务器
  PrintWriter out = new PrintWriter(s.getOutputStream(),true);
  String line = null;
  while((line=bfr.readLine())!=null){
   out.println(line);
  }
  //out.println("*&^%$#@@#$TRJHGFD&%^$#@");
  s.shutdownOutput();
  //读取服务器的上传成功
  InputStream in = s.getInputStream();
  byte[] bytes = new byte[10];
  int len = in.read(bytes);
  System.out.println("服务器说::"+new String(bytes,0,len));
  bfr.close();
  s.close();
 }
}



*
 * 文本上传服务器
 */
import java.io.*;
import java.net.*;
import java.util.*;
public class TCPServerUpLoad {
 public static void main(String[] args)throws Exception {
  ServerSocket ss = new ServerSocket(10000);
  Socket s = ss.accept();
  //读取客户端的数据,转换流
  BufferedReader bfrin = new
    BufferedReader(new InputStreamReader(s.getInputStream()));
  //将目的封装成File对象
  File file = new File("d:\\upload");
  if(!file.exists())
   file.mkdirs();
  //封装数据目的,使用打印流
  //对上传的文件名修改
  String filename = "itcast"+System.currentTimeMillis()+new Random().nextInt(999999999)+".txt";
  PrintWriter pw = new PrintWriter(new FileWriter(file+File.separator+filename),true);
  String line = null;
  while((line = bfrin.readLine())!=null){
   pw.println(line);
  }
  //上传成功写回客户端
 
  OutputStream out = s.getOutputStream();
  out.write("上传成功".getBytes());
  pw.close();
  s.close();
  ss.close();
 }
}

//===================================================
                       ---------  android培训 java培训 、java学习型技术博客、期待与您交流! ------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值