Socket通信

HTTP连接是采用“请求–响应”的方式,而Socket是在双方建立起连接后就可以直接进行数据的传输,不需要每次向服务器发送请求。
Socket连接包含5个必须的信息:
1、连接协议;
2、本地主机IP地址;
3、本地进程的协议端口;
4、远程主机的IP地址;
5、远程进程的协议端口。

Java中网络通信方式:
一、基于TCP协议的Socket实现原理:
(1)客户端:

public class TCPClient {
    public static void main(String[] args) {
        try {
            // 创建一个Socket对象,指定服务器端的IP和端口
            Socket socket = new Socket("192.168.1.1", 9090);
            // 使用InputStream读取硬盘上的文件
            InputStream is = new FileInputStream("D://test/my_file.text");
            // 从Socket中得到OutputStream
            OutputStream os = socket.getOutputStream();
            byte b[] = new byte[1024];
            int len = 0;
            // 取出InputStream中的数据,并写入到OutputStream中
            while ((len = is.read(b)) != -1) {
                os.write(b, 0, len);
            }
            os.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

(2)服务器端:

public class TCPServer {
    public static void main(String[] args) {

        ServerSocket serverSocket = null;
        try {
            // 创建一个ServerSocket对象,并让Socket在9090端口监听
            serverSocket = new ServerSocket(9090);

            // 接收客户端发送的请求,如果客户端没有发送请求,那么该线程处于阻塞状态
            Socket socket = serverSocket.accept();

            // 从Socket中得到InputStream对象
            InputStream is = socket.getInputStream();

            byte b[] = new byte[1024];
            int len = 0;

            // 从InputStream中取出客户端发送的数据,并写入到OutputStream中
            while ((len = is.read(b)) != -1) {
                System.out.println(new String(b, 0, len));
            }
        } catch (IOException e) {
        }
    }
}

二、基于UDP协议的数据传输实现原理:
(1)客户端:

public class UDPClient {
    public static void main(String[] args) {
        try {
            // 创建一个DatagramSocket对象
            DatagramSocket dSocket = new DatagramSocket(5050);

            // 创建一个InetAddress对象,类似于一个网络的发送地址
            InetAddress iAddress = InetAddress.getByName("192.168.1.1");

            String s = "Hello World";
            // 将要传输的数据转为字节码
            byte data[] = s.getBytes();

            // 创建一个DatagramPacket对象,并指定地址和端口号
            DatagramPacket dPacket = new DatagramPacket(data, data.length, iAddress, 5050);

            // 调用DatagramSocket对象的send()方法,发送数据
            dSocket.send(dPacket);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

(2)服务器端:

public class UDPService {
    public static void main(String[] args) {
        DatagramSocket dSocket;
        try {
            // 创建一个DatagramSocket对象,并指定端口号
            dSocket = new DatagramSocket(5050);

            // 创建一个空的DatagramPacket对象
            byte data[] = new byte[1024];

            // 接收客户端发送的数据,如果客户端没有发送数据,那么该线程处于阻塞状态
            DatagramPacket dPacket = new DatagramPacket(data, data.length);
            dSocket.receive(dPacket);

            String result = new String(dPacket.getData(), dPacket.getOffset(), dPacket.getLength());
            System.out.println("result:" + result);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值