Java Socket应用

来源:互联网 发布:vb中truefalse什么意思 编辑:程序博客网 时间:2024/06/06 06:51

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();    }}
0 0
原创粉丝点击