文档章节

Java 的 Socket(套接字)编程简易教程

最爱肉肉
 最爱肉肉
发布于 2016/10/04 21:32
字数 910
阅读 19
收藏 0

首先写一个ServerSocket(服务器端的监听类)用于监听Socket连接,每新产生一个对话,都交由Socket的实例去处理.

package com.pan.socket.service;

import javax.net.ServerSocketFactory;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * Created by pan on 2016/10/4.
 */
public class MyServer extends Thread {

    public void run() {
        try {
            //创建serverSocket,并绑定端口.
            ServerSocket serverSocket = ServerSocketFactory.getDefault().createServerSocket(2354);
            System.out.println("服务启动成功,正在监听端口2354");
            //接受客户端请求
            while (true) {
                Socket accept = serverSocket.accept();
                //每新增一个对话,交给一个Socket的实例去处理
                new MySocket(accept).start();
                System.out.println("客户端已经连接...");
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

然后,编写Socket服务端实例,用于与客户端的通信

package com.pan.socket.service;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

/**
 * Created by pan on 2016/10/4.
 */
public class MySocket extends Thread {
    private Socket socket;

    //实例化传入socket对象
    public MySocket(Socket socket) {
        this.socket = socket;
    }


    public void run() {
        //像客户端输出提示信息
        write("已经连接..");
        //读取客户端的输入
        reader();
    }

    /**
     * 读取客户端输入的数据
     */
    private void reader() {
        try {
            //接受客户端数据
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"), MAX_PRIORITY);
            String line;
            //循环读取客户端的数据
            while ((line = reader.readLine()) != null) {
                //退出指令
                if (!line.equalsIgnoreCase("exit")) {
                    System.out.println("客户端输入:" + line);
                    //向客户端写入
                    write(line);
                } else {
                    write("正在退出...");
                    System.out.println("一个客户端退出");
                    break;
                }
            }
            //关闭流
            reader.close();
        } catch (IOException e) {
            System.out.println("失去响应");
        }
    }

    /**
     * 向客户端写入数据
     */
    void write(String str) {
        try {
            socket.getOutputStream().write((str + "\n").getBytes("UTF-8"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

然后是启动服务端的类,用于启动服务.

package com.pan.socket.service;

/**
 * Created by pan on 2016/10/4.
 */
public class Main {

    public static void main(String[] args) {
        new MyServer().start();
    }

}

第二部分:客户端代码

客户端首先需要新建一个类,用于连接服务端.并接受服务端信息,以及向服务端发送消息.客户端不需要监听Socket,所以相比于服务端要少一个监听的类.

连接服务端并执行信息处理类

package com.pan.socket.client;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.Scanner;

/**
 * Created by pan on 2016/10/4.
 */
public class ClientSocket extends Thread {
    private Socket socket;

    public void run() {
        try {
            socket = new Socket("127.0.0.1", 2354);
            new Thread() {
                public void run() {
                    //接受用户输入
                    Scanner scanner = new Scanner(System.in);
                    String inStr;
                    while ((inStr = scanner.nextLine()) != null) {
                        write(inStr);
                        //退出指令
                        if (inStr.equalsIgnoreCase("exit")) {
                            System.out.println("客户端退出");
                            break;
                        }
                    }
                    //输入流关闭
                    scanner.close();
                }
            }.start();
            //读取服务端消息
            reader();

        } catch (IOException e) {
            System.out.println("连接失败");
        }
    }

    /**
     * 读取服务端数据
     */
    private void reader() {
        try {
            //接受客户端数据
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"), MAX_PRIORITY);
            String line;
            //循环读取服务端的数据
            while ((line = reader.readLine()) != null) {
                System.out.println("服务端:" + line);
            }
            //关闭流
            reader.close();
        } catch (IOException e) {
            System.out.println("失去响应");
        }
    }

    /**
     * 向服务端些数据
     */
    void write(String str) {
        try {
            socket.getOutputStream().write((str + "\n").getBytes("UTF-8"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


}

ps:这里采用控制台输入,因为两个死循环,所以采用new Thread(){} ;新建一个线程去处理循环监听控制台输入,主线程循环监听服务端数据.

2.启动客户端类

package com.pan.socket.client;

/**
 * Created by pan on 2016/10/4.
 */
public class Main {

    public static void main(String[] args) {
        new ClientSocket().start();
    }
}

3.测试:

启动服务端,然后在启动客户端,输入一些数据.

4.结果

服务端:

服务启动成功,正在监听端口2354
客户端已经连接...
客户端输入:88
客户端输入:萨大幅
客户端输入:sa
一个客户端退出

客户端:

服务端:已经连接..
88
服务端:88
萨大幅
服务端:萨大幅
sa
服务端:sa
exit
客户端退出
服务端:正在退出...

Process finished with exit code 0

 

题外:

    如果需要通知功能,那么服务端添加一个用于管理MySocket的类,在该类下来实现MySocket对象的存储,以及遍历实现通知功能.

 

© 著作权归作者所有

共有 人打赏支持
最爱肉肉
粉丝 3
博文 52
码字总数 35131
作品 0
深圳
程序员
私信 提问
eclipse远程debug,java项目

首先java项目要支付可远程调试得到启动时加入参数 启动远程调试 启用JMX,远程性能观察 eclipse配置 其中:host为远程java程序提供远程调试的IP,post为远程java程序提供远程调试的端口 使用 ...

有事没事
2014/12/05
0
0
java socket编程实例代码讲解

1、所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。 操作java socket时用到的最多的三个方法为: ac...

不成熟的男人
2015/08/03
0
0
select,iocp,epoll,kqueue及各种I/O复用机制

首先,介绍几种常见的I/O模型及其区别,如下: blocking I/O nonblocking I/O I/O multiplexing (select and poll) signal driven I/O (SIGIO) asynchronous I/O (the POSIX aio_functions)......

大道至簡
2014/08/04
0
1
java基础专栏—java网络编程

java网络编程 在网络成层中TCP对应于四层 通常是对网络连接设备的驱动协议,例如对光纤和都对网线的驱动不一样 TCP/IP协议的核心,他用于将数据分组 包括TCP,UDP 主要是负责应用程序的协议。...

T-newcomer
2017/10/25
0
0
JAVA基础再回首(二十八)——网络编程概述、IP地址、端口号、TCP和UDP协议、Socket、UDP传输、多线程UDP聊天

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m366917/article/details/52723439 JAVA基础再回首(二十八)——网络编程概述、IP地址、端口号、TCP和UDP协议...

Aduroidpc
2016/10/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

利用cefSharp实现网页自动注册登录的需要注册的一些事项

最近朋友有个需要自动注册登录点击的事,我帮着写了写,好久没写过这东西了,在写的过程中总结了需要注意的一些事项。 一、换IP之后要测试一下速度,我目前用的最简单的测试方法就是20-30秒加...

我退而结网
17分钟前
1
0
Go语言中使用 BoltDB数据库

boltdb 是使用Go语言编写的开源的键值对数据库,Github的地址如下: https://github.com/boltdb/bolt boltdb 存储数据时 key 和 value 都要求是字节数据,此处需要使用到 序列化和反序列化。...

Oo若离oO
17分钟前
1
0
zookeeper分布式锁

//lock 锁 定义分布式锁public interface Lock {//获取锁public void getLock();//释放锁public void unLock();} public abstract class ZookeeperAbstractLock implements Loc......

熊猫你好
24分钟前
0
0
mysql_事务隔离机制

事务隔离机制 事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在mysql中,事务支持是在引擎层实现的。mysql是一个支持多引擎的系统,但并不是所有引擎都支持事务,比如mysql...

grace_233
27分钟前
0
0
不学无数——Java中IO和NIO

JAVA中的I/O和NIO I/O 问题是任何编程语言都无法回避的问题,可以说 I/O 问题是整个人机交互的核心问题,因为 I/O 是机器获取和交换信息的主要渠道。在当今这个数据大爆炸时代,I/O 问题尤其...

不学无数的程序员
33分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部