2023.03.20 网络编程的例子

网络编程
  1.网络基础
      局域网  城域网   广域网

  2.网络通信的要素
    IP地址和端口号

    java.net.InetAddress   这个类代表一个互联网协议(IP)地址。
3.InetAddress类
  没有构造方法   -->  public static InetAddress getLocalHost()
   getHostName() 
   获取此IP地址的主机名
   getHostAddress() 
   返回文本表示中的IP地址字符串。

4.  TCP 和 UDP
   java.net Class Socket  客户端套接字   

   java.net Class ServerSocket服务器套接字

   java.net Class DatagramSocket  发送和接收数据包

   java.net Class DatagramPacket  这类表示一个数据报包

     

第一个例子模拟服务器和客户端的连接

public class LoginServer {
    public static void main(String[] args) {
        //建立服务器socket,端口号给9999;
        ServerSocket serverSocket=null;
        try {
            serverSocket=new ServerSocket(9999);
            //等待用户进行通信
            Socket socket=serverSocket.accept();
            //创建输入,输出流
            InputStream is=socket.getInputStream();
            OutputStream os=socket.getOutputStream();
            //缓存
            BufferedReader br=new BufferedReader(new InputStreamReader(is));
            String info =null;
            if((info=br.readLine())!=null){
                System.out.println("我是服务器,客户端发送的信息为:"+info);
            }
            String reply="我是服务器,恭喜你连接到服务器了";
            os.write(reply.getBytes());
            br.close();
            os.close();
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(serverSocket!=null) {
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
}}}}
public class LoginClient {
    public static void main(String[] args) {
        Socket socket=null;
        try {
            socket=new Socket("localhost",9999);
            InputStream is =socket.getInputStream();
            OutputStream os =socket.getOutputStream();
            String info="我是客户端,我的用户名是wwh,密码admin";
            os.write(info.getBytes());
            socket.shutdownOutput();
            String reply=null;
            BufferedReader br=new BufferedReader(new InputStreamReader(is));
            if((reply=br.readLine())!=null){
                System.out.println("我是客户端,服务器的响应为"+reply);
            }
            br.close();
            os.close();
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(socket!=null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }}}}}

总结:先去运行服务端类,服务端创建服务端的对象,也就是ServerSocket,并且要在这里把端口号给了,然后创建Socket对象,并且让服务器对象等待accept。然后创建socket的输出和输入流get。服务器接受客户端发送的东西,用缓存------BufferedReader,然后就readline,输出接收的东西。当你接收到客户端的信息了,你要给出反馈信息的,定义reply,直接进行写入流,然后关流。

接下来是客户端了,首先你要和客服端的端口一致。创建输入和输出流。客户先给服务器发送消息,执行写入操作,必须用一个方法将写入关闭socket.shutdownOutput();否则无法得到想要的结果。同样的方法去接收服务器反馈的结果。然后关流。

第二个例子,两个客户端级别的连接

public class Receive {
    public static void main(String[] args) {
        //定义数据包
        DatagramPacket dp=null;
        //接受和发送数据
        DatagramSocket ds=null;
        //定义数据包
        DatagramPacket dpno=null;
        byte[] bytes=new byte[1024];
        try {
            //创建数据包套接字,绑定端口
            ds=new DatagramSocket(9988);
            dp=new DatagramPacket(bytes, bytes.length);
            ds.receive(dp);
            String rece=new String(dp.getData(),0, dp.getLength());
            System.out.println("他给你发消息是:"+rece);
            String reply="麻烦您等一下";
            System.out.println("接收端回答:"+reply);
            //没有协议附件的套接字地址的对象
            SocketAddress sa=dp.getSocketAddress();
            dpno=new DatagramPacket(reply.getBytes(),reply.getBytes().length,sa);
            ds.send(dpno);
            ds.close();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }}}
public class Send {
    public static void main(String[] args) {
        InetAddress ia = null;
        DatagramSocket socket = null;
        DatagramPacket dp=null;
        String msg="您好,我有一个问题要咨询";
        System.out.println(msg);
        try {
            ia=InetAddress.getByName("localhost");
            dp=new DatagramPacket(msg.getBytes(),msg.getBytes().length,ia,9988);
            socket=new DatagramSocket();
            socket.send(dp);
            byte[] bytes=new byte[1024];
            DatagramPacket dpno=new DatagramPacket(bytes, bytes.length);
            socket.receive(dpno);
            //这里的reply的回复,是接收Receive通过他的dpno来完成的数据包。
            String reply=new String(dpno.getData(),0, dpno.getLength());
            System.out.println(dpno.getAddress().getAddress()+"说"+reply);
            socket.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }}}

总结:一个客户端Receive被动,他接收Send的消息,并且回复他,所以用两个数据包,一个接收send发的消息,一个用来输出自己的答复,永远都是DatagramSocket的对象去用receive和send方法去接收和发送数据包,接收的时候并没有返回值,创建接收数据包对象的时候必须给一个byte数组和长度,使用String receive=new String(datagramPacket.getData(),0, dp.getLength())来得到返回内容;然后创建没有协议附件的套接字地址的对象,然后实例化用来发送的数据包,然后使用send方法反馈。

另外一个客户端send主动,主动发送消息,并且接收receive的回答。这里的端口要和receive的端口号保持一致InetAddress ia=InetAddress.getByName("localhost");

DatagramPacket dp=new DatagramPacket(msg.getBytes(),msg.getBytes().length,ia,9988);

接着就还是创建Socket的对象使用send发送这个数据包。接着同样的方法去创建一个dpno去接收receive的数据。

结束。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值