文档章节

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

最爱肉肉
 最爱肉肉
发布于 2016/10/04 21:32
字数 910
阅读 22
收藏 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对象的存储,以及遍历实现通知功能.

 

© 著作权归作者所有

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

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

有事没事
2014/12/05
0
0
【转】Flex与Java的Socket通信

一、准备: 服务端:JDK1.5 (这个不用介绍了吧?) 服务端IDE:eclipse (它的主页) 客户端:FLEX 3 (Adobe® Flex® 3 是用于构建和维护在所有主要浏览器、桌面和操作系统一致地部署的极...

小编辑
2010/03/05
2.4K
0
java socket编程实例代码讲解

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

不成熟的男人
2015/08/03
0
0
java基础专栏—java网络编程

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

T-newcomer
2017/10/25
0
0
12.5-全栈Java笔记:Java网络编程(三)

上节回顾:在学习了Socket在建立客户端和服务器单项通讯中,分别创建独立的Socket,并通过Socket的属性。 那么如何将两个Socket进行连接,从而达到客户端和服务器之间建立输入输出流进行通信...

全栈Java
2018/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何限制用户仅通过HTTPS方式访问OSS?

一、当前存在的问题 当前OSS支持用户使用HTTPS/HTTP协议访问Bucket。但由于HTTP存在安全漏洞。大型企业客户都要求使用HTTPS方式访问OSS,并且拒绝HTTP访问请求。 目前OSS可以通过RAM policy方...

阿里云官方博客
13分钟前
0
0
详解深度学习之经典网络架构——LeNet

一、基本简介 LeNet-5出自论文Gradient-Based Learning Applied to Document Recognition,是一种用于手写体字符识别的非常高效的卷积神经网络。 二、LeNet网络的基本结构 LeNet5 这个网络虽...

AI女神
17分钟前
0
0
日志服务Python消费组实战(二):实时分发数据

场景目标 使用日志服务的Web-tracking、logtail(文件极简)、syslog等收集上来的日志经常存在各种各样的格式,我们需要针对特定的日志(例如topic)进行一定的分发到特定的logstore中处理和...

阿里云云栖社区
17分钟前
1
0
LVM 增加磁盘扩容

sudo parted /dev/sdeparted> mklabel gptparted> mkpart primary lvm ext4 %0 %100parted> printsudo lvmlvm> pvcreate /dev/sde1lvm> vgextend vg-data /dev/sde1lvm> lve......

仪山湖
20分钟前
0
0
Linux挂载本地iso镜像,不联网使用yum命令

上传iso镜像文件到/mnt 目录下 在/mnt目录下创建Server目录 mkdir Server 备份 /etc/yum.repos.d/目录下的repo文件 cd /etc/yum.repos.dmkdir repobakmv *.repo repobak/ 挂载本地iso文件...

AustinYe
22分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部