JAVA 网络编程

本文介绍了Java中的网络编程基础知识,包括InetAddress、Socket和URL类的使用。详细阐述了TCP和UDP两种传输协议的工作原理,并提供了TCP协议下客户端向服务器发送消息的示例代码,以及UDP协议下多线程互发消息的示例代码。通过这些示例,读者可以深入理解Java网络编程的基本操作。

一、核心类

1. InetAddress:IP地址类

使用静态方法InetAddress.getByName(String s)创建,不能new。其中s可以是IP地址、域名或"localhost"。

2.Socket:套接字类

构造方法: new Socket(InetAddress inetAddress, int port);

3.URL:URL类

结构(协议://IP地址:端口/项目名/资源)

二、两种传输协议

1.TCP协议

传输前需要进行连接,采用客户端/服务器模式通信。

  • 服务器端启动步骤:
    • 创建socket打开本地端口:new ServerSocket(int port)
    • 阻塞监听连接:socket.accept()
    • 获得流:socket.getOutputStream()
    • 关闭服务:outputStream.close();accept.close();socket.close();
  • 客户端启动步骤:
    • 创建socket指明服务器IP,端口号: new Socket(InetAddress inetAddress, int port)
    • 获得流:socket.getInputStream()
    • 关闭服务:inputStream.close();socket.close()

2.UDP协议

无需连接,尽最大可能交付,启动步骤如下:

  • 建立socket,注明本机socket使用端口:new DatagramSocket(int port);
  • 建立package(发送内容,起始下标,内容长度,目标IP,目标端口):new DatagramPackage(byte[] b,int off,int length,InetAddress inetAddress, int port)
  • 发送package:package.send()
  • 接收package(接收缓冲区,起始位置,内容长度):new DatagramPacket(byte[] b, int off, int package.getLength())
  • 关闭socket:socket.close

三、示例

使用TCP协议下由客户端向主机发送消息

package CSTest;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Service {
    public static void main(String[] args) throws Exception{
        //启动服务器
        ServerSocket serverSocket = new ServerSocket(9999);
        //阻塞监听连接
        Socket accept = serverSocket.accept();
        //获取流
        InputStream is = accept.getInputStream();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] b = new byte[1024];
        int len;
        while((len = is.read(b)) != -1){
            baos.write(b,0,len);
        }
        System.out.println(baos.toString());
        //关闭服务
        baos.close();
        is.close();
        accept.close();
        serverSocket.close();
    }
}
package CSTest;

import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class Client{
    public static void main(String[] args) throws Exception{
        //创建连接socket
        InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
        int port = 9999;
        Socket socket = new Socket(inetAddress, port);

        //发送消息
        OutputStream os = socket.getOutputStream();
        for (int i = 0; i < 2; i++) {
            os.write("发送消息至服务器\n".getBytes(StandardCharsets.UTF_8));
        }
        os.close();
    }
}

使用UDP协议多线程互发消息

package ChatTest;

import java.io.*;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;

public class ChatClient01 {
    public static int flag = 1;
    public static void main(String[] args) throws Exception{
        DatagramSocket socket = new DatagramSocket(6666);

        //发送线程
        Thread send = new Thread(()->{
            String s = null;
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            while(ChatClient01.flag == 1) {
                try {
                    s = br.readLine();
                    byte[] bytes = s.getBytes(StandardCharsets.UTF_8);
                    DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length, InetAddress.getByName("localhost"), 8888);
                    socket.send(packet);
                } catch (IOException e) {
                    e.printStackTrace();
                }finally {
                    if(s.compareTo("bye") == 0){
                        ChatClient01.flag = 0;
                        socket.close();
                        break;
                    }
                }
            }
        });

        //接收线程
        Thread receive = new Thread(()->{
            byte[] bytes = new byte[1024];
            DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length);
            String s = null;
            while(ChatClient01.flag == 1){
                try {
                    socket.receive(packet);
                    s = new String(packet.getData(), 0, packet.getLength());
                    System.out.println(s);
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if(ChatClient01.flag == 0){
                        break;
                    }
                }
            }
        });

        //打开线程
        send.start();
        receive.start();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值