Java Socket应用

Java中的网络支持:

  • 针对网络通信的不同层次,Java提供的网络功能主要分为四大类:
    • InetAddress:用于标识网络上的硬件资源。
    • URL:统一资源定位符
    • Sockets:使用TCP协议实现网络通信的Socket相关的类
    • Datagrame:使用UDP协议,将数据保存在数据报中,通过网络进行通信。

基于TCP的Socket通信实现步骤

  • 服务器端:
    1. 创建ServerSocket,指定绑定的端口
    2. 调用accept方法开始监听,等待客户端的连接,返回Sockect对象
    3. 调用Socket对象的getInputStream方法,获取输入流,得到客户端发送的信息
    4. 处理信息
    5. 关闭输入输出流,socket,serversocket
  • 客户端:
    1. 创建客户端Socket,指定服务器地址和端口
    2. 调用Socket对象的getOutputStream方法,获得输出流
    3. 将输出流包装成字符流,并调用write方法,将信息写入流
    4. 调用flush方法完成传输
    5. 关闭socket输出流
    6. 关闭各种资源

服务器端:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 基于tcp协议通信,服务器端
 * @author sunqi
 *
 */
public class Tcp_Server {

    public static void main(String[] args) {
        try {
            //建立服务器socket
            ServerSocket serverSocket=new ServerSocket(8888);//指定端口号为8888的服务器socket
            System.out.println("服务器Socket已建立,等待客户端连接");
            Socket socket=null;
            int count=0;
            //调用accept监听
            while (true) {
                socket=serverSocket.accept();//等待客户端链接
                Tcp_ServerThread serverThread=new Tcp_ServerThread(socket);
                serverThread.start();
                count++;
                System.out.println("当前连接数量"+count);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;

/**
 * 服务器端线程
 * @author sunqi
 *
 */
public class Tcp_ServerThread extends Thread {

    Socket socket=null;

    public Tcp_ServerThread(Socket socket) {
        super();
        this.socket = socket;
    }

    public void run() {
        super.run();

        InputStream is=null;
        InputStreamReader isr=null;
        BufferedReader br=null;

        OutputStream os=null;
        PrintWriter pw=null;
        try {
            //获取输入流,读取客户端数据
            is = socket.getInputStream();
            isr = new InputStreamReader(is);
            br = new BufferedReader(isr);
            String info=null;
            while ((info=br.readLine())!=null) {
                System.out.println("客户端:"+info);
            }
            socket.shutdownInput();
            //获取输出流,向客户端发送数据
            os = socket.getOutputStream();
            pw = new PrintWriter(os);
            pw.write("欢迎您!");
            pw.flush();
            socket.shutdownOutput();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //关闭资源
        try {
            if(pw!=null)
                pw.close();
            if(os!=null)
                os.close();
            if(br!=null)
                br.close();
            if(isr!=null)
                isr.close();
            if(is!=null)
                is.close();
            if(socket!=null)
                socket.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

客户端:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * 基于tcp协议,客户端
 * @author sunqi
 *
 */
public class Tcp_Client {

    public static void main(String[] args) {
        try {
            //1.建立客户端socket,并连接指定端口
            Socket socket=new Socket("localhost", 8888);
            System.out.println("客户端socket建立");
            //2.获取输出流,向服务器发送数据
            OutputStream os=socket.getOutputStream();
            PrintWriter pw=new PrintWriter(os);//输出流包装成打印流
            pw.write("用户名:admin,密码:123");
            pw.flush();//刷新完成打印流传输
            socket.shutdownOutput();//关闭输出流
            //3.获取输入流,接收服务器数据
            InputStream is=socket.getInputStream();
            BufferedReader br=new BufferedReader(new InputStreamReader(is));
            String info=null;
            while ((info=br.readLine())!=null) {
                System.out.println("服务器:"+info);
            }
            socket.shutdownInput();
            //4.关闭资源
            br.close();
            is.close();
            pw.close();
            os.close();
            socket.close();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

基于UDP的Socket通信实现步骤

  • 服务器端:
    1. 创建DatagramSocket,指定端口号
    2. 创建DatagramPacket数据报用byte数组作为缓冲
    3. 调用DatagramSocket的receive方法等待接收客户端发送的数据信息
    4. 读取数据(对byte数组内容包装/处理)
  • 客户端:
    1. 调用InetAddress类的方法定义服务器的地址、端口号,初始化要发送的数据(存储在byte数组中)
    2. 创建DatagramPacket对象,并将byte数组包装到DatagramPacket中
    3. 创建DatagramSocket对象
    4. 调用DatagramSocket对象的send方法,参数:DatagramPacket对象,将信息发送

服务器端:

package Udp;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

/**
 * 基于UDP协议,服务器端
 * @author sunqi
 *
 */
public class Udp_Server {

    public static void main(String[] args) throws IOException {
        /**
         * 获取客户端数据
         */
        //1.建立socket
        DatagramSocket dsocket=new DatagramSocket(8800);
        System.out.println("服务器socket已建立");
        while (true) {
            byte[] data=new byte[1024];//存放客户端发送的信息
            //2.建立数据报,接收客户端数据
            DatagramPacket dPacket=new DatagramPacket(data, data.length);
            dsocket.receive(dPacket);//等待连接,服务器处于阻塞态
            new Udp_ServerThread(dsocket,dPacket,data).start();
        }
    }
}
package Udp;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class Udp_ServerThread extends Thread {

    DatagramSocket dsocket=null;
    DatagramPacket dPacket=null;
    byte[] data=null;

    public Udp_ServerThread(DatagramSocket dsocket,DatagramPacket dPacket, byte[] data) {
        super();
        this.dsocket = dsocket;
        this.dPacket=dPacket;
        this.data=data;
    }

    public void run() {
        try {
            super.run();
            String info=new String(data, 0, dPacket.getLength());
            System.out.println("客户端说:"+info);

            /**
             * 响应客户端
             */
            //1.获得客户端地址和端口号,初始化响应信息
            InetAddress address=dPacket.getAddress();
            int port=dPacket.getPort();
            byte[] data2="欢迎您!".getBytes();
            //2.创建数据报
            DatagramPacket packet=new DatagramPacket(data2, data2.length, address, port);
            //3.发送数据
            dsocket.send(packet);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

客户端:

package Udp;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
 * 基于UDP协议通信,客户端
 * @author sunqi
 *
 */

public class Udp_Client {

    public static void main(String[] args) throws IOException {
        /**
         * 向服务器发送数据
         */
        //1.指定服务器地址,端口号,要发送的数据
        InetAddress address=InetAddress.getByName("localhost");//通过服务器名称获取地址
        int port =8800;
        byte[] data="用户名:tom;密码:456".getBytes();
        //2.创建数据报
        DatagramPacket dpacket=new DatagramPacket(data, data.length,address,port);
        //3.创建socket
        DatagramSocket dSocket=new DatagramSocket();
        //4.发送数据
        dSocket.send(dpacket);

        /**
         * 获取服务器响应
         */
        //1.创建字节数组,存储响应数据
        byte[] data2=new byte[1024];
        DatagramPacket packet=new DatagramPacket(data2, data2.length);
        //2.接收响应
        dSocket.receive(packet);
        //3.获取数据
        String info=new String(data2, 0, packet.getLength());
        System.out.println("服务器说:"+info);

        dSocket.close();
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值