Java web

Java 网络编程

2018-12-10  本文已影响0人  dawsonenjoy

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定位到资源内容

上一篇 下一篇

猜你喜欢

热点阅读