网络编程

TCP/IP
在Internet中TCP/IP协议是使用最为广泛的通讯协议。TCP/IP是英文Transmission 
Control Protocol/Internet Protocol的缩写,意思是“传输控制协议/网际协议”。

TCP/IP实际上是一组协议,它包括上百个各种功能的协议,如:远程登录、文件传输等
,而TCP协议和IP协议是保证数据完整传输的两个基本的重要协议。通常说TCP/IP是
Internet协议族,而不单单只是指TCP协议和IP协议。

TCP/IP协议的基本传输单位是数据包(datagram)。

TCP是一种面向连接的通信协议。TCP连接提供两台计算机之间的可靠无差错的字节流数
据传输。

IP地址和端口号

IP地址:网络中每台计算机的一个标识号

是一个逻辑地址

127.0.0.1 代表本机地址

端口号:具有网络功能的应用软件的标识号

端口是一个软件结构,被客户程序或服务程序用来发送和接收数据,一台服务器有
256*256个端口。

0-1023是公认端口号,即已经公认定义或为将要公认定义的软件保留的

1024-65535是并没有公共定义的端口号,用户可以自己定义这些端口的作用。

端口与协议有关:TCP和UDP的端口互不相干

IP地址使用32位长度二进制数据表示,一般在实际中看到的大部分IP地址都是以十进制
的数据形式表示的,如:192.168.1.3。

IP地址分类:

IP地址分为5类,A类保留给政府机构,B类分配给中等规模的公司,C类分配给任何需要
的人,D类用于组播,E类用于实验,各类可容纳的地址数据不同。

IP地址

NO    地址分类       地址范围
1     A类地址        1.0.0.1---126.255.255.254
2     B类地址        128.0.0.1---191.255.255.254
3     C类地址        192.0.0.1---223.255.255.254
4     D类地址        244.0.0.1---239.255.255.254
5     E类地址        240.0.0.1---255.255.255.254

在实际中可以使用127.0.0.1表示本机,或者直接使用localhost代表本机。

TCP/TP编程中,发送时,有发送类(客户端)和接受类(服务器)。

在客户端中,使用Socket进行消息的传递,Socket中带有参数(IP地址,端口号),其
中IP地址为服务器的IP地址,端口号是用户自定义的,但是端口号要在用户地址1024-
65535区域内。例如:

Socket socket = new Socket("127.0.0.1",8888)

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

bw.writer("asfsa");

bw.flush();

socket.shutdownOutput();

服务器:

在服务器定义一个接受指定端口号的对象

ServerSocket ss = new ServerSocket(8888);

再定义一个Socket类型的变量 去接受由ServerSocket接收的指定端口号的内容。

Socket socket = ss.accept();

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

String s="";

while((s=br.readLine())!=null){

        System.out.println(s)
}
UDP

面向无连接的数据传输,不可靠,但效率高。音频,视屏、、、、

UDP一次发送的数据不能超过64kb。

UDP编程时,发送和接受仅需要两个类:

DatagramSocket-此类是用来发送和接受数据报包的套接字

DatagramPacket-此类表示数据报包,当中包含所要发送的字节数组,字节数组的长度
,目标地的IP地址,及端口号。

例如:

DatagramSocket ds = new DatagramSocket(端口号);//注:此端口号是程序的端口号
,可以不写,程序会自动补上。

InetAddress ia = InerAddress.getByName("localhost");

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

//注:buf表示所要发送的字节数组,当中包含所要发送的内容信息,ia表示目标IP地
址,8888表示端口号(这个由自己定义,但是必须符合端口号的区域要求)

//发送内容
ds.send(dp);
ds.close();//这样内容就已经给目标发送过去了,这时只要再创建一个服务器,时刻
监听端口号为8888客户端就能够接收到内容了。

//服务器
DatagramSocket ds = new DatagramSocket(8888);//注:此端口号必须写,因为这是
接收指定端口号的内容。

DatagramPacket dp = new DatagramPacket(buf,buf.length);//注:服务器端的数据报
包因为要接受指定端口号闯过来的内容,所以里面仅需一个空数组。

//接收
ds.receive(dp);//注:是把内容传递到buf中。

System.out.println(new String(buf));

Servlet
Servlet生命周期:
初始化:调用init()方法
服务:调用service()方法,会根据不同的请求执行doGet() 或者 doPost()方法,我们不需要去重写service()方法。
销毁:调用destory()方法

