Java -------------------------网络编程

目录

一,IP和端口号

 二,Socket套接字

三,客户端服务器端代码实例


网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。

java.net 包中 J2SE 的 API 包含有类和接口,它们提供低层次的通信细节。你可以直接使用这些类

和接口,来专注于解决问题,而不用关注通信细节。

java.net 包中提供了两种常见的网络协议的支持:

  • TCP:(英语:Transmission Control Protocol,传输控制协议) 是一种面向连接的、可靠的、基于字节流的传输层通信协议,TCP 层是位于 IP 层之上,应用层之下的中间层。TCP 保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称 TCP / IP。

  • UDP:(英语:User Datagram Protocol,用户数据报协议),位于 OSI 模型的传输层。一个无连接的协议。提供了应用程序之间要发送数据的数据报。由于UDP缺乏可靠性且属于无连接协议,所以应用程序通常必须容许一些丢失、错误或重复的数据包。

一,IP和端口号

IP唯一的标识Internet上的计算机
* IP分类:IPV4 和IPV6 :万维网 , 局域网
* 在Java使用InetAddress类代表IP
如何实例化InetAddress:两个方法:getByName(string host) , getLocalhost()
两个常用方法:getHostName() , getHostAddress()

* 域名:www.baidu.com
* 本地回路地址:127.0.0.1或ipconfig
  端口号:正在计算机上运行的进程
* 要求:不同进程有不同端口号
* 范围:被规定为一个16位的一个整数0-65535

 二,Socket套接字

端口号与IP地址的组合得到一个网络套接字 Socket

套接字使用TCP提供了两台计算机之间的通信机制。 客户端程序创建一个套接字,并尝试连接服

务器的套接字。

当连接建立时,服务器会创建一个 Socket 对象。客户端和服务器现在可以通过对 Socket 对象的

写入和读取来进行通信。

java.net.Socket 类代表一个套接字,并且 java.net.ServerSocket 类为服务器程序提供了一种来监

听客户端,并与他们建立连接的机制。

以下步骤在两台计算机之间使用套接字建立TCP连接时会出现:

  • 服务器实例化一个 ServerSocket 对象,表示通过服务器上的端口通信。

  • 服务器调用 ServerSocket 类的 accept() 方法,该方法将一直等待,直到客户端连接到服务器上给定的端口。

  • 服务器正在等待时,一个客户端实例化一个 Socket 对象,指定服务器名称和端口号来请求连接。

  • Socket 类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客

  • 户端创建一个 Socket 对象能够与服务器进行通信。

  • 在服务器端,accept() 方法返回服务器上一个新的 socket 引用,该 socket 连接到客户端的

  • socket。

连接建立后,通过使用 I/O 流在进行通信,每一个socket都有一个输出流和一个输入流,客户端的

输出流连接到服务器端的输入流,而客户端的输入流连接到服务器端的输出流。

三,客户端服务器端代码实例

 服务端:

package com.bdqn.lianxi.wangluobiancheng;

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

public class F {

    public static void main(String[] args) {
        Socket socket = null;
        InputStream is = null;
        OutputStream os = null;
        BufferedReader br = null;
        try {
            ServerSocket serverSocket = new ServerSocket(8800);
            socket = serverSocket.accept();
            is = socket.getInputStream();
            os = socket.getOutputStream();


           ObjectInputStream in = new ObjectInputStream(is);
            XinXi xinXi = (XinXi)in.readObject();
            if (!(xinXi == null)){
                System.out.println("我是服务器客户登录的信息为:" + xinXi.getName() + "," + xinXi.getPwd());
            }



//            br = new BufferedReader(new InputStreamReader(is));
//            String info = null;
//            while (!((info = br.readLine()) == null)){
//                System.out.println("我是服务器,客户登录信息为" + info);
//            }
            String reply = "登陆成功";
            os.write(reply.getBytes());
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }



    }

}

 客户端:

package com.bdqn.lianxi.wangluobiancheng;

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

public class K {
    public static void main(String[] args) {
        Socket socket = null;
        OutputStream os = null;
        InputStream is = null;
        try {
            socket = new Socket("localhost", 8800);

            os = socket.getOutputStream();
            is = socket.getInputStream();


            ObjectOutputStream oss = new ObjectOutputStream(os);
            XinXi xinXi = new XinXi();
            xinXi.setName("tom");
            xinXi.setPwd("123456");
            oss.writeObject(xinXi);


//            String info =  "用户名:Tom;密码:123456";
//            os.write(info.getBytes());
            socket.shutdownOutput();
            String reply = null;
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            while (!((reply = br.readLine()) == null)) {
                System.out.println("我是客户端,服务器的响应为" + reply);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {

            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


    }


}

 客户信息类:

package com.bdqn.lianxi.wangluobiancheng;

import java.io.Serializable;

public class XinXi implements Serializable {

    public static final long serialVersionUID = 4567576L;

    private String name;

    private String pwd;

    public XinXi() {
    }

    public XinXi(String name, String pwd) {
        this.name = name;
        this.pwd = pwd;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值