美文网首页Java web
Java 网络编程

Java 网络编程

作者: dawsonenjoy | 来源:发表于2018-12-10 15:40 被阅读0次

    IP地址

    java.net下提供了InetAddress用来保存IP地址,但该类没有向外提供构造方法,因此需要通过其提供的静态方法来获取该类对象,举例:

    InetAddress ip = InetAddress.getByName("xxx");  //通过主机名获取
    System.out.println(ip); //主机名/保留地址
    

    url编码和解码

    通过URLEncoder.encode(String, Parser)进行编码,使用URLDecoder.decode(String, Parser)进行解码,举例:

    String es = URLEncoder.encode("你好", "utf-8");
    String ds = URLDecoder.decode(es, "utf-8");
    System.out.println(es); //%E4%BD%A0%E5%A5%BD
    System.out.println(ds); //你好
    

    TCP通信

    java.net下有SocketServerSocket类,分别用来实现clientserver端。

    步骤

    1.在服务端中通过ServerSocket(port)来绑定端口,然后在客户端中通过Socket(ip, port)来连接服务端。
    2.在服务端中通过accept()来等待接收客户端连接,并保存到Socket对象中
    3.客户端和服务端之间的通信需要先获取输入输出流(getInputStream()/getOutputStream()),然后通过read()/write()方法进行收发
    4.最后记得使用close()方法关闭客户端和服务端的连接

    最简单TCP通信
    Server端
    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class ServerTest {
        public static void main(String[] args) throws Exception{
            ServerSocket server = new ServerSocket(6666);
            while(true){
                Socket client = server.accept();
                System.out.println("新连接!");
                DataInputStream dis = new DataInputStream(client.getInputStream());
                System.out.println(dis.readUTF());
                dis.close();
                client.close();
            }
        }
    }
    
    Client端
    import java.io.*;
    import java.net.Socket;
    
    public class ClientTest{
        public static void main(String[] args) throws Exception {
            Socket client = new Socket("127.0.0.1", 6666);
            OutputStream ops = client.getOutputStream();
            DataOutputStream dos = new DataOutputStream(ops);
            dos.writeUTF("连接成功!");
            dos.flush();
            dos.close();
            client.close();
        }
    }
    
    多线程服务端

    只需要在accept()接收到新连接时启动一个新线程即可,举例:

    import java.io.DataInputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class ServerTest {
        public static void main(String[] args) throws Exception {
            ServerSocket server = new ServerSocket(6666);
            while (true) {
                final Socket client = server.accept();
                System.out.println("新连接!");
                new Thread() { // 启动一个新线程
                    public void run() {
                        try {
                            DataInputStream dis = new DataInputStream(
                                    client.getInputStream());
                            String rs;
                            while (true) {
    
                                if ((rs = dis.readUTF()).equals("-1")) {
                                    client.close();
                                }
                                System.out.println(rs);
                            }
                        } catch (Exception e) {
                        }
                    }
                }.start();
            }
        }
    }
    

    UDP通信

    UDP通信时,通过DatagramPacket类来构造数据报包,然后收发两端都实例化一个DatagramSocket来发送和接收数据报包。注意只有TCP分C/S端,在UDP里只有发送和接收端,且是可以互换的。

    最简单的UDP通信
    接收端
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    
    public class ServerTest {
        public static void main(String[] args) throws Exception{
            byte buf[] = new byte[1024];
            DatagramPacket dp = new DatagramPacket(buf, buf.length);
            DatagramSocket ds = new DatagramSocket(6666);
            while(true){
                ds.receive(dp);
                System.out.println(new String(buf, 0, dp.getLength()));
            }
        }
    }
    
    发送端
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetSocketAddress;
    
    public class ClientTest{
        public static void main(String[] args) throws Exception {
            byte buf[] = (new String("message!")).getBytes();
            DatagramPacket dp = new DatagramPacket(buf, buf.length, new InetSocketAddress("127.0.0.1", 6666));  //发送到的IP:PORT
            DatagramSocket ds = new DatagramSocket(9999);   //从9999端口发送
            ds.send(dp);
            ds.close();
        }
    }
    

    URL编程

    给资源定位好后,可以通过实例化url,从而可以通过该url定位到资源内容

    相关文章

      网友评论

        本文标题:Java 网络编程

        本文链接:https://www.haomeiwen.com/subject/dbthhqtx.html