java 网络编程(BI0)

1.协议TCP/UDP

Java网络程序有两种协议,tcp协议和udp协议。Tcp协议面向连接(三次握手)可靠的协议(基于字节流的传输层协议),但是传输速度慢。Udp提供简单不可靠的行西传输服务,不属于连接型服务,传输速度快,容易出现丢包现象。


2.SMTP简单邮件传输协议

3. ip:网络地址(确定网络)和主机地址(网络中的主机)组成

  Window下在命令行中输入ipconfig查看本机ip地址,输入ping+ 目标ip地址查看网络是否通畅。

4.url:统一资源定位符格式:[scheme:]scheme-specific-part[#fragment]

Scheme:协议http\https\ftp\file等 scheme-specific-part表示其他部分

5.Socket:(通信链路的端口,也被称为套接字)

1.基于tcp协议的socket通信

       •基于TCP协议的socket通信,用于实现双向安全的网络同行,进行通信时socket需要借助数据流来完成数据的传递工作。


       •基于TCP协议网络编程步骤:1.建立连接->打开使用socket关联的输入输出流->数据流中读写信息->关闭所有的数据流和socket (客户端和服务器之间信息传递)

•实现多个客户端和服务器的信息传递(创建服务器端线程类或者一个操作类,实现对一个请求的响应处理->循环监听请求)

客户端代码:

package lesson13;
import
java.io.*;
import
java.net.Socket;
public class
s3 {
   
public static void main(String[]args) throws IOException{
       
//创建客户端Socket,指定服务器和端口
        Socket sc=new Socket("localhost",10086);
       
//获取输出流向服务端发送信息
       
OutputStream os=sc.getOutputStream();//字节输出流
       
PrintWriter pw=new PrintWriter(os);//将输出流包装成打印流
       
pw.write("用户名:name;密码:789");
       
pw.flush();
       
sc.shutdownOutput();//关闭输出流

        //
获取输入流,并读取服务端的响应信息
        InputStream is=sc.getInputStream();
       
BufferedReader br=new BufferedReader(new InputStreamReader(is));
       
String info=null;
        while
((info=br.readLine())!=null){
            System.
out.println("我是客户端,服务器说:"+info);
       
}
       
//关闭资源
       
br.close();
       
is.close();
       
pw.close();
       
os.close();
       
sc.close();
   
}
}

服务器端代码;

package lesson13;

/*
服务器端:
① 创建ServerSocket对象,绑定监听端口
② 通过accept()方法监听客户端请求
③ 连接建立后,通过输入流读取客户端发送的请求信息
④ 通过输出流向客户端发送乡音信息
⑤ 关闭相关资源
 */

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Sket {
    public static void main(String[] args) throws IOException{
        //创建一个服务器socket,即ServerSocket,指定绑定端口,并监听此窗口
        ServerSocket ss = new ServerSocket(10086);
        //调用accept()方法开始监听,等待客户端连接
        Socket sc=ss.accept();
        //获取输入流,读取客户端信息
        InputStream is=sc.getInputStream();
        InputStreamReader isr=new InputStreamReader(is);
        BufferedReader br=new BufferedReader(isr);
        String info=null;
        while((info=br.readLine())!=null){
            System.out.println("我是服务器,客户端说:"+info);
        }
        sc.shutdownInput();//关闭输入流

        //获取输入流,获取客户端的请求
        OutputStream os=sc.getOutputStream();
        PrintWriter pw=new PrintWriter(os);
        pw.write("欢迎您!");
        pw.flush();

        //关闭资源
        pw.close();
        os.close();
        br.close();
        isr.close();
        is.close();
        sc.close();
        ss.close();
    }
}

接收多个服务器的客户端代码:

package lesson13;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * Created by jone on 2018/1/19.
 */

public class mutilsket2 {
    public static void main(String[] args) throws IOException{
        //创建一个ServerSocket,绑定端口
        ServerSocket ss=new ServerSocket(10086);
        //调用accept方法开始监听客户端连接,accept返回的是一个新的套接字
        Socket sc=null;
        int count=0;
        while(true){
            sc=ss.accept();//监听客户端连接
            operate(sc);
            count++;
            System.out.println("客户端访问数量:"+count);
        }
    }

    //处理一个请求
    public static void operate(Socket sc)throws IOException{
        //接受客户端的信息
        //获取输入输出流 getInputStream
        InputStream in=sc.getInputStream();
        //创建reader对象
        InputStreamReader isr=new InputStreamReader(in);
        //创建bufferedReader对象
        BufferedReader br=new BufferedReader(isr);
        //创建空字符串
        String info=null;
        while ((info=br.readLine())!=null){
            System.out.println("客户端数据为:"+info);
        }

        //给客户端发送信息
        //创建服务器端的输出流 getOutputStream
        OutputStream os=sc.getOutputStream();
        PrintWriter pw=new PrintWriter(os);
        pw.write("欢迎你!");
        pw.flush();
        //关闭资源
        br.close();
        isr.close();
        in.close();
        pw.close();
        os.close();
    }
}

2.基于udp协议的socket通信

•基于udp协议socket通信步骤:利用DatagramPacket对象封装数据包->利用DatagramSocket发数据包->利用DatagramSocket收数据包->利用DatagramPacket处理数据包。

客户端代码:

package lesson13;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
 2、客户端实现步骤
 ① 定义发送信息
 ② 创建DatagramPacket,包含将要发送的信息
 ③ 创建DatagramSocket
 ④ 发送数据
 */
public class Udp_kh {
    public static void main(String[] args) throws Exception{
        //定义服务器的地址、端口号、数据
        InetAddress address=InetAddress.getByName("localhost");
        int port=10010;
        byte[] data="用户名:admin;密码:123".getBytes();
        //创建数据报
        DatagramPacket pc=new DatagramPacket(data,data.length,address,port);
        DatagramSocket sc=new DatagramSocket();
        //向服务器发送报表
        sc.send(pc);

        //===================================================
        //创建数据报,用于接受服务器响应数据
        byte[] data2=new byte[1024];
        DatagramPacket pc2=new DatagramPacket(data2,data2.length);
        //接受服务器响应数据
        sc.receive(pc2);
        String reply=new String(data2,0,pc2.getLength());
        System.out.println("我是客户端,服务器说:"+reply);

        //关闭资源
        sc.close();

    }
}
服务器代码:

package lesson13;

/*
UDP协议(用户数据报协议)是无连接的、不可靠的、无序的,速度快
进行数据传输时,首先将要传输的数据定义成数据报(Datagram),大小限制在64k,在数据报中指明数据索要达到的Socket(主机地址和端口号),然后再将数据报发送出去
DatagramPacket类:表示数据报包
DatagramSocket类:进行端到端通信的类
1、服务器端实现步骤
① 创建DatagramSocket,指定端口号
② 创建DatagramPacket
③ 接受客户端发送的数据信息
④ 读取数据
 */

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class Udp {
    public static void main(String[] args) throws IOException{
        //创建服务器端DatagramSocket,指定端口
        DatagramSocket sc=new DatagramSocket(10010);
        //创建数据报,用于接受客户端发送的数据
        byte[] data=new byte[1024];
        DatagramPacket pc=new DatagramPacket(data,data.length);
        //接受客户端发送的数据
        sc.receive(pc);//此方法在接受数据报表时会阻塞
        //读取数据
        String info = new String(data,0,data.length);
        System.out.printf("我是服务器,客户端告诉我:"+ info);

        //=======================================
        //向客户端响应数据
        //定义客户端地址,端口号,数据
        InetAddress address=pc.getAddress();
        int port=pc.getPort();
        byte[] data2="欢迎您".getBytes();
        //创建数据报,包含响应的数据信息
        DatagramPacket pc2=new DatagramPacket(data2,data2.length,address,port);
        //响应客户端
        sc.send(pc2);
        //关闭资源
        sc.close();
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值