JavaNIO-一个Socket通信案例

一)Socket & ServerSocket

概述:

1、Socket该类实现客户端套接字(也称为“套接字”)。套接字是两台机器之间通讯的端点。

2、ServerSocket类实现了服务器套接字。服务器套接字等待通过网络进入的请求。它根据该请求执行一些操作,然后可能将结果返回给请求者。

 

初始化构造方法:

1、ServerSocket()

创建未绑定的服务器套接字。

2、ServerSocket(int port)

创建绑定到指定端口的服务器套接字。

 

3、ServerSocket(int port, int backlog)

创建服务器套接字并将其绑定到指定的本地端口号,并指定了积压。

4、ServerSocket(int port, int backlog, InetAddress bindAddr)

创建一个具有指定端口的服务器,侦听backlog和本地IP地址绑定。

 

二)服务端

实现步骤:

1、创建一个ServerSocket对象,并绑定一个端口号。

2、通过accept()方法监听ServerSocket,并获取Socket

3、获取客户端的输入流,并打印到控制台。

4、也可以从服务端写数据,发送到客户端(可选)。

5、关闭Socket和流。

 

源码实现:

package com.oysept.socket;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * 服务端
 * @author ouyangjun
 */
public class MsgServer {
	
    /**
     * 初始化服务端ServerSocket
     * @return
     */
    public ServerSocket initServer() {
        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(8765);
            return serverSocket;
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
	
    /**
     * 监听
     * @param serverSocket
     */
    public void server(ServerSocket serverSocket) {
        Socket socket = null;
        InputStream in = null;
        BufferedInputStream bufIn = null;
        try {
            while (true) {
                // 监听socket
                socket = serverSocket.accept();
				
                // 输入流
                in = socket.getInputStream();
                // 缓存流
                bufIn = new BufferedInputStream(in);
				
                byte[] bytes = new byte[1024];
				
                int b = 0;
                while((b = bufIn.read(bytes)) != -1) {
                    System.out.println("接收到客户端的消息为: " + new String(bytes, 0, b));
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (bufIn != null) {
                    bufIn.close();
                }
                if (in != null) {
                    in.close();
                }
                if (socket != null) {
                    socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        MsgServer s = new MsgServer();
        s.server(s.initServer()); // 启动服务端
    }
}

 

二)客户端

实现步骤:

1、创建一个Socket对象,并连接到一个端口号(和服务端的端口号一致)。

2、从控制台输入需要发送给服务端的消息。

3、把消息写入到SocketOutputStream流中。

4、关闭Socket和流。

 

源码实现:

package com.oysept.socket;

import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Scanner;

/**
 * 客户端
 * @author ouyangjun
 */
public class MsgClient {

    /**
     * 初始化客户端Socket
     * @return
     */
    public void initClient() {
        Socket socket = null;
        Scanner scanner = null;
        OutputStream out = null;
        BufferedOutputStream bufOut = null;
        try {
            socket = new Socket();
            socket.connect(new InetSocketAddress("localhost", 8765));
			
            // 控制台输入
            scanner = new Scanner(System.in);
            String msg = "";
            do {
                System.out.println("请在控制台输入需要发送给服务端的消息(输入88退出): ");
                msg = scanner.next();
				
                // 获取socket的输出流,从客户端向服务端发送消息
                out = socket.getOutputStream();
                // 缓存流
                bufOut = new BufferedOutputStream(out);
                bufOut.write(msg.getBytes());
                bufOut.flush();
				
            } while (!"88".equals(msg));
			
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (bufOut != null) {
                    bufOut.close();
                }
                if (out != null) {
                    out.close();
                }
                if (scanner != null) {
                    scanner.close();
                }
                if (socket != null) {
                    socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
	
    public static void main(String[] args) {
        MsgClient c = new MsgClient();
        c.initClient(); // 启动客户端
    }
}

 

四)Socket功能测试

第一步:先启动服务端。

第二步:启动客户端。

第三步:从客户端发送消息到服务端,截图如下。

 

服务端控制台界面:

 

客户端控制台界面:

 

识别二维码关注个人微信公众号

本章完结,待续,欢迎转载!
 
本文说明:该文章属于原创,如需转载,请标明文章转载来源!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值