网络通信

前言

所有的通信都是基于IP和端口的

在java中使用UDP和TCP协议编写通信程序

1.客户端:首先发起连接的叫做客户端,相当于电话中的主叫
2.服务端:等待被连接的叫做服务端,相当于电话中的被叫
3.当连接建立好之后,客户端和服务端是平等的
4.Java中有两个类是专门用来实现TCP的网络编程
ServerSocket 服务端套接字
Socket 客户端套接字
5.Java中有三个类是专门用来实现UDP的网络编程
InetSocketAddress 网络地址(发送方地址,接收方地址)
DatagramSocket UDP套接字(快递员)
DatagramPacket UDP数据报(包裹)
6.在网络编程中,数据的交互也是通过IO来完成的
InputStream 输入流
OutputStream 输出流
7.所有的输入和输出是相对于内存而言的
8.Socket就是两台设备之间的通信管道,所有的数据流都是基于Socket的

TCP

传输控制协议,面向连接的,可靠的,消耗较多的网络资源。
面向连接:在通信之前,设备之间一定要建立一个逻辑上的连接,所有的数据传输必须基于这个连接
可靠性:在数据传输的过程中,会不断的检测数据的正确性;三次握手:重传机制,顺序检测机制,超时处理机制;四次挥手
类似于打电话

客户端

首先发起连接的叫做客户端

1.编写客户端,创建一个客户端套接字对象
如果能创建成功,说明已经连接上

Socket socket = new Socket(服务器IP,服务器端口);

2.在客户端通过Socket来获得数据输出流,用来向服务端发送数据

//创建控制台输入的对象
  Scanner sc = new Scanner(System.in);
  while(true) {
   //获得控制台输入的字符串
   String str = sc.nextLine();
   //补上结束符
   String msg = str+'\n';
   //将字符串转成字节数组
   byte bs[] = msg.getBytes();
   //将字节数组通过输出流写出去
   ops.write(bs);
   //刷新数据,保证数据一定到达对方
   ops.flush();

服务端

等待被连接的叫做服务端

1.编写服务端,创建服务端套接字对象

ServerSocket server = new ServerSocket(10086);

2.服务端等待并接受客户端的连接

Socket socket  = server.accept(); 

3.在服务端通过Socket来获得输入流,用来接收客户端发来的数据

while(true) {
   //定义一个字节数据,用来存放接受到的数据
   byte bs[] = new byte[100];
   //开始一个字节一个字节的接受数据,直到接受到\n
   int t='\n';
   int index=0;
   do{
    t = ips.read();
    //每读取到一个字节,就将该字节放到数组中
    bs[index++] = (byte)t;
   }while(t!='\n');
   
   //将字节数组中存放了数据的部分转换成字符串
   String str = new String(bs,0,index);
   System.out.print("服务端收到:"+str);
  }

UDP

用户数据报协议,无连接的,不可靠的,相对TCP来说,消耗的资源较少
无连接的:在发送数据的时候不需要检测是否能找到对方
不可靠的:发送数据之后,对方是否能收到数据是未知的,不会进行数据检测
类似于发短信

客户端

//服务端的ip和端口(收件人)
  InetSocketAddress server=new InetSocketAddress("127.0.0.1", 10086);
  
  //客户端的地址(寄件人)
  InetSocketAddress client=new InetSocketAddress(10001);
  
  //UDP套接字对象(快递员),绑定发送方地址
  DatagramSocket socket=new DatagramSocket(client);
  
  //要发送的数据先转换成字节数组再传
  String msg="Hello World";
  byte buf[]=msg.getBytes();
  //UDP数据包对象(包裹) ,包裹中要包含要发送的数据和接收方地址
  DatagramPacket packet=new DatagramPacket(buf, 0,buf.length,server);
  
  
  //发送数据(快递员发送包裹)
  socket.send(packet);
  
  System.out.println("客户端发送完毕!!!");

服务端

//接收方的地址(收件人)
InetSocketAddress server=new InetSocketAddress(10086);
//UDP套接字(快递员)
  DatagramSocket socket=new DatagramSocket(server);
  //创建一个空的数据报对象,用来缓存接收到的数据
  byte buf[]=new byte[1024];
  DatagramPacket packet=new DatagramPacket(buf, 0,buf.length);
  //开始接收数据,将接受的数据要缓存到一个UDP数据报中
  socket.receive(packet);
  //从接收完数据之后,从packet中提取数据
  byte bs[]=packet.getData();
  int start=packet.getOffset();
  int len=packet.getLength();
  //根据以上三个数据来封装一个字符串
  String str=new String(bs,start,len);
  
  System.out.println("服务器收到: "+str);
  
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值