Java网络编程之UDP通信与TCP通信交互代码实现

​import java.net.InetAddress;
import java.io.IOException;
class Main {
    public static void main(String[] args) {
        try {
InetAddress localAddress = InetAddress.getLocalHost();
//获得本地主机
InetAddress remoteAddress =
 InetAddress.getByName("www.itcast.cn");//由主机名获得IP地址
System.out.println("本机主机名"+localAddress.getHostName()+
"本机IP地址: " + localAddress.getHostAddress() +
 ",www.itcast.cn的IP地址: " + remoteAddress.getHostAddress() 
 + ",3秒是否可以到达主机名为www.itcast的IP地址: " +
  remoteAddress.isReachable(3000));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

e8d3161de517093c1a8f96ea332ea456.png

URL编程

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Scanner;
class Main {
    public static void main(String[] args) {
        try {
            URL url=new URL(https://www.baidu.com");// 注意URL地址需要包含协议部分            
            InputStream input = url.openStream(); // 注意正确的方法为openStream(),
            //openStream()方法会抛出IOException,类型为InputStream
            Scanner scan = new Scanner(input);//实例化Scanner对象
            scan.useDelimiter("\n");//读取分隔符
            while (scan.hasNext()) {
                System.out.println(scan.next());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

如下所示,读取了网页HTML文件。将其复制然后加到新建的HTML文档,运行可见网页。

 

86cdd2b190446665d22955ac7351868e.png

 

fba3ed3751f6ad7ab9ab4216652dd03f.png

 

TCP通信

ServerSocket服务器端,用于连接客户端请求。

Socket客户端,向服务器发出连接请求。

1对1的TCP通信

服务器端程序

import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
    public static void main(String[] args) {
        Socket client = null;
        OutputStream os = null;//输出流对象声明
        try {
            ServerSocket serverSocket = new ServerSocket(7788);//创建端口号为7788的SerSocket对象
            System.out.println("等待建立连接");
            client = serverSocket.accept();//服务端等待客户端连接
            os = client.getOutputStream();//获得客户端输出流
            System.out.println("开始连接");
            os.write("北京欢迎你".getBytes());//使用输出流输出数据
            Thread.sleep(5000);//线程休眠一段时间
            System.out.println("结束通信");
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        } finally {
            try {
                if (os != null) {
                    os.close();
                }
                if (client != null) {
                    client.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 

 

c93d5740501bacafb516c1f7aecbbcc9.png

 

客户端

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
​
class Main{
    public static void main(String[] args) throws  Exception{
        Socket client = null;//声明客户端对象
        BufferedReader buf = null;//声明BufferedReadered对象,用于接收信息
        try {
            client = new Socket("BF-201911291316",7788);//以指定主机名与端口号创建对象
            buf = new BufferedReader(new InputStreamReader(client.getInputStream()));//创建一个BufferedReader对象用于接收客户端输入流信息
            String str = buf.readLine();//读取该信息
            System.out.println("服务器输出内容:" + str);//输出
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (buf != null) {
                    buf.close();//关闭输入流
                }
                if (client != null) {
                    client.close();//关闭Socket对象
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
 

 

3571043ec8951505edf12b3eca3c1254.png

 

执行程序时,先启动服务器端,再启动客户端

多线程TCP网络程序

服务器端允许多个客户端程序同时访问

(1)TCPClient客户端程序1

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
​
public class TCPClient {
    public static void main(String[] args) throws  Exception{
​
        Socket client = null;
        BufferedReader buf = null;
        try {
            client = new Socket("BF-201911291316",7798);//客户端指派主机名和端口号
            buf = new BufferedReader(new InputStreamReader(client.getInputStream()));
            String str = buf.readLine();
            System.out.println("服务器输出内容:" + str);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (buf != null) {
                    buf.close();
                }
                if (client != null) {
                    client.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 

(2)Client客户端程序2

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
​
public class Client {
    public static void main(String[] args) throws  Exception{
​
        Socket client = null;
        BufferedReader buf = null;
        try {
            client = new Socket("BF-201911291316",7798);
            buf = new BufferedReader(new InputStreamReader(client.getInputStream()));
            String str = buf.readLine();
            System.out.println("服务器输出内容:" + str);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (buf != null) {
                    buf.close();
                }
                if (client != null) {
                    client.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 

TCPserver服务端程序

import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
        public static void main(String[] args) {
            try (ServerSocket serverSocket = new ServerSocket(7798)) {
                while (true) {
                    Socket client;
                    try {
                        client = serverSocket.accept();
                        int port = client.getPort();
                        System.out.println("与端口号为" + port + "的客户端连接成功");
​
                        new Thread(() -> {
                            try (OutputStream os = client.getOutputStream()) {
                                System.out.println("开始交换数据");
                                os.write("北京欢迎你".getBytes());
                                Thread.sleep(5000);
                                System.out.println("交换数据结束");
                            } catch (IOException | InterruptedException e) {
                                e.printStackTrace();
                            } finally {
                                try {
                                    if (client != null && !client.isClosed()) {
                                        client.close();
                                    }
                                } catch (IOException ex) {
                                    ex.printStackTrace();
                                }
                            }
                        }).start();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
​

 

依次启动三个程序,可以看到两个客户端与服务器端交互情况。

 

fe2e2592e28de091984d2d95cde8926d.png

 

dacff7377c512589d380c70f66c89e51.png

 

f74f9ae76794c7b5e91465f8d4e2a941.png

 

UDP通信

(1)DatagramPacket类,即数据报对象,包含数据以及数据报长度,IP地址和端口号等信息。接收端用一个字符数组作为参数存储接收的信息,发送端不但要存放发送信息的字符数组,还要指明端口号和IP地址。

(2)DatagramSocket类,用于发送主机中建立数据报通信方式。

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
​
public class Receiver {
    public static void main(String[] args) {
        try {
            byte[] buffer = new byte[1024];
            DatagramSocket ds = new DatagramSocket(8954);
            DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
            System.out.println("等待接收数据");
          try{ 
           ds.receive(dp);}
          catch(IOException e){
              System.out.println(e);
          }
            String S = new String(dp.getData(), 0, dp.getLength()) + "from" + dp.getAddress().getHostAddress() + ":"
                    + dp.getPort();
            System.out.println(S);
            ds.close();
        }
        catch (     SocketException e) {
            e.printStackTrace();
        }
    }
}
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
​
public class Sender {
    public static void main(String[] args) {
        try {
            DatagramSocket ds = new DatagramSocket(3000);
​
            String S = "hello world";
            byte[] b = S.getBytes();
            DatagramPacket dp = new DatagramPacket(b, b.length, InetAddress.getByName("BF-201911291316"), 8954);
            System.out.println("发送信息");
            ds.send(dp);
            ds.close();
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

 

7d120cf5012e1d192998d0e5faa9a1f9.png

 

ee3c12bbe3209b80b263619189a70090.png

 

多线程UDP网络程序

 

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;
​
public class TT{
    public static void main(String[] args) {
        new Receive().start();
        new Send().start();
    }
}
class Receive extends Thread{
    public void run(){
        try {
            DatagramSocket socket=new DatagramSocket(6666);
            DatagramPacket packet=new DatagramPacket(new byte[1024], 1024);
​
            while(true){
                socket.receive(packet);
                byte[] arr=packet.getData();
            int len=packet.getLength();
            String ip=packet.getAddress().getHostAddress();
                System.out.println(ip+":"+new String(arr,0,len));
​
​
            }
​
        }catch(IOException e){
            e.printStackTrace();
​
        }
    }
}
class Send extends Thread{
    public void run(){
        try {
            DatagramSocket socket=new DatagramSocket();
            Scanner sc=new Scanner(System.in);
            while(true){
                String ip=sc.nextLine();
                if("quiet".equals(ip)){
                    break;
                }
                DatagramPacket packet=new DatagramPacket(ip.getBytes(),ip.getBytes().length, InetAddress.getByName("BF-201911291316"),6666);
           socket.send(packet);
                socket.close();
            }
        }catch (IOException e
        ){
            System.out.println(e);
        }
​
    }
}

 

e678d5f21a279c5737ed42f78b94665f.png

 

 

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值