在Servlet,无论是在doGet() 或者是 doPost()中,都应该设置响应内容类型 response.setContentType("text/html;charset=utf-8");
防止乱码:doGet()中,应该在获取值之后,更改编码,如: name = new String(name.getBytes("ISO-8859-1"),"UTF-8");(因为在doGet()中,直接写 request.setCharacterEncoding("UTF-8");是没有效果的,doPost()中可以这样写
URL:统一资源定位符
使用URL可以下载网络上的资源
URL url = new URL("地址");
HttpURLConnection
/**
 * 使用HttpURLConnection及Post,get方式发送信息
 * @author Administrator
 *
 */
public class T_PostRUL {
    public static void main(String[] args) {
        /**
         * 使用Post方式
         */
        /*try {
            //使用URL设置服务器目标
            URL url = new URL(" http://127.0.0.1:8080/T_Day28/MyServletT");//MyServlet是服务器的映射
            //把URL转换成HttpURLConnection类型
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            //设置发送类型为POST
            conn.setRequestMethod("POST");
            //设置可写
            conn.setDoOutput(true);
            //获取输出流
            OutputStream out = conn.getOutputStream();
            out.write("username=jiansong&password=123".getBytes());
            //获取输入流
            InputStream is = conn.getInputStream();
            //把输入流包装成字符流
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            //获取状态码
            int code = conn.getResponseCode();
            if(code == 200){
                String s;
                while((s = br.readLine()) != null){
                    System.out.println(s);
                }
            }else{
                System.out.println("连接服务器失败,请联系管理员");
            }
            br.close();
            is.close();
            //out.close();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }*/
        /**
         * 使用Get发送信息
         */
        try {
            URL url = new URL(" http://127.0.0.1:8080/T_Day28/MyServletT");
            HttpURLConnection conn = (HttpURLConnection)url.openConnection();
            conn.setDoOutput(true);
            OutputStream os = conn.getOutputStream();
            os.write("username=jiansong&password=123".getBytes());
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            if(conn.getResponseCode() == 200){
                String s;
                while((s = br.readLine()) != null){
                    System.out.println(s);
                }
            }
            br.close();
            os.close();
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}
/**
*
*服务器
*/
public class MyServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public MyServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        String name = request.getParameter("username");
        String pwd = request.getParameter("password");

        name = new String(name.getBytes("ISO-8859-1"),"UTF-8");
        pwd = new String(pwd.getBytes("ISO-8859-1"),"UTF-8");

        response.setContentType("text/html;charset=utf-8");
        PrintWriter pw = response.getWriter();
        String sql = "insert into register values('"+name+"','"+pwd+"')";
        try {
            Class.forName("org.sqlite.JDBC");
            Connection conn = DriverManager.getConnection("jdbc:sqlite:e:\\test\\info.db");
            PreparedStatement pstmt  = conn.prepareStatement(sql);
            int result = pstmt.executeUpdate();
            if(result > 0){
                pw.print("注册成功");
            }else{
                pw.print("注册失败");
            }
            pstmt.close();
            conn.close();
            pw.close();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        request.setCharacterEncoding("UTF-8");
        String name =  request.getParameter("username");
        String pwd = request.getParameter("password");
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        try {
            Class.forName("org.sqlite.JDBC");
            Connection conn = DriverManager.getConnection("jdbc:sqlite:e:\\test\\info.db");
            System.out.println("------------");
            String sql = "insert into register values('"+name+"','"+pwd+"')";
            PreparedStatement pstmt = conn.prepareStatement(sql);
            int result = pstmt.executeUpdate();
            System.out.println(sql+"-------");
            if(result > 0){
                out.print("注册成功");
            }else{
                out.print("注册失败");
            }
            pstmt.close();
            conn.close();
            out.close();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}
HttpClient--不是JDK自带,需要导入JAR包
public class T_HttpClient {

    public static void main(String[] args) {
        /**
         * GET下载图片
         */
        /*//先创建客户端
        HttpClient client = new DefaultHttpClient();
        //创建发送方式
        HttpGet get = new HttpGet(" http://127.0.0.1:8080/T_Day28/pic/a.jpg");
        try {
            HttpResponse response = client.execute(get);
            int code = response.getStatusLine().getStatusCode();
            HttpEntity entity = response.getEntity();
            if(code == 200){
                FileOutputStream fos = new FileOutputStream("e://test//ttt.jpg");
                InputStream is = entity.getContent();
                int len;
                while((len = is.read()) != -1){
                    fos.write(len);
                }
                fos.write(EntityUtils.toByteArray(entity));
                System.out.println("下载成功");
            //    is.close();
                fos.close();
            }

        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }*/
        /**
         * POST上传信息
         */
        HttpClient client = new DefaultHttpClient();
        //因为是上传信息给服务器,所以要加服务类的映射
        HttpPost  post = new HttpPost(" http://127.0.0.1:8080/T_Day28/MyServletT");
        //创建参数
        NameValuePair nvp1 = new BasicNameValuePair("username","pjs");
        NameValuePair nvp2 = new BasicNameValuePair("password","123");
        //创建List集合
        List<NameValuePair> list = new ArrayList<>();
        //把参数加入到集合中
        list.add(nvp1);
        list.add(nvp2);
        try {
            //把List以UTF-8的编码格式放到HttpEntity中
            HttpEntity entity = new UrlEncodedFormEntity(list,"UTF-8");
            //把entity加到post中去
            post.setEntity(entity);
            //执行post
            HttpResponse response = client.execute(post);
            //获取状态码
            int code = response.getStatusLine().getStatusCode();
            if(code ==200){
                HttpEntity en = response.getEntity();//获取到的内容都在en中
                System.out.println(EntityUtils.toString(en));
            }
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

你可能感兴趣的:(Java网络编程套接字)