文档章节

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

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

 

© 著作权归作者所有

最爱肉肉
粉丝 7
博文 66
码字总数 45188
作品 0
深圳
高级程序员
私信 提问
加载中

评论(0)

基于java实现的一个hello/hi的简单的网络聊天程序

1、 Socket的工作流程 Socket实质上提供了进程通信的端点。进程通信之前,双方首先必须各自创建一个端点,否则是没有办法建立联系并相互通信的。正如打电话之前,双方必须各自拥有一台电话机...

osc_jvfdkl2k
2019/12/02
12
0
Java-Runoob-高级编程:Java 网络编程

ylbtech-Java-Runoob-高级编程:Java 网络编程 1.返回顶部 1、 Java 网络编程 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。 java.net 包中 J2SE 的 API ...

osc_84itep82
2019/04/01
6
0
Socket Programming

Socket编程就是网络编程,通过网络进行两台主机之间的交互 Windows/Linux平台C++版教程 1socket是什么 2套接字有哪些类型 3面向连接和无连接到底有什么区别 4OSI网络七层模型 5TCP/IP协议族 ...

osc_kalanll2
2019/09/15
5
0
Java网络编程——Socket

网络是连接不同计算机的媒介,不同的计算机依靠网络来互相通信,即传递数据。 Java中与网络编程相关的部分主要是Socket(套接字),它作为一种抽象的结构,实现了与通信相关的各类方法,构成...

osc_3www0d3o
2018/07/07
6
0
20165223《Java程序设计》第九周Java学习总结

教材学习内容总结 第13章- URL类 InetAddress类 套接字 UDP数据报 广播数据报 Java远程调用(RMI) 教材学习中的问题和解决过程 1. URL类 URL类构造方法: 使用字符串初始化一个URL对象:pub...

osc_wpln0ly9
2018/04/29
1
0

没有更多内容

加载失败,请刷新页面

加载更多

Apache Jmeter 入门

Jmeter是一款优秀的开源测试工具, 是每个资深测试工程师,必须掌握的测试工具,熟练使用Jmeter能大大提高工作效率。 本文将通过一个实际的测试例子, 来讲解Jmeter的基本用法。 Jmeter 介绍...

JEECG开源社区
11分钟前
21
0
Spring Cloud 系列之 Apollo 配置中心(二)

本篇文章为系列文章,未读第一集的同学请猛戳这里:Spring Cloud 系列之 Apollo 配置中心(一) 本篇文章讲解 Apollo 部门管理、用户管理、配置管理、集群管理。      点击链接观看:Apo...

哈喽沃德先生
12分钟前
16
0
原生ES-Module

首先是各大浏览器从何时开始支持module的: Safari 10.1 Chrome 61 Firefox 54 (有可能需要你在about:config页面设置启用dom.moduleScripts.enabled) Edge 16 使用方式 首先在使用上,唯一的...

东东笔记
13分钟前
4
0
DevExpress Winforms使用技巧与窍门集合(2020年5月汇总)

下载DevExpress v20.1完整版 DevExpress Winforms Controls 内置140多个UI控件和库,完美构建流畅、美观且易于使用的应用程序。想要体验?点击下载>> 本文中包含一些示例和调整WinForms UI组...

FILA6666
14分钟前
18
0
SwitchGlass for mac 1.4(331) 系统应用快速启动

mac系统应用怎么才能快速启动?这时候你需要一款mac系统应用快速启动软件!SwitchGlass Mac版是Mac电脑上的一款系统应用快速启动工具。SwitchGlass Mac版为你的Mac应用增加了一个专用的应用程...

麦克W
17分钟前
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部